当一报文分组以顺序号X发上通信子网,但在子网的传输过程中因路由算法陷入了循环或者由于子网拥塞而导致一个较大的延迟时,由于长时间没有这个报文分组的消息,发方将会超时重发以完成本次传输。但若此后不久又建立了一个新的连接,且收方又恰好允许接收以X为顺序号的报文,而原先被子网阻滞且已为收发双方忘记了的前一个带有X顺序号的分组又到达收方,则其将被接收,从而正确的报文将被当成重发分组而丢弃。这个转了一大圈后又来到的分组,被称为迟到分组,它是有存储能力子网带来的新问题。在采用数据报机制的子网中,因为每个数据报分组都要单独穿过子网,都要独立寻址,这一问题尤为明显。而在采用虚电路机制的子网中,因为建立虚电路的呼叫请求分组也要寻址以穿过子网,故此问题偶而也会出现。所以在传送协议的设计中,对此要采取相应对策。
避免迟到分组的影响的方法很多,但都不十分令人满意。一种方法是抛弃传送地址。在这种方法中,每需要一个传送地址时,一般是根据现行时间值重新产生一个新的唯一的传送地址,当连接关闭时,这个地址被永远抛弃。但这种方法使得常用的进程服务方式无法实现(没有众所周知的地址)。另一种稍微变化了的方法是不允许源地址重新使用,但允许目的地址重新使用。第三种方法是设置很大的顺序号空间,以使顺序号要经过相当长的时间才会重复(这时不会再有具有同一地址的迟到分组)。但这些方法要求每台主机都保留一些历史信息,如果一台主机因事故停机并且失去了所存储的历史信息,它将无法把握目前的状态,因此需要采用另外的方法来解决这个问题。
由于迟到分组总要在子网内滞留一定的时间后才能对正常传输产生影响,所以,只要能保证每个分组留在子网内的时间不超过某个值,对超过该值的分组由子网加以去除,即可解决这个问题。每个分组可以停留在子网内的最大时间被称为分组最长寿命(packet lifetime)。
分组的最长寿命可以用许多方法来限制。例如,对子网采用特殊的设计使其不会发生循环和拥挤,并用子网内的最长道路长来限制分组所经过的跳跃数;在每个分组中设置一个跳跃计数器,过一跳跃减一,一旦记数值变成0,该分组就被除去;采用计时打印法使每个分组发出时都记上时间,待查出该分组超时后即将其丢弃,但这种方法要求所有机器时钟同步。
在实践中,不仅需要保证某个分组在超过最长寿命后被除去,而且还应保证有关该分组的一切应答信息也被除去。为此引出寿命参数T,它是分组最长寿命的某个小的倍数。此倍数与协议有关,一般是T≥2×报文分组最长寿命。一个分组被发送出去T时间后,有关它的一切踪迹就已全部消失,即该分组及其应答都不会重新出现,从而不会干扰正常的传输过程。
由于子网有存储的能力,若主机发送的速度太快,以致在一个分组寿命时间内发出分组的顺序号能在序号空间上循环一周,那么子网内就可能存在两个有相同的顺序号且都未应答的分组,从而也可能造成迟到分组所引起的错误。所以,若顺序号有k比特,还必须限制主机在T间隔内发出的分组不能多于2k个。
可以分组的最长寿命界限为基础来处理迟到分组。例如,在关闭一个连接以后必须等待T时间后才允许别的连接以相同的标识符(连接号、地址对)开放,从而保证了以前所有的分组都被抑制。但这种方法有两个严重的缺点:开放新的连接的要求要被延迟T时间,主机必须维持不再存在了的有关连接的信息(如连接号、地址对等)T时间。另一种方法是不在开放新连接时延迟T时间,但要求主机将上次用到的顺序号保持T时间。这样,当旧的分组依然存在时,如果要重新打开连接,因新旧顺序号之间没有重叠部分,也不会产生混乱。这两种方法都要求主机将某些以前已经关闭掉的连接的某些信息保持T时间,但在主机有发生事故的可能时,唯一安全的方法是重新打开任一个连接之前要等待T时间。(www.xing528.com)
Tomlinson于1975年提出了一种解决有迟到报文分组情况下同步问题的方法。这种方法通过为每台主机装备时钟的方法来避免因主机故障后损失所有存储所造成的不良影响。不同主机的时钟不需要同步,但假设均采用二进制计数的形式,自身的增量以均匀的间距增加;计数器的位数必须等于或者超出信息顺序号码的位数;最重要的一点是要求在主机暂停情况下,时钟仍连续运转。
图6.3.1 Tomlinson法中禁区的作用
Tomlinson法的基本思想是保证二个有相同顺序号的分组(报文)不会在相同的时间内是未应答的。当一个连接建立时,用时钟低k位作为其起始顺序号,这样,每个连接建立时所用的起始顺序号都是不同的,以后的报文分组所用的顺序号都在这个起始顺序号的基础上每次增一。如图6.3.1所示,起始顺序号是线性的,且斜率为1,而实际顺序号线则不一定,当均匀使用顺序号时,它为直线,而非均匀使用时,就不一定是直线了,不过在这里假设是均匀使用顺序号的。为避免主机故障之后等待T秒,在顺序号使用上还要有一个限制,就是在某顺序号被用作初始序号之前要保证在T时间内未被用过,这构成了由非法时间和顺序号结合起来的一个区域,该区域被称为禁区。在任何一个连接要发送报文分组之前,都要读时钟并检查了解它是否使用了在禁区中的值作为顺序号,若发现顺序号处于禁区,干脆停一个T时间,然后再发送。这样,就不会在主机突然故障重新恢复时选用的初始顺序值与网内某个报文分组的序号相同。
现用一例来说明禁区的作用。假设某子网的分组寿命参数T=60s,时钟以秒为最低位,每秒跳变一次,选k=7位作为初始顺序号值。现在假定在第61s时打开了4号连接,此时初始顺序号为61,此后在此连接上连续发送了19个报文,又回到30s时,发出了顺序号为80的报文。此后主机突然故障但又很快地重新恢复,在时间为70s时它又打开了与上次相同的4号连接,这时所应采用的初始顺序号为70.紧接着在15s内发出了顺序号为70~80的报文,这样,在时间为85s时,一个新的具有报文顺序号为80的分组进入了子网。如果第一个80号分组比第二个早到达终点,那它就会被接受,而第二个将会被拒绝。造成这一错误的原因是第二次所打开的连接的初始序号70位于禁区。禁区的作用就是保证一个新的初始顺序号在使用之前的T时间内未被用过,也即初始序号不能位于禁区。
在选定了初始顺序之后,如果发送的速率快于时间跳变的速率,那么一开始就会进入禁区,这时应将时钟的跳变间隔缩短,使其快于发送的速率。但即使如此,实际顺序号线也会在某一时刻从后面进入禁区,这时就需要重新同步,这两点可从图6.3.1中看出。另外,选择时钟的多少位(即k为多大)作为顺序号空间,实际上也决定了需要重新同步的时间的长短,当然,总是希望进行重新同步的次数越少越好。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。