2.3 高速网络

TCP最早是在1980年代初部署的,当时的骨干网络的链路带宽只有数十 Kbps。随着网络速度的不断提升,很自然,大量的注意力被投入到适配 TCP 上来。原则上来说,网络速度的变化与后续章节中介绍的拥塞控制算法的发展是独立的,但拥塞控制算法的部署与网络速度的增加是同时发生的,所以这两个问题不幸的被混淆在了一起。在 TCP 头部有一些扩展同时解决了这两个问题,这又进一步模糊了这两个问题的边界。最后,值得注意的是,带宽延迟积的增加的确对拥塞控制有影响,后续章节中讨论的一些方法就是处理该问题的。

在本节中,我们将探讨高速网络面临的挑战,而用于解决这些挑战的 TCP 扩展的详细信息将推迟到第4章介绍,在那里我们还将考虑相关的拥塞控制机制。目前,我们先关注SequenceNumAdvertisedWindow 的局限性,以及它们对于 TCP 的正确性和性能的影响。

2.3.1 SequenceNum 整数溢出问题

SequenceNum 为32 bit 的整数,在特定连接上可能会导致整数溢出问题——一个SequenceNum为 S 的字节可能在某一时间被发送,然后在稍后的时间内,一个具有相同SequenceNum S 的另一个字节也被发送。我们假设数据包在互联网上的生存时间不会超过 MSL,即 120 秒。因此,我们目前需要确保序列号在 120 秒内不发生整数溢出。这是否会发生取决于数据传输的速度——也就是32 bit SequenceNum被消耗的速度(这个讨论假设我们正尝试尽可能快地消耗SequenceNum,但如果我们的工作是充分利用网络资源,我们肯定会快速的消耗SequenceNum)。在不同带宽的网络上,SequenceNum整数溢出所需的时间如下表所示:

Bandwidth

Time until Wraparound

T1 (1.5 Mbps)

6.2 hours

T3 (44.7 Mbps)

12.8 minutes

OC-3 (148.6 Mbps)

3.9 minutes

OC-48 (2.4 Gbps)

14.3 seconds

OC-192 (9.5 Gbps)

3.6 seconds

10GigE (10 Gbps)

3.4 seconds

在适度的带宽下,32位序列号空间是足够的,但鉴于现在互联网骨干网中常见的 OC-192 连接,以及大多数服务器现在配备 10Gbps 以太网接口,32 bit现在远远不够。一个TCP扩展可以将SequenceNum空间翻倍,以防止SequenceNum整数溢出的问题。这个扩展在拥塞控制中也起了一定的作用,我们将在第 4 章来研究这里的细节(注,即 TCP timestamp option)。

2.3.2 充分利用网络

AdvertisedWindow必须足够大,以便允许发送者保持网络管道是填满数据的。虽然,接收方可以选择不将窗口打开到AdvertisedWindow字段允许的最大值(即65535);我们这里假设接收端有足够的缓存空间来处理当AdvertisedWindow字段为最大值时的数据。

在这个问题里,我们关心的不再是网络带宽。这里是带宽延迟积决定了 AdvertisedWindow 字段需要多大,即,窗口需要打开得足够大,以允许传输一个完整的带宽延迟乘积的数据量。假设 RTT 为 100 毫秒(美国跨国连接的典型数字),下表提供了几种网络的带宽延迟积。注意,对于 OC-n 链路,我们使用了去除 SONET 开销后的可用链路带宽。

Bandwidth

Bandwidth × Delay Product

T1 (1.5 Mbps)

18.8 KB

T3 (44.7 Mbps)

546.1 KB

OC-3 (148.6 Mbps)

1.8 MB

OC-48 (2.4 Gbps)

28.7 MB

OC-192 (9.5 Gbps)

113.4 MB

10GigE (10 Gbps)

119.2 MB

换句话说,TCP的AdvertisedWindow字段比SequenceNum字段的状况更糟糕——它甚至不足以处理横跨美国大陆的T3连接,因为一个16位的字段只能让我们宣告一个64 KB的窗口。

TCP通过一个扩展来完成改进,这个扩展允许接收方宣告一个更大的窗口,从而使发送方能够填满由高速网络所可能带来的更大的带宽延迟积管道。这个扩展包含了一个定义缩放因子 的选项,即,不是把出现在AdvertisedWindow字段中的数字解释为允许发送方有多少字节未被确认,而是允许 TCP 的两端同意AdvertisedWindow字段表示更大的数据块(例如,发送方可以有多少个16字节单位的数据未被确认,如果缩放因子等于 16)。换句话说, 定义窗口缩放因子的选项指定了双方应该将AdvertisedWindow字段向左移动多少位,再使用计算后的结果作为有效窗口。

Last updated