引言:为了适应以太网的这种数据传输限制,IP在网络层传输时采用的了分片的技术手段。下面我们将通过PING命令发送ICMP数据包来真实体验一下IP分片的全过程。
传统的以太网是共享性局域网,采用载波侦听多路访问/冲突检测CSMA/CD协议。最小帧长必须大于整个网络的最大时延位(最大时延时间内可以传输的数据位)。
如果帧长度太小,就可能出现网络上同时有两个帧在传播,就会产生冲突(碰撞)而造成网络无法发送数据。如果数据帧太长就会出现有的工作长时间不能发送数据,而且可能超出接受端的缓冲区大小,造成缓冲益出。
由于多方面的限制,每个以太网帧最小不能低于64字节,最大不能超过1518字节。对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。
为了适应以太网的这种数据传输限制,IP在网络层传输时采用的了分片的技术手段。IP协议在传输数据包时,将数据报文分为若干分片进行传输,并在目标系统中进行重组。这一过程称为分片(fragmentation)。
MTU(最 大数据传输单元)是指一种通信协议的某一层上面所能通过的最大数据报大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
我们这里是IP数据包的MTU即网络层的最大数据传输单元,常见的以太网链路的MTU值为1500字节(这里不包括以太网帧头开销18字节)。
数据包MTU的大小,并不是固定的。需要注意的是:网络层外面还会加上数据链路层的封装,经过数据链路层封装之后,才是一个数据包最终的大小。MTU只是限制了一个数据包经过网络层的封装后,不要超过1500字节。
图 1 IP包大小
图 2 科来网络分析系统抓包
图 3 第1个ICMP数据包
以ICMP数据包为例,可用您想发送的 IP 包的大小减去 28。这是因为,IP报头的大小为 20字节,而ICMP Echo 消息的 ICMP报头的大小为 8 字节。
图1显示了二者的关系。实质上所发送的有效数据是1472字节(1500-20-8)。
下面我们通过最常用的PING命令发送ICMP数据包来验证IP分片的过程。这里我们采用科来网络分析系统(中文版)进行抓包分析。
因为以太网默认的MTU值为1500Byte,所 以 为了达到分片的效果,我们应该传输大于1500Byte字节的数据包,才能使该数据包分段传输。
我们平时在检测网络故障时采用PING命令,默认都是发送的32字节,现在为了实验的效果我们发送使MTU大于1500字节的数据,从上面分析得出最大可发送的有效数据为1472字节,所以我们发送1473字节的ICMP数据包。
实验环境:内网访问 ,两端电脑的MTU=1500。在Windows命令提示符下输入:ping 192.168.0.1-l 1473。
通过科来网络分析系统抓包,我们看到,该数据包被分片了,由于PING命令重复ping了4次,每次分片后有2个数据包,所以总共抓到了16次。数据包如图2所示。
查看详细的数据包解码,第1个发出的ICMP数据包,如图3所示。
分析:因为ping的长度是1473字节,IP数据包就是1501(20+8+1473)大于了MTU1500的值,所以会分片发送。捕获的这个数据包总长度为1500字节,更多分段位置1,表示还有数据分段。s,偏移量为0。
需要注意的是IP头部的总长度字段值(这里是1500字节)并不全是数据的净载荷长度,这里还包括了IP以及ICMP的头部长度,分别是20字节和8字节。另外,IP协议的头部总长度并不一定就是MTU值1500字节,这个值与网络环境、操作系统等因素有关。
图 4 第1个分片包
图5 接收的分片包
图4是第一个发送出去的分片包。分析:IP字段的标 识0x3D7D,与第一个包相同,说明这是同一个数据包,只是被分片了。偏移量为185,表示相对第一个包的位置,以便接收主机根据偏移量进行数据重组。
需要注意的是此处分片包并没有ICMP字段,接收主机会根据偏移来重组成完整的ICMP数据包。
最后,我们来计算一下该数据包的长度:第一个数据包的总长度为1500字节,减去IP头部长度20字节,减去ICMP头部长度8字节,即1500-20-8=1472字节;第二个数据包的总长度为21字节,减去IP头部长度20字节,即21-20=1字节,两个数据包的净载荷 1472+1= 1473,正好是我们发送的数据长度。
以上就是IP分片包的全过程,但细心的朋友会发现发送与接收的数据包大小不一样了。
首先来说一下第1个发出的数据包大小1518,它实质上是IP数据包大小1500字节加上以太网的帧头开销18字节,这个接收的数据包也是1518。
再看第一个发出的IP分片大小39字节,它由21字节的IP数据包加上18字节的以太网的帧头。但接收到的IP分片大小为64字节,64-20-18=26字节。也就是说收到的分片数据包里有效数据是26并不是发出去的1,通过抓包确实如此,如图5。
以上是收到的第1个数据包及IP分片包,IP分片包中额外数据显示字节数26,但IP总长度只有21。其实这也是以太网中有关数据包传输大小的限制了,我们更多的时候只是关注了MTU即最大传输单元,其实还有一个最小传输值64,这是根据以太网的特性设置,为了检测到网络中的冲突数据包,规定最小传输数据帧的大小为64。
图 6 发出去的ICMP数据包
图 7 回显数据包
如果发送的数据不足,MAC子层就会在数据字段的后面填充,以满足数据帧长不小于64字节。但为什么发出去的数据包没有呢,MAC子层的数据网络分析软件没有捕捉到,但在接收电脑上是可以抓到的。
实验环境:内网访问一端电脑的MTU=1480一端电脑的MTU=1500。
对方电脑的MTU 是 1480,实际可以处理的数据应是1480-20(IP)-8(ICMP)=1452,所以我们发送数据包大 小 1453。ping 192.168.0.4 -l 1453。
图6是发出去的ICMP数据包,因为1453比1472小不需要分片,所以直接发送,没有IP分片数据包了。
图7是对方电脑发来的回显数据包,1453刚好超过1452。但请注意,这里并不是分成第一个数据包1452,第二个数据包1,而是第1个数据包1448。
这是因为为了方便地址寻址,分片后的数据包要是8的整数部(最后一个除外),这样最接近1452被8整除的是1448,所以分片后第一个数据包是1448,第二个IP分片数据包是5。
图8是ICMP回显的IP分片数据包,其中IP总长底是25,其中包括20字节的IP信息,所以真正回显的数据是5字节,当然为了满足最小传输数据长度64,还要填充21字节,所以下面额外数据显示26字节。
图 8 回显的分片包
表1 实验列表
如表1所示,以上两个实验都是在内网测试,关于MTU值的设定可以通过很多工具来实现。虽然在整个互联网中,数据包要经过很多网络设备,不同网络设备的MTU都不一样,但是都需要经过IP分片再重组最后到达目的地。
当然,在分片数据包适应了网络数据传输大小限制的同时,也带来了一些问题:第一,性能消耗。分片和重组会消耗发送方、接收方的CPU等资源,如果存在大量的分片报文,可能会造成较为严重的资源消耗。分片对接收方内存资源的消耗较多,是因为接收方要为接收到的每个分片报文分配内存空间,以便于最后一个分片报文到达后完成重组。如果某个分片报文在网络传输过程中丢失,接收方将无法完成重组,这时应用进程要求重传的话,那么发送方必须重传所有分片报文而不是仅重传被丢弃的那部分。这种效率低下的重传行为会给端系统和网络资源带来额外的消耗。
第二,安全隐患。不向接收方发送最后一个分片报文的恶意报文,会导致接收方要为所有的分片报文分配内存空间,可接接收方的内存得不到及时的释放(接收方会启动一个分片重组的定时器,在一定时间内,如果无法完成重组,将向发送方发送ICMP重组超时差错报文)。
只要这种攻击的分片报文发送的足够多、足够快,很容易占满接收方的内存,让接收方因无内存资源而不能处理正常业务,从而达到DOS的恶性攻击效果。
由于分片只有第一个分片报文具有四层信息而其他分片没有,这就给路由器和防火墙等中间设备在访问控制策略匹配方面带来了一定麻烦。
如果路由器和防火墙等中间设备不对分片报文进行安全策略的匹配检测而直接放行IP分片报文,则有可能给接收方带来安全隐患和威胁,因为黑客可以利用这个特性,绕过路由器、防火墙的安全策略检查对接收方实施攻击。如果路由器、防火墙等中间设备对这些分片报文进行重组后,再匹配其安全策略,那么又会对这些中间设备的资源带来极大的消耗。
特别是在遇到分片攻击的时候,这些中间设备会在第一时间消耗完所有内存资源,最后导致全网中断的严重后果。所以,分片带来的安全隐患要及时防范。