转载:http://3layer.blog.51cto.com/57448/893273
前言
其实在IP协议的报头中,除了TTL字段,还有几个字段是非常重要的,这就是我们今天要讨论的标识符、标志位以及偏移量,这3个字段在IP数据报的分片与重组中,是非常重要的字段。
我们都知道,不同类型的网络,其MTU(最大传输单元)各不相同,如以太网中,最大的传输帧为1518字节,FDDI为4500字节,令牌环帧在4500字节到17800字节之间,而IP协议的一个重要功能,就是能够对传输的数据大于硬件接口的MTU时,对其进行分段传输。即大于MTU的数据报将被分为2个或多个的合适的大小被传输。一个分片在到达接收主机的路径中,还可能被继续分片,因此,分片的IP数据报可能会以不同的路径传输到接收主机,接收主机通过一系列的重组,将其还原为一个完整的IP数据报,再提交给上层协议处理。
IP标识符
IP标识符、标志、偏移量3个字段在IP报头中的位置如下图1所示:
图1
在发送数据报前,发送主机给每个数据报一个ID值,放在16位的标识符字段中。此ID用于标识唯一的数据报或数据流。接收主机利用此ID对收到的数据报进行重组。正如前面所说,当分片的IP数据报从源地址发送到目的地址的时候,由于网络延迟或者不同的传输路径的关系,在到达目的主机时,这些分片数据报并不总是有序的排列,而是处于一种无序状态,因此,接收主机便用此ID判断接收的这些分片数据报是否属于同一个数据流,然后再进行重组(重组将在偏移量中讨论)。
标志
标志字段在IP报头中占3位,第1位作为保留,置0;第2位,分段,有两个不同的取值:该位置0,表示可以分段;该位置1,表示不能分段;第3位,更多分段,同样有两个取值:该位置0,表示这是数据流中的最后一个分段,该位置1,表示数据流未完,后续还有分段,当一个数据报没有分段时,则该位置0,表示这是唯一的一个分段。见下图2:
图2
当目的主机接收到一个IP数据报时,会首先查看该数据报的标识符,并且检查标志位的第3位是置0或置1,以确定是否还有更多的分段,如果还有后续报文,接收主机则将接收到的报文放在缓存直到接收完所有具有相同标识符的数据报,然后再进行重组。
更多分段位能够让接收主机判断分片的数据报是否发送完毕;而分段位除了能够将将数据报分段,而且还能够实现另一个用途,在某些情况下,可以利用分段位动态的找到网络端到端的MTU大小。如果路由器配置时,置此位为0,则当主机尝试发送一个比传输路径上的数据报大的帧时,路由器不转发该帧,而是丢弃,并给源主机发送ICMP报文,说明该数据报太大,源主机利用此信息调整数据报大小,再重新发送。
偏移量
13位的偏移量字段用来表示分段的数据报在整个数据流中的位置,即相当于分片数据报的顺序号。发送主机对第一个数据报的偏移量置为0,而后续的分片数据报的偏移量则以网络的MTU大小赋值。偏移量对于接收方进行数据重组的时候,这是一个关键的字段。对于分片的数据段(单位:字节)必须为8的整数倍,否则IP无法表达其偏移量。如下图3所示:
图3
以太网中,源主机如果需要通过UDP传送3000字节的数据到目的主机,这时的分段情况如下图4所示(在同一网段):
图4
此处需要注意的是对于分片1的报头,相对于其他两个分片的报头而言,要多出8个字节UDP协议的报头开销,因此,在计算实际传输的数据净载荷时,分片1要多减去8字节UDP报头。最后,接收主机通过此偏移值将数据重组成完整的数据报。
总结
IP协议虽然是我们司空见惯的一个协议,但是,对于其报头结构,报头中每个字段的含义,还是需要我们不断学习,才能真正理解IP协议的精髓。在此,希望各位兄弟多多交流,大家一起学习。