目录
1. 引言
一些修改建议,增加TCP的吞吐量或是增加事务功能。
2. 路径MTU发现
2.1 路径MTU概念
一条因特网传输路径中,从源地址到目的地址所经过的路径上所有IP跳的最大传输单元的最小值。也就是说,路径MTU就是无需进行分片处理就能穿过这条“路径”的最大传输单元的最大值。
2.2 路径MTU的发现方法
源地址将数据报的DF(不要分片)位置位,再逐渐增大发送的数据报的大小,若发现当前路径上的路由器需要对正在发送的IP数据报进行分片,路由器就会返回ICMP不可达差错。
目的就是确定两个IP主机之间的路径MTU,从而避免IP分片。
TCP的路径MTU发现方式:
- 连接建立时,TCP使用输出接口或对端声明的MSS中的最小MTU作为起始的报文段大小。
- 该连接上所有被TCP发送的IP数据报都被设置DF比特
- 若中间某个路由器需要对设置了DF标志的数据报进行分片,就会丢弃该数据报并产生ICMP的“不能分片”差错
- 收到了ICMP差错之后,TCP减少段大小并重传
2.3 路径MTU发现机制与TCP协同工作的作用
使TCP为非本地的连接使用大于536字节的MTU,从而增加吞吐量。
3. 长肥管道
3.1 长肥管道的概念
带宽时延乘积(b) = 带宽(b/s) * RTT(s),也称为两端的管道大小,具有大的带宽时延乘积的网络被称为长肥网络(LFN),运行在LFN上的TCP连接就被称为长肥管道。
3.2 长肥管道的问题
- 需要更大的窗口来提供最大的吞吐量——窗口扩大选项
- 分组丢失会使吞吐量急剧减少——快速重传和快速恢复算法
- 需要更好的RTT测量机制——时间戳选项
- TCP序号会被重用——使用TCP的时间戳选项的PAWS(保护回绕的序号)算法
4. 窗口扩大选项
该选项使TCP的窗口定义从16位增加为32位,TCP首部不改变,依然使用16位,而是定义一个选项实现对16位的扩大操作。
主动建立连接的一方在其SYN中发送该选项,被动建立连接的一方只能在收到带有该选项的SYN后才能发送该选项。
注意:
- 两个方向上的扩大因子可以不同
- 每个方向上的扩大因子在连接建立起来后就是固定的
5. 时间戳选项
发送方在每个报文段中放置一个时间戳值,接收方在确认中返回这个数值,从而允许发送方为每一个收到的ACK计算RTT
5.1 时间戳更新算法
对于每个连接只保持一个时间戳的数值,更新机制如下:
- tsrecent变量:下一个ACK中将要发送的时间戳的值;lastack变量:最后发送的ACK中的确认序号。后者就是接收方期望的序号。
- 当一个包含字节号lastack的报文段到达时,该报文段中的时间戳被保存在tsrecent中
- 无论何时发送一个时间戳选项,tsrecent就作为时间戳回显应答字段被发送,而序号字段被保存在lastack中
作用:
- ACK被接收方延迟的情况下,作为回显值的时间戳值对应于最早被确认的报文段;
- 若收到的报文段在窗口范围内但失序,表明前面的报文已丢失。
6. PAWS:防止回绕的序号
接收方将时间戳视为序列号的一个32位的扩展,E时重新出现的报文段的时间戳为2,比最近有效的时间戳小,故PAWS算法将其丢弃。
PAWS算法不需要再发送方和接收方之间进行任何形式的时间同步,接收方只需要时间戳的值单调递增且每个窗口至少增加1.
7. T/TCP:为事务用的TCP扩展
T/TCP是为了增加事务功能而对TCP进行的修改。
7.1 事务(transaction)的特征
- 应避免连接建立和连接终止的开销
- 等待时间应减少到等于RTT和SPT(Server Processing Time)之和
- 服务器应能检测出重复的请求,且收到重复的请求时不重新处理
7.2 改动一:避免三次握手
T/TCP通过使用 “加速打开” 来避免三次握手:
- 为打开的连接指定一个32位的连接计数CC,每次使用时加1
- 两个主机之间的每一个报文段都包括一个新的TCP选项CC,长度为6字节,包含发送方在该连接上的32位的CC值
- 一个主机维持一个缓存,保存上一次的CC值(从来自该主机的一个可接受的SYN报文段中获得)
- 接收方比较收到的CC值与发送方缓存的CC值的大小,若收到的CC比缓存的大,说明该SYN报文段是新的,报文段中的数据都被传递给接受应用进程,该连接称为半同步;若收到的CC比缓存的小,或接收主机上没有对应该客户的缓存CC,就执行正常的TCP三次握手。
该策略避免了三次握手,除非客户或服务器已经崩溃并重启,代价是服务器需要记住从每个客户接收的最近的CC值。
7.3 改动二:缩短TIME_WAIT状态
在两个主机之间测量RTT来动态计算TIME_WAIT的延时,TIME_WAIT的时延被设为8倍的重传超时值RTO
- 服务器的SYN和ACK必须被延迟,从而允许应答与它一起捎带发送
- 服务器必须对失序的请求报文段进行处理
- API必须使服务器进程用一个单一的操作来发送数据和关闭连接,从而允许第二个报文段中的FIN与应答一起捎带发送
- 给定主机的MSS应与其CC值一起缓存
- 客户未接收到来自服务器的窗口通告前也可以向服务器发送数据
- 使用最小3个报文段交换,每个方向上只能计算一个RTT
8. TCP的性能
TCP最大吞吐量的实际限制:
- 不能比最慢的链路运行得更快
- 不能比最慢的机器的内存运行得更快
- 不能比由接收方提供的窗口大小除以往返时间所得结果运行得更快(使用窗口大小作为带宽时延乘积)
TCP最高运行速率的真正上限是由TCP的窗口大小和光速决定的。
9. 小结
- 路径MTU发现在MTU较大时,对于非本地连接,允许TCP使用比默认的536大的窗口,可以提高性能
- 长肥管道的处理——窗口扩大选项、时间戳选项、PAWS算法(接收方提供序号回绕保护)
- 为事务用的TCP扩展——T/TCP,允许一个客户-服务器的请求-应答序列在一般情况下只用3个报文段来实现。