【TCP-IP详解卷一:协议】ch24 TCP的未来和性能

目录

1. 引言

一些修改建议,增加TCP的吞吐量或是增加事务功能。

2. 路径MTU发现

2.1 路径MTU概念

一条因特网传输路径中,从源地址到目的地址所经过的路径上所有IP跳的最大传输单元的最小值。也就是说,路径MTU就是无需进行分片处理就能穿过这条“路径”的最大传输单元的最大值。

2.2 路径MTU的发现方法

源地址将数据报的DF(不要分片)位置位,再逐渐增大发送的数据报的大小,若发现当前路径上的路由器需要对正在发送的IP数据报进行分片,路由器就会返回ICMP不可达差错。

目的就是确定两个IP主机之间的路径MTU,从而避免IP分片。

TCP的路径MTU发现方式

  1. 连接建立时,TCP使用输出接口或对端声明的MSS中的最小MTU作为起始的报文段大小。
  2. 该连接上所有被TCP发送的IP数据报都被设置DF比特
  3. 若中间某个路由器需要对设置了DF标志的数据报进行分片,就会丢弃该数据报并产生ICMP的“不能分片”差错
  4. 收到了ICMP差错之后,TCP减少段大小并重传

2.3 路径MTU发现机制与TCP协同工作的作用

使TCP为非本地的连接使用大于536字节的MTU,从而增加吞吐量。

3. 长肥管道

3.1 长肥管道的概念

带宽时延乘积(b) = 带宽(b/s) * RTT(s),也称为两端的管道大小,具有大的带宽时延乘积的网络被称为长肥网络(LFN),运行在LFN上的TCP连接就被称为长肥管道

3.2 长肥管道的问题

  1. 需要更大的窗口来提供最大的吞吐量——窗口扩大选项
  2. 分组丢失会使吞吐量急剧减少——快速重传和快速恢复算法
  3. 需要更好的RTT测量机制——时间戳选项
  4. TCP序号会被重用——使用TCP的时间戳选项的PAWS(保护回绕的序号)算法

4. 窗口扩大选项

该选项使TCP的窗口定义从16位增加为32位,TCP首部不改变,依然使用16位,而是定义一个选项实现对16位的扩大操作。
主动建立连接的一方在其SYN中发送该选项,被动建立连接的一方只能在收到带有该选项的SYN后才能发送该选项。

注意

  1. 两个方向上的扩大因子可以不同
  2. 每个方向上的扩大因子在连接建立起来后就是固定的

5. 时间戳选项

发送方在每个报文段中放置一个时间戳值,接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT

5.1 时间戳更新算法

对于每个连接只保持一个时间戳的数值,更新机制如下:

  1. tsrecent变量:下一个ACK中将要发送的时间戳的值;lastack变量:最后发送的ACK中的确认序号。后者就是接收方期望的序号。
  2. 当一个包含字节号lastack的报文段到达时,该报文段中的时间戳被保存在tsrecent中
  3. 无论何时发送一个时间戳选项,tsrecent就作为时间戳回显应答字段被发送,而序号字段被保存在lastack中

作用

  1. ACK被接收方延迟的情况下,作为回显值的时间戳值对应于最早被确认的报文段;
  2. 若收到的报文段在窗口范围内但失序,表明前面的报文已丢失。

6. PAWS:防止回绕的序号

【TCP-IP详解卷一:协议】ch24 TCP的未来和性能接收方将时间戳视为序列号的一个32位的扩展,E时重新出现的报文段的时间戳为2,比最近有效的时间戳小,故PAWS算法将其丢弃。
PAWS算法不需要再发送方和接收方之间进行任何形式的时间同步,接收方只需要时间戳的值单调递增且每个窗口至少增加1.

7. T/TCP:为事务用的TCP扩展

T/TCP是为了增加事务功能而对TCP进行的修改。

7.1 事务(transaction)的特征

  1. 应避免连接建立和连接终止的开销
  2. 等待时间应减少到等于RTT和SPT(Server Processing Time)之和
  3. 服务器应能检测出重复的请求,且收到重复的请求时不重新处理

7.2 改动一:避免三次握手

T/TCP通过使用 “加速打开” 来避免三次握手:

  1. 为打开的连接指定一个32位的连接计数CC,每次使用时加1
  2. 两个主机之间的每一个报文段都包括一个新的TCP选项CC,长度为6字节,包含发送方在该连接上的32位的CC值
  3. 一个主机维持一个缓存,保存上一次的CC值(从来自该主机的一个可接受的SYN报文段中获得)
  4. 接收方比较收到的CC值与发送方缓存的CC值的大小,若收到的CC比缓存的大,说明该SYN报文段是新的,报文段中的数据都被传递给接受应用进程,该连接称为半同步;若收到的CC比缓存的小,或接收主机上没有对应该客户的缓存CC,就执行正常的TCP三次握手。

该策略避免了三次握手,除非客户或服务器已经崩溃并重启,代价是服务器需要记住从每个客户接收的最近的CC值。

7.3 改动二:缩短TIME_WAIT状态

在两个主机之间测量RTT来动态计算TIME_WAIT的延时,TIME_WAIT的时延被设为8倍的重传超时值RTO

  1. 服务器的SYN和ACK必须被延迟,从而允许应答与它一起捎带发送
  2. 服务器必须对失序的请求报文段进行处理
  3. API必须使服务器进程用一个单一的操作来发送数据和关闭连接,从而允许第二个报文段中的FIN与应答一起捎带发送
  4. 给定主机的MSS应与其CC值一起缓存
  5. 客户未接收到来自服务器的窗口通告前也可以向服务器发送数据
  6. 使用最小3个报文段交换,每个方向上只能计算一个RTT

8. TCP的性能

TCP最大吞吐量的实际限制:

  1. 不能比最慢的链路运行得更快
  2. 不能比最慢的机器的内存运行得更快
  3. 不能比由接收方提供的窗口大小除以往返时间所得结果运行得更快(使用窗口大小作为带宽时延乘积)

TCP最高运行速率的真正上限是由TCP的窗口大小和光速决定的。

9. 小结

  1. 路径MTU发现在MTU较大时,对于非本地连接,允许TCP使用比默认的536大的窗口,可以提高性能
  2. 长肥管道的处理——窗口扩大选项、时间戳选项、PAWS算法(接收方提供序号回绕保护)
  3. 为事务用的TCP扩展——T/TCP,允许一个客户-服务器的请求-应答序列在一般情况下只用3个报文段来实现。
上一篇:上手 WebRTC DTLS 遇到很多 BUG?浅谈 DTLS Fragment


下一篇:MongoDB——WiredTiger运行时参数优化(转)