1. 网络层首部
1.1 网络层协议
(1)TCP/IP协议栈网络层的4个协议:IP协议、ICMP协议、IGMP协议和ARP协议。
(2)IP协议:动态路上协议的统称,包括RIP和OSPF协议。
(3)TCP/IP协议分成四层:应用层定义了客户端和服务器通信规范,传输层实现可靠传输,网络层负责为数据包选择转发路径,数据链路层负责将数据包封装成帧发送到数字链路上。
1.2 查看网络层首部
1.3 网络层首部格式
(1)版本:占4位,指IP协议的版本。目前有两个版本IPv4和IPv6。
(2)首部长度:占4位,能表示的最大十进制数值为15(60个字节,即固定部分+可变部分的最大长度为60字节)(注意,该字段的单位为4个字节)。当IP分组的长度不是4字节的整数倍时,必须利用最后的填充字段加以填充。
(3)区分服务:占8位,配置计算机给特定应用的数据包添加一个标志,然后再配置网络中的路由器优先转发这些带标志的数据包。在网络带宽比较紧张的情况下,这种区分服务能确保服务质量(Quality of Service,QoS)。只有在使用区分服务时,该字段才起作用。
(4)总长度:指IP首部和数据之和的长度,也就是数据包的长度,单位为字节。该字段能表示的最大长度为65535字节。但数据链路层以太网所能封装的数据包最大为1500字节,这就意味着一个IP数据包长度大于链路层的MTU时,需要将该数据包分片传输。网络中的标只、标志和片偏移都是和数据包分片相关的字段。
(5)标识:占16位。IP软件在存储器中维持一个计数器,每产生一个数据包,计数器加1,并将此值赋给标识字段。这个计数器会达到最大值后会回零循环使用。当数据包由于长度超过网络的MTU而必须分片时,同一个数据包被分成多个片,这些片的标识都一样,这样接收端才能将这些分片重装成原来的数据包。
(6)标志:占3位。目前只有两位有意义。
①最低位记为MF(More Fragment),当MF=1表示后面“还有分片”的数据包。MF=0时表示这巳是若干数据包中的最后一个。
②标志字段中间的一位记为DF(Don’t Fragment)。意思是“不能分片”。只有DF=0时才允许分片。
(7)片偏移:占13位。片偏移指出较长的分组在分片后,某片在原分组中的相对位置(单位为8字节)
①假设3个分片数据包中的数据部分长度分别为1400、1400、1000字节。
②原始数据包首部被复制为各数据包片的首部(但必须修改相关字段的值)
③片偏移是以字节为单位的,如175表示175*8=1400字节处的偏移。
(8)生存时间(Time To Live,TTL):每过一个路由器TTL减1,当TTL为0时,就丢弃该数据包而不再转发。
(9)协议:占8位,协议字段指出此数据包(数据部分)携带的数据使用何种协议。以便使目标主机的网络层知道应将数据部分上交哪个处理过程。常用的协议和相应的协议字段如下图所示。
协议名 | ICMP | IGMP | IP | TCP | EGP | IGP | UDP | IPv6 | ESP | OSPF |
字段值 | 1 | 2 | 4 | 6 | 8 | 9 | 17 | 41 | 50 | 89 |
(10)首部检验和:占16位,这个字段只检验数据报的首部,但不包括数据部分。这是因为每经过一个路由器。路由器都要重新计算一下首部检验和(如TTL、标志和片偏移可能发生变化)
(11)源IP和目标IP。各占32位。
1.4 实战
(1)查看协议版本和首部长度
①为Win7虚拟机A和B设置IPv4和IPv6两种地址。如A机IPv4为192.168.80.10/24,IPv6为2001:2012:1975::6/64。B机IPv4为192.168.80.20/24,IPv6为2001:2012:1975::8/64。
②在A机上装Winshare抓包工具,并ping虚拟机B中IPv4和IPv6地址(如ping 2001:2012:1975::8)
③注意:ping计算机B的IPv4地址的数据包使用的是ICMP协议,网络层首部Version标记为4,首部长度为20字节。IPv6使用的是ICMPPv6协议,Version标记为6,IPv6网络层首部长度固定为40个字节,所以没有首部长度字段。
(2)给数据包设置区分服务字段(以给访问网站的请求流量包增加区分服务标记为例)
①打开组策略(gpedit.msc)→“计算机配置”→“Windows”→“基于策略的Qos” →“新建策略”。
②在“创建Qos策略”对话框中指定策略名称,选中“指定DSCP值”为8(8为区分服务的优先级,范围为0-63)。然后“下一步”,选择此Qos策略应用于“所有应用程序”、“任意源IP地址”、“任意目标IP”。
③再“下一步”,在指出“指定协议和端口号”对话框中选择 TCP协议,源端口选择任意,接收端口中输入80。这也是计算机访问网站发送出去的数据包目标端口。
④运行Wireshark。打开一个网站,捕获数据包。找到访问网站发送的请求数据包(http、tcp),可以看到该数据包添加了区分服务,值为0x08。
(3)捕获并观察数据包分片
①ping命令构造的数据包默认是32字节,可以使用-l参数指定数据包大小,-f参数指定数据包是否允许分片。如ping www.baidu.com –l 3500 (数据包大小为3500字节,而以太网MTU大小为1500字节,故会被分成三片)
②第1个ICMP数据包被分为3个分片,三个分片的标识都是11110,第1个分片标志为1,片偏移为0。第2个分片的分片标志为1,片偏移为1480。第3个分片的分片标志为0,意味着这是最后一个分片,片偏移为2960。
③禁止分片可以将Flags字段的第二位(Don’fragment)设置为1.如ping时指定了数据包大小的同时,可以添加一个参数-f来禁止分片。如ping www.baidu.com–f。然后用Wireshare抓包捕获ICMP包,查看该标志位,如果为1表示不允许分片。
(4)查看和配置链路的MTU
①查看链路的MTU:R1#show interface serial 1/0,可以找到MTU的值
②在R1上设置Serial 1/0接口的链路MTU为500
R1#conf t
R1(config)#interface serial 1/0
R1(config-if)#mtu 500
③也需要在R2上配置Serial 1/0接口的链路MTU为500
(5)数据包生存时间(TTL)
①操作系统发送数据包的默认TTL值
操作系统 | 默认TTL值 | 备注 |
WinNT4.0/2000/xp/2003 | 128 | Win7可以在注册表中添加一个DefaultTTL来设置默认的TTL值。 HKLM\System\CurrentControlSet\Services\Tcpip\Parameters下将DefaultTTL的值改为Dword类型的值,如,十进制的64. |
Win95/98/NT3.51 | 32 | |
Linux | 64 | |
MacOS/MacTCP2.0x | 60 |
②ping命令中通过-i指定发送的ICMP请求数据包的TTL值。每经过一个路由器TTL减1,当TTL=0时,路由器会丢弃该数据包,然后产生一个ICMP响应数据包给发送者,说明TTL耗尽。通过这种方式,可以将TTL分别指定为1、2、3,…来查看到达目标地址经过哪些路由器)。如ping www.baidu.com -i 1查看经过的第1个路由器。
③抓包查看数据包TTL变化
注意:R1的默认路由指向R2的s2/0接口地址,R2的默认路由指向R1的s2/0接口。而ping 131.107.1.2时,这个地址并不存在,会发生ICMP请求数据包在R1和R2之间往复转发,TTL不断减1,直到变为0时被丢弃。