|
每个网络可能规定了不同的最大分组长度。当分组在互联网中传送时可能要进入一个最大分组长度较小的网络,这时需要对它进行分段,这又引出了新的问题:在哪里对它进行重装配?
|
|
|
一种办法是在目的地进行装配。但这样只会把数据报越分越小,即使后续子网允许较大的分组通过,但由于途中的短报文无法装配,从而使效率下降。
|
|
|
另一种办法是允许中间的路由器进行组装,这种方法也有缺点。首先是路由器必须提供重装配缓冲区,并且要设法避免重装配死锁;其次是由一个数据报分出的小段都必须经过同一个出口路由器,才能再行组装,这就排除了使用动态路由选择算法的可能性。
|
|
|
关于分段和重装配问题的讨论还在继续,已经提出了各种各样的方案。下面介绍在DOD和ISO IP协议中使用的方法,这个方法有效地解决了以上提出的部分问题。
|
|
|
IP协议使用了4个字段处理分段和重装配问题。一个是报文ID字段,它唯一地标识了某个站某个协议层发出的数据。在DOD(美国国防部)的IP协议中,ID字段由源站和目标站地址、产生数据的协议层的标识符以及该协议层提供的顺序号组成。第二个字段是数
据长度,即字节数。第三个字段是偏置值,即分段在原来数据报中的位置,以8字节(64位)的倍数计数。最后是M标志,表示是否为最后一个分段。
|
|
|
当一个站发出数据报时对长度字段的赋值等于整个数据字段的长度,偏置值为0,M标志置False(用0表示)。如果一个IP模块要对该报文分段,则按以下步骤进行。
|
|
|
(1)对数据块的分段必须在64位的边界上划分,因而除最后一段外,其他段长都是64位的整数倍。
|
|
|
(2)对得到的每一分段都加上原来数据报的IP头,组成短报文。
|
|
|
|
(4)第一个短报文的偏置值置为0,其他短报文的偏置值为它前边所有报文长度之和(字节数)除以8。
|
|
|
(5)最后一个报文的M标志置为0(False),其他报文的M标志置为1(True)。
|
|
|
|
|
|
重装配的IP模块必须有足够大的缓冲区。整个重装配序列以偏置值为0的分段开始,以M标志为0的分段结束,全部由同一ID的报文组成。
|
|
|
数据报服务中可能发生有一个或多个分段不能到达重装配点的情况。为此,采用两种对策应付这种意外。一种是在重装配点设置一个本地时钟,当第一个分段到达时把时钟置为重装配周期值,然后递减,如果在时钟值减到零时还没等齐所有的分段,则放弃重装配。另一种对策与前面提到的数据报生存期有关,目标站的重装配功能在等待的过程中继续计算已到达的分段的生存期,一旦超过生存期,就放弃重装配,丢弃已到达的分段。显然,这种计算生存期的办法必须有全局时钟的支持。
|
|
|