【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能

时间:2021-11-22 22:07:08

来到了TCP的最后一个章节,未来与性能。在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验。

主要内容:

  • 路径MTU的发现与TCP的结合。
  • 长肥管道 和 高速千兆比网络。
  • 窗口扩大选项。
  • 时间戳选项 和 PAWS算法。
  • T/TCP。
  • TCP的性能。

24.1 前言

本章讨论TCP的一些修改建议,这些建议 可以使TCP在高速率环境中获得最大的吞吐量。使用路径MTU发现机制可以增加吞吐量。
长肥管道:带宽时延乘积很大的网络。以及TCP在这些网络上面的局限性。为了处理长肥管道,增加了两个选项:

  • 窗口扩大选项(增大TCP的最大窗口)
  • 时间戳选项(更加精确的计算RTT,防止序号回绕)

这些新选项允许TCP实现能够向后兼容。

以及现在被遗忘的T/TCP,TCP事务协议。

24.2 路径MTU发现

其实本质上并没有与之前我们介绍的路径MTU有什么区别,这是在 当前两个主机之间的路径上任何网络的最小MTU。

MSS:网络允许传输数据的最大值
MTU = MSS + 数据报头的长度

路径MTU发现 在IP首部中 设置了DF(不要分片),如果中间的路由器需要对IP数据报进行分片,将返回一个ICMP不可达差错,通过这个差错可以确定路径MTU。

具体实现

连接建立的时候,TCP使用输出端口或者对端声明的MSS中的最小MTU作为起始的报文段大小。路径MTU不允许TCP超过 对端声明的MSS。如果对端没有声明,则默认536.
一旦选定了报文段的大小,所有被TCP发送的IP数据报 都将被设置为DF。

如果中间的某个路由器需要对它进行分片,那么就丢弃该报文段,并且返回一个ICMP不可达差错报文。
收到这个报文之后,TCP就减小报文段的长度进行重传。

  • 如果这个ICMP报文和之前的报文类似(旧的ICMP),也就是说 之前减小的报文段还不足以通过发送ICMP报文的路由器,TCP就继续尝试下一个可能的最小MTU。
  • 如果这个ICMP报文是 路由器产生的较新的ICMP差错(路由发生了变化),那么报文段的大小就被设置为 下一跳的MTU减去IP和TCP的首部长度。

当这个重传发生的时候,拥塞窗口不变,但是需要进行慢启动。

由于路由是动态变化的,因此在最后一次减小报文段大小的一段时间之后,可以尝试使用一个较大的值,但是不能超过 min{对端声明的MSS,输出接口MTU的最小值}。

主要作用:
避免IP数据报进行分片,因为即使丢弃了其中的一片数据,都会导致TCP进行重传,降低了传输性能。

24.3 长肥管道

当带宽时延乘积越来越大的时候,TCP的局限性就会暴露出来。

具有大的 带宽时延乘积 的网络,叫做长肥网络,即LFN。而一个 运行在LFN上的TCP连接 称为长肥管道。它可以被水平拉长(长的RTT),也可以被拉宽(较高的带宽)。

TCP在长肥管道下有以下问题:
(1)需要一个更大的窗口来提供更大的吞吐量。由后面的 窗口扩大选项 改良。
(2)在一个长肥管道LFN中的分组丢失 会使吞吐量急剧减少:如果只有一个报文段丢失,可以利用 快速恢复和快速重传算法 避免管道的耗尽;但是如果有多个分组丢失也会典型的让管道耗尽。可以使用慢启动填满,但是这需要几个RTT的时间。
(3)在长肥管道上,需要更好的 RTT测量机制。由 时间戳选项 改良。
(4)怎么样避免在一个MSL时间内避免 序号回绕:序号空间是有限的,在使用完之后会发生重用,迟到报文段会使数据发生差错。由 PAWS算法 改良。

千兆比网络

在千兆比网络的速率下,时延限制占据了主要的地位,而带宽不再成为限制。
但是时延主要取决于光速,而光速是不可能减小的,这个固定时延带来了一些不便。

24.4 窗口扩大选项

窗口扩大选项 使得TCP的窗口定义从 16bit 增加到 32bit。但是这不是通过修改首部长度来实现的:首部仍然为16bit,通过一个选项定义实现扩大操作。
通过这个选项(移位计数器)的值(连接的时候一般为0 或者 14),对传递的窗口值进行移位的操作,得到真正的窗口值。

这个选项只能出现在SYN报文段中。
为了使用这个扩大选项,连接的两端 必须在它们的SYN报文段中发送这个选项,两边的扩大因子可以不同。
如果主动建立的一方 没有收到另外一方的窗口扩大选项,则把发送和接收的 移位计数器置为0.

TCP根据接收缓存的大小主动选择移位计数。

24.5 时间戳选项

长肥管道需要更为精确的 RTT测量机制。
时间戳选项 使每个发送方在每个报文段中,放置一个时间戳值。接收方在确认中返回这个数值,从而允许 发送方为 每一个收到的ACK计算RTT。(必须说,是收到的ACK而不是每一个报文段,因为 接收端TCP通常用一个ACK确认多个报文段)

包含这个选项的TCP首部,从20bit 增加到 32bit。
时间戳是一个单调递增的值,RFC推荐在 1ms到1s 之间将时间戳的值+1.
与窗口扩大选项类似,需要在 SYN报文段中指定该选项。

关于时间戳算法的准确实现,参考教材的P264,具体两点:

(1)如果ACK被接收方延迟,那么作为回显的 时间戳值 应该是 最早被确认的数据报。
比如 1-1024 和 1025-2048 字节 的报文段到达,每一个都有一个时间戳选项,那么回显的是 1-1024 的时间戳值。

(2)如果收到的报文段乱序,说明前面的报文段丢失。当丢失的报文段到达时,它的时间戳将被回显。
比如有三个数据报按以下顺序接收:1-1024,2049-4072,1025-2048. 在 1025-2048 到达之后,那么返回的ACK带有 1-1024 的时间戳(正常的),1-1024 的时间戳(代表不正常的,重复的失序报文段),还有 1025-2048 的时间戳(丢失的回显)。

这会使 RTT估计过高,但是总比 RTT估计过低好。
无论怎样,回显 2049-4072 会导致RTT的估计出现大的偏差。

24.6 PAWS 防止回绕的序号

PAWS 防止序号的回绕,假定了报文段丢失和重新出现的时间小于 MSL的时间,否则这个迟到的报文段 在TTL到期的时候 被丢弃。
时间戳可以避免这个情况:它是单调递增的,并且每个窗口必须加1.

对比时间戳就可以发现 重新出现的迟到报文段了(时间戳比前面的数据小),有效地防止了数据的紊乱。

24.7 T/TCP

以小结的内容对其进行一个概述。

为事务用的TCP扩展,即T/TCP,允许一个 client/server 的 请求-应答 序列在通常的情况之下只使用三个报文段来完成。它避免三次握手,并缩短了TIME_WAIT状态,其方法是为每个主机高速缓存少量的信息:这些信息曾用于建立一个连接。它还包含数据报文段中使用 FIN 和 SYN 标志。

这只是一种试验性的协议。因为存在安全性问题,并没有成为标准,也没有被应用。

24.8 TCP的性能

教材中对在 10Mb/s的以太网 上计算能够观察到的TCP最大的吞吐量 做了一个计算。

实际的限制:
1.不能比最慢的链路运行更快
2.不能比最慢的机器的内存运行的更快
3.不能比 通告窗口/往返时间RTT 更快(带宽时延公式的变形,求出带宽)

TCP的最高运行速率 的真正上限是由TCP的窗口大小决定的。许多协议的性能问题 在于实现中的缺陷,而不在于协议固有的一些限制。

2016/8/20