第18章 TCP连接的建立与终止
18.3 连接建立的超时
有很多情况导致无法建立连接。一种情况是服务器主机没有处于正常状态。为了模拟这种情况,我们断开服务器主机的电缆线,然后向它发出t e l n e t命令。图1 8 - 6显示了t c p d u m p的输出。
在这个输出中有趣的一点是客户间隔多长时间发送一个 S Y N,试图建立连接。第2个S Y N与第1个的间隔是5 . 8秒,而第3个与第2个的间隔是2 4秒。
作为一个附注,这个例子运行3 8分钟后客户重新启动。这对应初始序号为291 008 001(约为3 8×6 0×6 4 0 0 0×2)。我们曾经介绍过使用典型的伯克利实现版的系统将初始序号初始化为1,然后每隔0 . 5秒就增加64 000。
另外,因为这是系统启动后的第一个TCP连接,因此客户的端口号是1024。 图1 8 - 6中没有显示客户端在放弃建立连接尝试前进行 S Y N重传的时间。为了了解它我们必须对t e l n e t命令进行计时:
时间差值是 7 6秒。大多数伯克利系统将建立一个新连接的最长时间限制为 7 5秒。我们将在2 1 . 4节看到由客户发出的第 3个分组大约在1 6 : 2 5 : 2 9超时, 客户在它第3个分组发出后4 8秒而不是7 5秒后放弃连接。
18.3.1 第一次超时时间
在图1 8 - 6中一个令人困惑的问题是第一次超时时间为 5 . 8秒,接近6秒,但不准确,相比之下第二个超时时间几乎准确地为 2 4秒。运行十多次测试,发现第一次超时时间在 5 . 5 9秒~ 5 . 9 3秒之间变化。然而,第二次超时时间则总是 2 4 . 0 0秒(精确到小数点后面两位)。
这是因为B S D版的T C P软件采用一种500 ms的定时器。这种500 ms的定时器用于确定本章中所有的各种各样的T C P超时。当我们键入t e l n e t命令,将建立一个6秒的定时器(1 2个时钟滴答(t i c k)),但它可能在之后的 5 . 5秒~ 6秒内的任意时刻超时。图 1 8 - 7显示了这一发生过程。
尽管定时器初始化为 1 2个时钟滴答,但定时计数器会在设置后的第一个 0~500 ms中的任意时刻减1。从那以后,定时计数器大约每隔 500 ms减1,但在第1个500 ms内是可变的(我们使用限定词“大约”是因为在 T C P每隔500 ms获得系统控制的瞬间,系统内核可能会优先处理其他中断)。
当滴答计数器为 0时,6秒的定时器便会超时(见图 1 8 - 7),这个定时器会在以后的 2 4秒 (4 8个滴答)重新复位。之后的下一个定时器将更接近 2 4秒,因为当T C P的500 ms定时器被内核调用时,它就会被修改一次。
18.3.2 服务类型字段
在图1 8 - 6中,出现了符号 [ tos 0x10 ]。这是I P数据报内的服务类型(TO S)字段(参见图3 - 2)。B S D / 3 8 6中的Te l n e t客户进程将这个字段设置为最小时延。