TCP的未来和性能

TCP的未来和性能

路径MTU发现

TCP的路径MTU发现按照如下方式进行:
在建立连接时,TCP使用输出接口或对端声明的MSS中的最小MTU作为起始的报文段大小。路径MTU发现不   允许TCP超过对端声明的MSS,如果对端没有指定一个MSS,默认为536。
所有的TCP发送的IP数据报都被设置了DF比特,不可分片,如果中间路径的MTU小于这个值就会发送一个 ICMP差错报文,表示“不可分片”。发送端收到这个差错报文后减小MTU的大小后重新发送。
默认情况下每10分钟后会尝试使用一个较大的MTU值发送数据。
分组并不是越大越好,大的分组每经过一个路由的时间都会增加,但是传输量会减少而小分组每经过一个路由的时间会减少,但是传输量会增加。
而这些跟网络(分组首部负荷),路由器(选路的决定),和主机(协议处理和设备中断)

长肥管道

我们把一个连接的容量表示为:

	capacity(b) = bandwidth(b/s) * round-trip-time(s)

并称之为带宽延迟乘积,也可称它为两端的管道大小,当这个乘积变得越来越大时,TCP的某些局限性就会暴露出来。
具有大的带宽延迟乘积的网络被称为长肥网络(Long Fat Network,即LFN)。一个运行在LFN上的TCP连接被称为长肥管道。管道可以被水平拉长(一个长的RTT),或者被垂直拉高(较高的带宽),或向两个方向拉升,使用长肥管道会遇到多种问题:
1)TCP首部中窗口大小为16bit,从而将窗口大小限制为65535字节内,但是现在的网络需要一个更大的窗口来提供最大的吞吐量
2)一个长肥网络LFN内的分组丢失会使吞吐量急剧减少。如果只有一个报文段丢失,需要用快速恢复算法来避免管道被耗尽(如果管道被耗尽了,慢启动会渐渐填满,但这个过程需要经过多个RTT)
3)许多TCP实现对每个窗口的RTT仅进行一次测量,他们并不对每个报文段进行RTT测量,在一个长肥网络上需要更好的RTT测量机制
4)TCP对每个字节数据使用一个32bit无符号的序号来进行标识。如果在网络中有一个被延迟一段时间的报文段,它所在的网络连接已被释放,而一个新的连接在这两个主机之间又建立了,怎么才能防止专业的报文段再次出现呢?
IP首部中定义了TTL,最大上限是255跳或者是255秒。TCP定义了MSL推荐值为2分钟,也有许多实现为30秒,序号是32bit,也就是传输了2^32个字节后会被重用,如果一个包含序号N字节数据的报文段在网络上被延迟并在仍然有效时又出现,会发生什么情况?这里主要取决于网速是否够快,如果是一个千兆网络,只需要34秒序号就会发生回绕(也就是序号从0开始一直增加到2^32之后又回到了0),这里会使用一个时间戳的方式来解决这个问题。

窗口扩大选项

TCP首部仍然使用16bit不做修改,通过定义一个选项来扩大完成的
这是一个移位标记,0表示没有扩大,1表示扩大2^1倍,也就是2倍。
这个选项只能出现在SYN报文段中
如果这个值为14,则表示65535 * 2^14 字节
如果一方发送一个非0的窗口扩大因子,但没有从另一端接收一个窗口扩大选项,就将移位技术器设置为0,这就允许较新的系统能够与较旧的、不理解新选项的系统进行互操作。
这里可以看到接收方的SYN报文段中,有一个窗口扩大选项,被设置为7。

时间戳选项

时间戳是一个单调递增的值。由于接收方只需要回显收到的内容,因此不需要关注时间戳单元是什么。这个选项不需要再两个主机之间进行任何形式的时钟同步。
BSD系统在启动时将时间戳设置为0,之后每经过500毫秒将时间戳时钟加1。
为了减少任意一端维持的状态数量,对于每个连接只保持一个时间戳的数值。更新这个数值的算法非常简单:
1)TCP跟踪下一个ACK中将要发送的时间戳的值(一个名为tsrecent的变量)以及最后发送的ACK中确认序号(一个名为lastack的变量)。这个序号就是接收方期望的序号。
2)当一个包含有字节号lastack的报文段达到时,则该报文段中的时间戳被保存在tsrecent中。
3)无论何时发送一个时间戳选项,tsrencent就作为时间戳回显应答字段被发送,而序号字段被保存在lastack中。
这个算法能处理下面两种情况:
1)如果ACK被接收方延迟,则作为回显值的时间戳值应该对应于最早被确认的报文段。如发送了1~1024和1025~2048字节的报文段达到,接收方产生一个2049的ACK来对它进行确认。此时ACK中的时间戳应该是1~1024报文段中的时间戳。因为发送方在进行重传超时时间的计算时,必须将延迟的ACK也考虑在内。
2)如果一个受到的报文段虽然在窗口范围内但同时又是失序,这就表明前面的报文段已经丢失。当那个丢失的报文段达到时,它的时间戳(而不是失序报文段的时间戳)将被回显。
假设有1~1024报文段A
1025~2048报文段B
2049~4072报文段C
如果达到接收方的顺序为A,C,B。那么接收方返回的时间戳ACK应该是对A回复1(报文段A的时间戳),
之后是报文段2(回显的时间戳还是报文段A的),之后是正常的回显报文段C。

PAWS:防止回绕的序号

32bit的序号在一个带宽很大RTT很长的连接内可能会出现回绕,当旧的报文段A没有及时达到,此时发送方又重传了这个报文段标记为B,那么A的时间戳就是1,B的时间戳是2。
当接收方收到2后,一段时间(可能A只是被中间路由延迟了)报文段A又达到了,此时发现最新的时间戳比A要大,于是将A报文段丢弃。
PAWS算法不需要再发送方和接收方中间进行任何形式的时间同步。接收方所需要的就是时间戳的值应该单调自增,并且每个窗口至少增加1。

T/TCP;为事务用的TCP扩展

TCP的扩展,但因为存在安全性问题,并没有成为标准,也没有被应用。

TCP的性能

下面这些实际限制适用于任何的实际情况
1)不能比最慢的链接运行得更快
2)不能比最慢的机器的内存运行的更快
3)不能够比接收方提供的窗口大小除以往返时间所得结果运行的更快(这就是带宽延迟乘积公式)。

参考

路径MTU发现
T/TCP

0 次阅读

发表评论

电子邮件地址不会被公开。