1. 基本信息
姓名 | 学号 | 班级 | 网络是否连通 | 能否正常抓取报文 |
---|---|---|---|---|
是 | 是 |
2. 建立网络拓扑结构
3. 配置网络参数
3.1 客户端
3.2 服务端
4. 抓取报文并分析
4.1 概览
为上述报文进行归类,哪些序号的报文是做什么,举例:
-
报文
1-3
:DNS域名解析 -
报文
4-6
和报文8
:TCP连接建立 -
报文
7
和报文9-11
:HTTP请求报文,响应报文 -
报文
12-15
:TCP断开连接
再对上述的分门别类展开阐述。每一个报文每个字段是什么含义。以下以DNS报文为例。
4.2 DNS域名解析
客户端向本地域名服务器发送DNS请求报文,域名服务器给客户端返回DNS响应报文。
4.2.1 DNS请求报文
基础结构
每个字段含义如下:
(1)Transaction ID: 0x4350
会话标识(2个字节),是DNS报文的标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应。
(2)标志
标志(2个字节),
-
QR
(1位),报文没有显示,查询/响应标志,0表示查询,1表示响应 -
OPCODE: 0x01
,操作码,0x01
表示 -
AA
表示授权回答 -
TC
表示可截断的 -
RD
表示期望递归 -
Ra
表示可用递归 -
rcode:0x0
表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误
(3)QDCOUND: 1
表示问题的数量
(4)ANCOUND: 1
表示回答的数量
(5)NSCOUND: 0
表示权威RR数
(6)ARCOUND: 0
表示附加RR数
问题区域(Queries)
每个字段含义如下:
(1)Name: ruixin.cai
表示要查询的域名信息。其中ruixin为二级域名,cai为一级域名
(2)TYPE
表示查询类型,CLASS
表示查询类
(3)TTL
表示生存时间,即各地的DNS缓存服务器多久去权威域名解析服务器获取一次域名的解析IP,记录了该报文过期时间为86400s
(4)LENGTH
表示数据长度
4.2.1 DNS响应报文
回答区域(Answer)
每个字段含义如下:
(1)Name: ruixin.cai
表示要查询的域名信息。其中ruixin为二级域名,cai为一级域名
(2)TYPE
表示查询类型,CLASS
表示查询类
(3)TTL
表示生存时间,即各地的DNS缓存服务器多久去权威域名解析服务器获取一次域名的解析IP,记录了该报文过期时间为86400s
(4)LENGTH
表示数据长度,IP
为需要访问的域名的地址
4.2.3 UDP
SOURCE PORT:53
源端口号,DNS 协议运行在 UDP 协议之上,使用端口号 53 。
DESTINATION PORT:1025
目的端口号
LENGTH:0X003a
UDP长度
CHECKSUM:0
UDP检验和
DATA
数据
4.3 TCP连接建立
4.3.1 概述
-
序号和确认号:是TCP可靠传输的关键部分。序号是本报文段发送的数据组的第一个字节的序号。在TCP传送的流中,每一个字节一个序号。e.g.一个报文段的序号为300,此报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性。确认号,即ACK,指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到。确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0。
-
ACK:确认序号标志,为1时表示确认号有效,为0表示报文中不含确认信息,忽略确认号字段。
-
SYN:同步序号,用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。
-
FIN:"finished"简写。表示发送者以及发送完数据。通常用在发送者发送完数据的最后一个包中。
4.3.2 连接请求报文
首先 Client 端发送连接请求报文。
4.3.3 连接接受报文
Server 段接受连接后回复 ACK 报文,并为这次连接分配资源。
4.3.4 第三次握手
Client 端接收到 ACK 报文后也向 Server 段发生 ACK 报文,并分配资源,这样 TCP 连接就建立了。
4.4 HTTP
分析HTTP请求和响应报文,除了关注HTTP请求和响应报文格式,还要关注被封装成TCP报文的序号、确认号和标志位的演变。
4.4.1 HTTP请求报文
HTTP Data:Accept-Language: en-us//表示用户希望优先得到英文版本的文档 Accept: */* //表示告知服务器客户端会接受与其请求相符的任意媒体类型 Connection: close //表示告诉服务器发送完请求的文档后就可释放连接 Host: ruixin.cai //表示主机的域名
4.4.2 HTTP响应报文
HTTP Data:Connection: close //表示告诉服务器发送完请求的文档后就可释放连接 Content-Length: 369 //表示描述HTTP消息实体的传输长度为369 Content-Type: text/html //表示具体请求中的媒体类型为HTML格式 Server: PT-Server/5.2 //表示服务器的名称和版本
4.4.3 IP数据报
-
VER:4:ip报文中,版本占了4位,用来表示该协议采用的是那一个版本的ip,相同版本的ip才能进行通信。一般此处的值为4,表示ipv4
-
IHL:5:该字段用四位表示,表示整个ip包头的长度,其中数的单位是4字节。即二进制数0000-1111(十进制数0-15),其中一个最小长度为0字节,最大长度为60字节。一般来说此处的值为0101,表示头长度为20字节。
-
DSCP:0x00:Tos服务字段,该字段用8位表示。该字段一般情况下不使用。
-
TL:491:该字段表示整个ip报文的长度,单位是1字节。能表示的最大字节为2^16-1=65535字节。不过由于链路层的MTU限制。超过1480字节后就会被分片(以太帧MTU为1500的情况下,除去20字节的包头)
-
ID:0x0009:该字段是ip软件实现的时候自动产生的,该字段的目的不是为了接受方的按序接受而设置的,而是在ip分片以后,用来标识同一片分片的。方便ip分片的重组。
-
FLAGS:0:该字段是与ip分片有关的。其中有三位,但只有两位是有效的,分别为MF,DF,MF。MF标识后面是否还有分片,为1时,表示后面还有分片。DF标识是否能分片,为0表示可以分片。
-
FRAG OFFSET:0x000 :该字段是与ip分片后,相应的ip片在总的ip片的位置。该字段的单位是8字节。比如,一个长度为4000字节的ip报文,到达路由器。
-
TTL:128 :该片表示生存周期,该值占8位。ip分片每经过一个路由器该值减一,它的出现是为了防止路由环路,浪费带宽的问题。
-
PRO:0x06 :该值标识上层的协议。
-
CHKSUM:该值是对整个数据包的包头进行的校验。占16位。
-
SRC IP:192.168.1.7 :源地址。
-
DST IP:192.168.1.8 :目的地址。
-
DATA:数据。
4.5 TCP连接释放
4.5.1概述
4.5.2 断开连接请求报文
Clien发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
4.5.3 服务端接收报文
Server收到FIN后,发送一个ACK给Client,Server进入CLOSE_WAIT状态。
Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
正在上传…重新上传取消
4.3.4 第四次挥手
Client收到FIN后,Client进入TIME_WAIT状态,发送ACK给Server,Server进入CLOSED状态,完成四次挥手。
正在上传…重新上传取消
5. 实验过程中遇到的问题及解决方法
为什么连接的时候是三次握手,关闭的时候却是四次握手?
①因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。 ②但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,“你发的FIN报文我收到了”。 ③只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么TCP头定义不是6位吗?但在报文中却有十位?
当前,为TCP头部定义了8位的字段,尽管有些老的实现只能理解最后的6位。
0b表示这段数字是二进制。
CWR : 拥塞窗口减(发送方减低它的发送速率) ECE : ECN回显(发送方接收到了一个更早的拥塞通告) URG : 紧急(紧急指针字段有效,很少被用到) ACK : 确认 (确认号字段有效,连接建立后一般都处于启用状态) PSH : 推送 (接收方应尽快给应用程序发送这个数据,目前没有可靠地实现或者用到) RST : 重置连接 (当前连接关闭,重新建立新的连接) SYN : 用于初始化一个连接的同步序列号 FIN : 该报文的发送方已经没有数据要发送,请求对方关闭当前连接。