IP数据报的分片和组装
一、IP数据报的格式
IP数据报的首部长度和数据长度都是可变长的,但总是4字节的整数倍。
(1)对于IPv4 ,4位版本字段是4。
(2)4位首部长度的数值是以4字节为单位的,最小值为5,也就是说首部长度最小是4x5=20字节, 也就是不带任何选项的IP首部,4位能表示的最大值是15,也就是说首部长度最大是60字节。
(3)8位TOS字段有3个位用来指定IP数据报的优先级(目前已经废弃不用),还有4个位表示可选的服务类型(最小延迟、最大呑吐量、最大可靠性、最小成本),还有一个位总是0。
(4)16位总长度是整个数据报(包括IP首部和IP层payload)的字节数。
(5)每传一个IP数据报,16位的标识加1,可用于分片和重新组装数据报。
(5)3位标志和13位片偏移用于分片。
(6)TTL(Time to live)是这样用的:源主机为数据包设定一个生存时间,比如64,每过一个路由器就把该值减1,如果减到0就表示路由已经太长了仍然找不到目的主机的网络,就丢弃该包,因此这个生存时间的单位不是秒,而是跳(hop)。
(7)协议字段指示上层协议是TCP、UDP、ICMP还是IGMP。
(8)校验和,只校验IP首部,数据的校验由更高层协议负责。
(9)IPv4的IP地址长度为32位。
二、分片
当要发送的IP数据报的长度超出了最大传输单位MTU,且允许分片时,就会进行IP分片。
一个未分片的数据报的分片信息字段全为0,即多个分片标志位为0,并且片偏移量为0。分片一个数据报,需执行以下几个步骤:
1.检查DF标志位,查明是否允许分片。如果设置了该位,则数据报将被丢弃,并将一个ICMP错误返回给源端。
2.基于MTU值,把数据字段分成两个部分或者多个部分。除了最后的数据部分外,所有新建数据选项的长度必须为8个字节的倍数。
3.每个数据部分被放入一个IP数据报。这些数据报的报文头略微修改了原来的报文头。
4.除了最后的数据报分片外,所有分片都设置了多个分片标志位。
5.每个分片中的片偏移量字段设为这个数据部分在原来数据报中所占的位置,这个位置相对于原来未分片数据报中的开头处。
6.如果在原来的数据报中包括了选项,则选项类型字节的高位字节决定了这个信息是被复制到所有分片数据报,还是只复制到第一个数据报。
7.设置新数据报的报文头字段及总长度字段。
8.重新计算报文头部校验和字段。
此时,这些分片数据报中的每个数据报如一个完整IP数据报一样被转发。IP独立地处理每个数据报分片。数据报分片能够通过不同的路由器到达目的。如果它们通过那些规定了更小的MTU网络,则还能够进一步对它们进行分片。
三、组装
为了重新组合这些数据报分片,接收主机在第一个分片到达时分配一个存储缓冲区。这个主机还将启动一个计时器。当数据报的后续分片到达时,数据被复制到缓冲区存储器中片偏移量字段指出的位置。当所有分片都到达时,完整的未分片的原始数据包就被恢复了。处理如同未分片数据报一样继续进行。
四、三位标志
第一个比特保留为以后用;第二个比特是“不分片”比特,若为1,IP将不对数据报进行分片,若无法将此数据报通过任何可用网络转发,则丢弃,并发送一个ICMP差错报文给起始端,若为0, 则在需要时将数据报分片;第三个比特是“更多分片”比特,为1,表示后面还有更多的分片,为0,则表示是最后的分片。