网络层协议数据的捕获与分析
本次实验主要包含下列内容:
通过本实验学生可以深入理解分层体系结构,理解和掌握TCP/IP 协议栈的代表协议——IP、TCP、
UDP、ICMP、ARP 和DHCP 协议的要点。
本次实验在Windows10
平台下,使用Wireshark-win64-2.2.7
进行协议的捕获与分析。
在CMD
使用ipconfig\all
命令,获取本机ip
与mac
地址。本机情况如下:
以太网适配器 以太网:
连接特定的 DNS 后缀 … … . :
描述… … … … … : Realtek PCIe GBE Family Controller
物理地址… … … … . : 50-7B-9D-78-A7-84
DHCP 已启用 … … … . . : 是
自动配置已启用… … … . : 是
IPv6 地址 … … … … : 2001:da8:215:81f4:f859:d651:c5dd:16cb(首选)
临时 IPv6 地址… … … . : 2001:da8:215:81f4:8889:7f1f:8074:748a(受到抨击)
临时 IPv6 地址… … … . : 2001:da8:215:81f4:acf4:c8d7:cce0:6944(首选)
本地链接 IPv6 地址… … . . : fe80::f859:d651:c5dd:16cb%10(首选)
IPv4 地址 … … … … : 10.120.10.49(首选)
子网掩码 … … … … : 255.255.255.192
获得租约的时间 … … … : 2017年6月6日 20:50:39
租约过期的时间 … … … : 2017年6月8日 20:50:46
默认网关… … … … . : fe80::761f:4aff:fe28:4b8b%10
默认网关… … … … . : 10.120.10.1
DHCP 服务器 … … … . . : 10.120.10.1
DHCPv6 IAID … … … . . : 55606173
DHCPv6 客户端 DUID … … . : 00-01-00-01-20-47-F1-BC-50-7B-9D-78-A7-84
DNS 服务器 … … … . . : 10.3.9.4
DNS 服务器 … … … . . : 10.3.9.5
TCPIP 上的 NetBIOS … … . : 已启用
下载wireshark
并进行设置。
启动
Wireshark
,设置捕获接口(Interface
)为本机网卡,选中混杂模式(promiscuous mode
)
捕获选项,设置合适的捕获过滤器(Capture Filter
):
- 对于
ping
命令,设置过滤器为icmp
- 对于
DHCP
消息,设置过滤器为udp port 67
- 对于
ARP
消息,设置过滤器为arp
- 对于通过网页浏览应用来捕获
TCP
消息,设置过滤器为tcp port 80
开始捕获。
捕获数据。
- 捕获
ICMP
协议数据
- 运行
ping
命令(例如:ping 192.168.0.1
),远程主机地址可以是本机地址、网关路由器地址,也可以是域名。将捕获到的数据保存为文件。- 使用
Windows
中ping
命令的-l
选项(例如:ping -l 8000 192.168.0.1
),生成大于8000
字节的IP
包并发送,捕获后分析其分段传输的包结构。- 捕获
DHCP
协议数据
- 使用
ipconfig
命令释放计算机的IP 地址(ipconfig -release
);- 使用
ipconfig
命令重新申请IP 地址(ipconfig -renew
)。- 此时
wireshark
窗口中可以捕获到完整的DHCP
地址分配的流程,将捕获到的数据保存为文件。- 捕获
ARP
协议数据
- 采用与上一段相同的方法释放
IP
地址并重新申请,在wireshark
窗口中可以捕获到ARP
请求和响应消息,保存为文件。- 捕获
TCP
协议数据
- 打开浏览器,输入一个页面内容较简单的网页的URL,如
www.baidu.com
;网页全部显示后关闭浏览器。
进行协议数据的分析
IP 包头分析:对于采用ping-l
命令选项捕获的ICMP 消息,对承载ICMP消息的IP 包进行分析。
取了某次ping的第三个包,对于包头各字段,列表如下:
字段 | 报文(16进制) | 内容 |
---|---|---|
版本 | 4 | 表示报文是IPv4报文 |
首部长度 | 5 | 首部长度为5*4字节=20字节 |
服务类型 | 00 | 表示普通服务,无特殊需求 |
总长度 | 05dc | 总长度1500字节 |
标识 | 7604 | 数据报标号为30212 |
标志 | 001(二进制) | 表示可以分片,且该片后面还有其他片 |
片偏移 | 2172(二进制下高三位不计算) | 片偏移370*8=2960字节 |
生存时间 | 80 | 生存时间是128跳 |
协议类型 | 01 | 协议01,表示由ICMP协议处理 |
首部校验和 | 7489 | 校验和0x7489 |
源地址 | 0a 78 0a 31 | 源地址:10.120.10.49 |
目的地址 | 0a 78 0a 01 | 目的地址:10.120.10.1 |
发送方将校验字段置为全0,然后对包头所有字段计算反码算数求和,结果即为校验码部分。
反码求和:将待运算数作为16bit二进制数,然后做带进位加法,将进位作为一个16bit二进制数,加在结果的低位上,重复运算直到没有进位,最后将结果取反。
接收方将每一个16bit二进制数做同上的反码相加,得到结果若是FFFF,则校验通过。
- 当一个较大的数据包通过一个支持最大数据包长度较小的网络时,会被分段,每一段单独生成一个数据包。
- 分段中的每一段都具有相同的标识,使用MF与DF以及偏移来确定该包的相对位置。
- MF表示当前包是否是最后一个包(MF=1表示还有分片,MF=0表示已是最后一个分片),DF表示是否允许分片,DF=0表示允许分片。
- 分段中除了最后一段,每一段长度必须是8的整数倍。
- 片偏移k表示这个分片的第一字节是原始数据包的第8*k字节。
在本次实验,网络环境是以太网,支持的最大帧长度为1514字节。
分析后,发现第一个包偏移量为0,第二个包偏移量1480字节,第三个包偏移量2960字节。而一个数据链路层的帧长1514字节,去掉数据链路层的目的地址6字节,源地址6字节,2字节类型,剩余留给IP数据报的长度为1500字节,再去掉20字节的IP头,每个包实际包含数据1480字节,所以第三个包正好偏移2960字节。后面的包以此类推,略去。因为ping包长度8000字节,所以每一次ping有6个分片片段。
同时也可知道,数据链路层使用以太网V2 MAC帧
。
为了提高 IP 数据报交付成功的机会,在网际层使用了因特网控制报文协议 ICMP (Internet Control Message Protocol)。ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。
ICMP是一个工作在网络层,使用IP数据报封装自己的协议,主要为主机报告差错与异常使用。ICMP报文分为差错报告报文和询问报文。
ICMP 差错报告报文共有 5 种
• 终点不可达
• 源站抑制
• 时间超过
• 参数问题
• 改变路由(重定向)ICMP 询问报文有四种
• 回送请求和回答报文
• 时间戳请求和回答报文
• 掩码地址请求和回答报文
• 路由器询问和通告报文
ICMP可以应用在ping上,检查目的主机是否联通;可以用来测试到达目的主机的路径和跳数等。
选取了上图的1号包和2号包进行分析。
字段 | 报文(十六进制) | 内容 |
---|---|---|
类型 | 08/00 | 08表示是一个回显请求报文,00表示回显回复报文 |
代码 | 00/00 | 表示是一个回显报文 |
校验和 | 4d42/5542 | 整个ICMP部分的校验和 |
标识符 | 0001/0001 | 表示上层进程ID号 |
序列号 | 0019/0019 | 包的序列号,该包是25号 |
DHCP,又称动态主机分配协议,通常被应用在大型的局域网络环境中,主要作用是集中的管理、分配IP地址,使网络环境中的主机动态的获得IP地址、Gateway地址、DNS服务器地址等信息,并能够提升地址的使用率。
DHCP有三种机制分配IP地址:
三种地址分配方式中,只有动态分配可以重复使用客户端不再需要的地址。
DHCP消息是承载在UDP数据报上的,运行在传输层的协议。所以完整的DHCP数据报结构由:数据链路层头以太网V2 MAC帧
,网络层头IPv4
,传输层头UDP
和Bootstarp Protocol
组成。
下面只分析DHCP ACK
包的Bootstarp Protocol
部分。
字段 | 报文(十六进制) | 功能 |
---|---|---|
消息类型 | 02 | 1表示请求报文,2表示回应报文 |
硬件地址类型 | 01 | 1表示以太网硬件地址 |
硬件地址长度 | 06 | 以太网硬件地址长度为6 |
跳数 | 00 | 默认0 |
事物ID | 51fc5c30 | 客户端选择的随机数,用于本次通信 |
超时时间 | 0000 | 不设置 |
标志字段 | 0000 | 0表示单播 |
客户端IP地址 | 00000000 | 表示客户端当前IP地址 |
个人IP地址 | 0a780a31 | 填写分配给client的ip地址 |
下一阶段地址 | 00000000 | 若 client 需要透过网络开机,此栏填写开机程序代码所在 server 之地址 |
中继器地址 | 00000000 | 若需跨网域进行 DHCP 发放,此栏为 relay agent 的地址,否则为0 |
客户端MAC地址 | 507b9d78a784 | 客户端的硬件地址 |
客户端MAC地址填充字段 | 00000000000000000000 | |
可选服务器主机名 | 64字节全0 | 服务器主机名称 |
启动文件名 | 128字节全0 | 若 client 需要透过网络开机,此栏将指出开机程序名称,稍后以 TFTP 传送。 |
magic cookie | 63825363 | 为了保证兼容性使用 |
可选字段 | 允许厂商自定义字段,提供更多功能 |
对于选项字段,是客户端与主机协商使用的字段,在DHCP Request
中,客户端发送一个表,指明自己想要获得的字段:
在DHCP ACK
中,服务器回应客户端它所提供的字段:
详细配置参数见下一节。
可选字段的格式为:序号(1字节)+长度(1字节)+内容(长度字节)
选项代号 | 含义 |
---|---|
1 | 设置子网掩码选项 |
3 | 设置网关地址选项 |
6 | 设置DNS服务器地址选项 |
12 | 设置DHCP客户端的主机名选项 |
15 | 设置域名后缀选项 |
33 | 设置静态路由选项 |
44 | 设置NetBios服务器选项 |
46 | 设置NetBios节点类型选项 |
50 | 设置请求IP选项 |
51 | 设置IP地址租约时间选项 |
52 | 设置Option附加选项 |
53 | 设置DHCP消息类型 |
54 | 设置服务器标识 |
55 | 设置请求参数列表选项。客户端利用该选项指明需要从服务器获取哪些网络配置参数。该选项内容为客户端请求的参数对应的选项值 |
58 | 设置续约T1时间,一般是租期时间的50% |
59 | 设置续约T2时间。一般是租期时间的87.5% |
60 | 设置厂商分类信息选项,用于标识DHCP客户端的类型和配置 |
61 | 设置客户端标识选项 |
66 | 设置TFTP服务器名选项,用来指定为客户端分配的TFTP服务器的域名 |
67 | 设置启动文件名选项,用来指定为客户端分配的启动文件名 |
77 | 设置用户类型标识 |
121 | 设置无分类路由选项 |
分析四次握手过程。
DHCP discover
discover包是客户端发送的广播包,数据链路层的mac地址也是广播地址,UDP数据包报中的源端口68,目的端口67。客户端简要汇报自己的网络信息,并在可选字段中附加DHCP type为discover,表示申请一个IP地址。
DHCP offer
因为DHCP服务器会保存一定时间的IP与MAC绑定的信息,所以申请ip时在第二阶段DHCP服务器就分配了该客户端上次的IP地址,并填入目的地址处发回。
可以看到服务器分配的IP地址以及客户端的mac地址。
在可选字段中可以看到DHCP服务器IP地址,租期时间,路由器信息,子网掩码,域名服务器等。
DHCP request
可以看到,第三次,客户端发给服务器的包也是广播包,因为可能有多个DHCP服务器都给客户端发送了可用IP地址,而客户端需要让所有的DHCP服务器知道它接受哪个DHCP服务器停工的IP地址。
在可选字段中,客户端确认了他的mac地址,将接受的IP地址,接受的DHCP服务器,以便DHCP服务器在IP与mac表中记录。最后客户端请求了一个参数表,要求DHCP服务器提供一些详细参数。
上图表示,客户端mac50:7b:9d:78:a7:84
接受DHCP服务器10.120.10.1
提供的IP地址10.120.10.49
。
使用ipconfig\all
命令查看本机信息,如图:
与上述分析对应。
DHCP ack
最后一次确认,服务器主要回复上一次中客户端要求的额外信息。至此,租期生效。
当前网络环境下,路由器与DHCP服务器是同一设备。
因为他们IP地址相同。本机的路由详细信息也表明了这一点,即:
路由器IP与DHCP服务器都是10.120.10.1
,可能为实验室机房的总路由器顺便充当了DHCP服务器。
地址解析协议,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
ARP的原理就是对于不知道物理地址的IP地址,主机发送一个广播包,内容就是询问IP地址对应的主机。若该IP对应的主机存在,那对应主机就回复一个包,包内包含自己的MAC地址。如果主机问了三遍还是没人回复,呢么他就认为这个IP地址没人使用。
数据链路层帧头部分源地址是本机mac,目的地址是广播地址全f,表格列出了ARP协议的数据内容。
字段 | 报文(十六进制) | 功能 |
---|---|---|
硬件地址 | 0001 | 硬件地址表示硬件接口类型,1表示以太网 |
协议种类 | 0800 | 指明协议种类,ip是0800 |
硬件地址长度 | 06 | 指明硬件地址长度,单位为比特 |
协议长度 | 04 | 指明协议长度 |
操作码 | 0001 | 操作类型:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4 |
发送方MAC地址 | 507b9b78a784 | 发送方MAC地址 |
发送方IP地址 | 0a780a31 | 发送方IP地址 |
目的地MAC地址 | 000000000000 | 目的地MAC地址 |
目的地IP地址 | 0a780a01 | 目的地IP地址 |
这个询问表明是一个ARP请求,询问目的地10.120.10.1
的mac地址。
而收到的回复包如下图:
表明10.120.10.1
的mac地址为74:1f:4a:28:4b:8b
。
TCP首部如图:
字段名称 | 长度 | 功能 |
---|---|---|
源端口 | 2字节 | 发送方端口 |
目的端口 | 2字节 | 接收方端口 |
序号 | 4字节 | 本段发送的第一字节的序号 |
确认号 | 4字节 | 期望收到对方的下一字节序号 |
数据偏移 | 4bit | 指出 TCP 报文段的数据起始处距离 TCP报文段的起始处有多远,以4字节为单位 |
保留 | 6bit | 保留为今后使用,目前应置为全0 |
URG | 1bit | 紧急指针有效位,1有效 |
ACK | 1bit | 确认号有效位,1有效 |
PSH | 1bit | 接收方收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付 |
RST | 1bit | RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立连接 |
SYN | 1bit | 同步比特SYN置为1,就表示这是一个连接请求或连接接受报文 |
FIN | 1bit | 终止比特FIN置为1,就表示这个报文用于释放链接 |
窗口 | 2字节 | 接收方为对方设置的发送窗口大小 |
校验和 | 2字节 | 校验和,计算时包含伪首部 |
紧急指针 | 2字节 | 紧急指针指出在本报文段中的紧急数据的最后一个字节 |
选项 | 长度可变 | 提供更多可选功能 |
填充 | 不定 | 填充使得首部长度是4字节的整数倍 |
TCP连接的建立需要三次握手:
第一次握手:
客户端发给服务器,可见源端口5060,目的端口80,相对序号0(实际序号值2145050),ACK序号全0,首部长度32字节,标志字段只有SYN为1,表示这是一个申请建立连接的包,窗口大小8192,校验和0x96c1
,但是未经核对。
第二次握手:
服务器发回客户端,源端口80,目的端口5060,相对序号0,ACK序号1。标志字段SYN与ACK为1,表示确认了客户端发过来的0号包,回复了一个同意申请建立连接的包。校验和同样未经核对。
第三次握手:
客户端发给服务器,序号增长为1,确认了服务器发来的0号包,第三次握手表明连接的确立。
关于第三次握手,主要是为了防止延期的包干扰服务器:
客户端发送了一个连接请求报文段到服务端,但是在某些网络节点上长时间滞留了,而后客户端又超时重发了一个连接请求报文段该服务端,而后正常建立连接,数据传输完毕,并释放了连接。
如果这时候第一次发送的请求报文段延迟了一段时间后,又到了服务端,很显然,这本是一个早已失效的报文段,但是服务端收到后会误以为客户端又发出了一次连接请求,于是向客户端发出确认报文段,并同意建立连接。
假设不采用三次握手,这时服务端只要发送了确认,新的连接就建立了,但由于客户端比你更没有发出建立连接的请求,因此不会理会服务端的确认,也不会向服务端发送数据,而服务端却认为新的连接已经建立了,并在一直等待客户端发送数据,这样服务端就会一直等待下去,直到超出保活计数器的设定值,而将客户端判定为出了问题,才会关闭这个连接。
这样就浪费了很多服务器的资源。而如果采用三次握手,客户端就不会向服务端发出确认,服务端由于收不到确认,就知道客户端没有要求建立连接,从而不建立该连接。
若双方同时发起建立连接请求,这两个连接都会成功建立,但实际每台主机竹有一个连接,因为连接双方相同的连接会被认为是一个连接。
TCP连接的释放需要4次挥手加定时器:
第一次挥手:
服务端发送给客户端,序号为上次需要加1(114),ACK为祈祷收到的包序号(760),标志位置FIN为1,表示请求释放连接。
第二次挥手:
客户端回复服务器,确认收到114号包,本次包序号760,同意释放连接。此时TCP协议在单方向(服务器至客户端)的连接已经关闭,即服务器不给客户端发消息,但可以接受客户端的消息。
第三次挥手:
客户端发给服务器,置FIN位为1,表示客户端申请释放连接。注意本次包确认序号与上次一样,因为服务器不可能主动给客户端发送消息了;而序号为第二次挥手与第三次挥手期间最后发的包序号加1,如果这期间没发送消息,那么与第二次挥手包序号相等。客户端第三次挥手完毕后等待服务器的确认。
第四次挥手:
服务器发送给客户端的确认消息。双方释放连接。
若一开始是客户端主动释放的连接,最后第四次握手是客户端发送给服务器的确认消息,那么此时服务器立即释放连接,客户端等待两倍数据包最长生存周期,在释放连接。原因:
为了保证客户端发送的最后一个ACK报文段能够到达服务器。
该ACK报文段很有可能丢失,因而服务器重发第三次挥手报文。若客户端不等待,那么服务器无法释放连接。故客户端等待,若在等待过程中收到新的第三次挥手,那么客户端回复后将重启定时器。
此举为了保证服务器尽可能不浪费时间,保证服务器正常释放连接。
参考资料
然而,TCP的释放连接,没有完美的机制。在实际使用中,出错时可以重传,重传几次扔没有收到期待的回应,则可以主动释放连接,让对方等待超时无数据发送,强行关闭连接。
每一个发送方的初始发送序号由通信双方商定,以后按发送字节数递增。接收序号为接收方期待接收的字节,即发送方下一个应发过来的字节号。发生校验错误、乱序导致重传的情况下,要求重传的一方将想要重传的序号置于ACK中,对方会按ACK给的序号重传特定序号。
字段名称 | 长度 | 功能 |
---|---|---|
URG | 1bit | 紧急指针有效位,1有效 |
ACK | 1bit | 确认号有效位,1有效 |
PSH | 1bit | 接收方收到推送比特置 1 的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付 |
RST | 1bit | RST=1 时,表明 TCP 连接中出现严重差错,必须释放连接,然后再重新建立连接 |
SYN | 1bit | 同步比特SYN置为1,就表示这是一个连接请求或连接接受报文 |
FIN | 1bit | 终止比特FIN置为1,就表示这个报文用于释放链接 |
TCP的流量控制由连接的每一端通过声明窗口的大小来提供。窗口大小字段用来控制对方发送的数据量,单位为字节。窗口大小用数据包来表示,例如Windows size=3, 表示一次可以发送三个数据包。窗口大小起始于确认字段指明的值,是一个16bits字段。窗口大小可以调节。
窗口大小有一个调节因子,一般在建立连接的时候协商确定。
所以服务器窗口乘积因子256,客户端窗口乘积因子512。
用于标识该报文段中的数据长度。
MSS指明本端所能够接收的最大长度的报文段。当一个TCP连接建立时,连接的双方都要通告各自的MSS协商可以传输的最大报文长度。我们常见的MSS如以太网可达1440字节。
比如这次通信:
表明MSS为1440字节。
乱序到达情况:
345号包序号是6749,下一个应收序号是8189。
而实际346号包:
序号为9629。说明中间包没有到达,可能是丢了,可能是延迟了。347号包序号接346。而348号包正式此前缺失的:
说明包乱序到达。此后的350,351类似。
快重传:
TCP规定,连续收到三次个重复的ACK重传包就要立刻重传,所以服务器在收到213,214,215三个重复的ACK后,快重传了218号包。
重传:
网络较好情况下,重传多由于不正常释放连接导致,比如客户端强行关闭了程序,导致服务器没有收到ACK而不断超时重传。
可见seq=1与seq=1441在被反复重传,可能由于客户端程序已经强行结束导致。
参考资料
本子实验主要遇到的问题是对协议理解不透彻
之前虽然在课堂上跟随老师初步学习了这些协议,但由于缺乏实践,认识不足,导致分析包的时候一头雾水。我将包内容与老师讲义上一一对照,结合教材与网络资料,才弄懂每个字段含义。
本次实验遇到的问题还有wireshark软件使用问题
对wireshark的使用,因为没有接触过,使用起来不太流畅。许多功能比如筛选,标记,分组等最开始也不会用。不过后来到TCP时就会用了。
本次实验最大的收获在于学会了各种协议的每个字段的用处,理解了协议设计者这么设计每个字段的目的。
重点理解了TCP协议建立连接与释放连接的过程,知道了对于没有完美方案的问题该如何尽可能的解决。
还理解了各种辅助协议比如ARP,ICMP等在网络通信中的作用。