TCP 传输控制协议( 四 )


出现了SYN,那么SEG.SEQ是SYN的序列号 。
初始序列号选择
协议对于特定连接被重复使用没有什么限制 。连接是由一对套接字定义的 。新的连接实
例被定义为连接的另一次恢复,这就带来了问题:TCP假如确定多个数据段是从以前连接
的另一次恢复中取得的呢?这个问题在连接迅速打开和关闭,或因为内存原因被关闭然
后又迅速建立后显示非凡突出 。
为了避免混乱,用户必须避免因此恢复使用某一连接,而使序列号发生混乱 。我们必须
保证序列号的正确性,即使TCP失败,根本不知道以前的序列号是什么的情况下也要保证
序列号的正确性 。当新的连接被创建时,产生一个新的初始序列号(ISN)产生子,它用
来选择一个新的32位ISN 。产生子和32位时钟的低度位字节相关,低位字节的刷新频率大
概是4微秒,因此ISN的循环时间大概是4.55小时 。因此我们把网络包的最长生存时间(
MSL)小于4.55小时,因此我们可以认为ISN是唯一的 。对于每个连接都有发送序列号和
接收序列号,初始发送序列号(ISS)由发送TCP选择,而初始接收序列号是在连接建立
过程中产生的 。
对于将要连接或初始化的连接,两个TCP必须和对方的初始序列号同步 。这通过交换一个
控制位SYN和初始序列号完成 。我们把带有SYN的数据段称为"SYNs" 。同步的获得过程这
里就不重复了,每方必须发送自己的序列号并返回对对方序列号的确认 。
1) A --> B SYN 本方序列号是X
2) A <-- B ACK 本方序列号被确认
3) A <-- B SYN 对方序列号是Y
4) A --> B ACK 确认对方序列号
上面的第2步和第3步可以合并,这时可以成为3阶段,所以我们可以称它为三消息握手 。
这个过程是必须的,因为序列号不和全局时钟关联,TCP也可以有不同的机制选择ISN 。
接收到第一个SYN的接收方不可能知道这个数据段是不是被延时,除非它记住了在连接上
使用的最近的序列号(这通常是不可能的),因此它必须要求发送者确认 。
为了保证TCP获得的确认是刚才发送的段产生的,而不是仍然在网络中的老数据段产生的
,因此TCP必须在MSL时间之内保持沉默 。在本文中,我们假设MSL=2小时,这是出于工程
的需要,假如用户觉得可以,他可以改变MSL 。请注重假如TCP重新初始化,而内存中的
序列号正在使用,不需要等待,但必须确认使用的序列号比当前使用的要大 。
假如一台主机在未保留任何序列号的情况下失败,那么它应该在MSL时间之内不发出任何
数据段 。下面将会这一情况进行说明 。TCP的实现可以不遵守这个规定,但是这会造成老
数据被当成新数据接收,而新数据被当成老数据拒绝的情况 。
每当数据段形成并进入输出队列,TCP会为它指定序列空间中的一个值 。TCP中多复本检
测和序列算法都依靠于这个地址空间,在对方发送或接收之前不会超过2的32次方个包存
在于输出队列中 。所有多余的数据段都会被删除 。假如没有这个规定,会出现多个数据
段被指定同一个序列号的情况,会造成混乱 。数据段中序列号的多少和数据段中的字节
数一样多 。
在通常情况下,TCP保留下一个要发送的序列号和还未确认的最老的序列号,不要在没有
确认的时候就再次使用,这样会有些风险,也正是因为这样的目的,所以序列空间很大
。对于2M的网络,要4.5小时来耗尽序列空间,因为一个数据段可能的最大生存时间也不
过十几分之一秒,这就留下了足够的空间;而在100M的网络上需要5.4分钟,虽然少了点

推荐阅读