第25章 TCP:性能

所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现

本章描述TCP的性能问题和优化,包括长肥管道、窗口扩大选项、时间戳选项、选择性确认和路径MTU发现等。


25.1 引言

TCP性能的重要性

TCP性能的重要性:

  • TCP是最常用的传输协议
  • 性能影响用户体验
  • 性能影响网络效率
  • 优化很重要

TCP性能很重要。


影响TCP性能的因素

影响TCP性能的因素:

  • 带宽
  • 延迟
  • 丢包率
  • 窗口大小
  • MSS大小
  • 拥塞控制算法
  • 等等

很多因素影响TCP性能。


本章讨论的内容

本章讨论的内容:

  • 长肥管道问题
  • 窗口扩大选项
  • 时间戳选项
  • 选择性确认(SACK)
  • 路径MTU发现
  • TCP性能优化

本章讨论TCP性能和优化。


25.2 长肥管道

什么是长肥管道

长肥管道(Long Fat Pipe, LFN):

  • 长:延迟大
  • 肥:带宽高
  • 带宽延迟积很大
  • 普通TCP不够用

例子:

  • 带宽:1Gbps
  • 延迟:100ms
  • 带宽延迟积 = 1Gbps × 0.1s = 12.5MB
  • 普通TCP窗口最大65535字节
  • 远远不够

长肥管道需要特殊处理。


长肥管道的问题

长肥管道的问题:

  1. 窗口不够大

    • 16位窗口字段,最大65535字节
    • 长肥管道需要更大的窗口
    • 跑不满带宽
  2. 序号回绕

    • 32位序号
    • 高速网络下很快就回绕了
    • 旧的分组可能混淆
  3. RTT测量不准

    • 重传歧义
    • RTT测量不准
  4. 丢包影响大

    • 窗口大,丢一个重传很多
    • 影响吞吐量

长肥管道有很多问题。


解决方法

长肥管道的解决方法:

  1. 窗口扩大选项

    • 扩大窗口字段
    • 支持更大的窗口
  2. 时间戳选项

    • 更精确的RTT测量
    • PAWS防止序号回绕
  3. 选择性确认(SACK)

    • 更精确的重传
    • 只重传丢的
  4. 路径MTU发现

    • 使用最大的MSS
    • 提高效率

各种选项解决长肥管道的问题。


25.3 窗口扩大选项

什么是窗口扩大选项

窗口扩大选项(Window Scale Option):

  • TCP选项的一种
  • 扩大窗口字段的范围
  • 16位 → 更大
  • 支持更大的窗口

为什么需要:

  • 16位窗口最大65535字节
  • 长肥管道不够
  • 需要更大的窗口

窗口扩大选项支持更大的窗口。


窗口扩大选项的原理

原理:

  • 窗口字段还是16位
  • 但是有一个移位因子
  • 实际窗口 = 窗口值 << 移位因子
  • 移位因子最大14
  • 最大窗口 = 65535 << 14 ≈ 1GB

移位因子:

  • 0到14
  • 0就是原来的
  • 14就是最大的

用移位的方式扩大窗口。


窗口扩大选项的协商

协商过程:

  • 连接建立时协商
  • SYN报文带窗口扩大选项
  • 双方都支持才启用
  • 移位因子各自独立

为什么要在SYN中协商:

  • 建立连接时确定
  • 之后不能改
  • 双方都要支持才行

连接建立时协商。


窗口扩大选项的格式

窗口扩大选项的格式:

  • 类型:3
  • 长度:3
  • 移位计数:1字节(0-14)
+-------+-------+-------+
| 类型=3| 长度=3|移位计数|
+-------+-------+-------+

3字节的选项。


25.4 时间戳选项

什么是时间戳选项

时间戳选项(Timestamp Option):

  • TCP选项的一种
  • 每个报文带时间戳
  • 用于更精确的RTT测量
  • 用于PAWS(防止序号回绕)

时间戳选项有两个用途。


RTT测量

RTT测量:

  • 发送方在报文里放时间戳
  • 接收方在ACK里原样返回
  • 发送方收到ACK,计算RTT
  • 每个ACK都能测,不用等一个段

好处:

  • 更精确的RTT测量
  • 每个ACK都能测
  • 不受重传歧义影响

时间戳让RTT测量更精确。


PAWS:防止序号回绕

PAWS(Protection Against Wrapped Sequence numbers):

  • 防止序号回绕导致的混淆
  • 高速网络下序号很快回绕
  • 旧的分组可能被当成新的

怎么防止:

  • 每个报文带时间戳
  • 时间戳是一直增加的
  • 旧的分组时间戳小
  • 收到时间戳小的,丢弃

PAWS用时间戳防止序号回绕。


时间戳选项的格式

时间戳选项的格式:

  • 类型:8
  • 长度:10
  • 时间戳值:4字节
  • 时间戳回显:4字节
+-------+-------+-------------------+-------------------+
| 类型=8|长度=10|   时间戳值        |   时间戳回显      |
+-------+-------+-------------------+-------------------+

10字节的选项。


25.5 选择性确认(SACK)

什么是选择性确认

选择性确认(Selective Acknowledgment, SACK):

  • TCP选项的一种
  • 可以确认不连续的数据块
  • 告诉发送方哪些收到了,哪些没收到
  • 发送方只重传丢的

SACK让重传更精确。


为什么需要SACK

为什么需要SACK:

问题:

  • 累积确认只能确认到某个位置
  • 中间丢了,后面的收到了
  • 发送方不知道后面的收到了
  • 可能重传已经收到的
  • 效率低

SACK的解决:

  • 告诉发送方哪些块收到了
  • 发送方只重传没收到的
  • 提高效率
  • 特别是窗口大的时候

SACK解决了多包丢失的问题。


SACK的工作原理

SACK的工作原理:

  1. 接收方

    • 收到乱序的数据
    • 记录收到的块
    • 在SACK选项中告诉发送方
  2. 发送方

    • 收到SACK
    • 知道哪些收到了
    • 只重传没收到的
    • 不用重传已经收到的

SACK让重传更高效。


SACK的格式

SACK选项的格式:

  • 类型:5
  • 长度:可变
  • 多个块,每个块8字节(左边界+右边界)
  • 最多4个块
+-------+-------+-------------------+-------------------+
| 类型=5| 长度  |   块1左边界       |   块1右边界       |
+-------+-------+-------------------+-------------------+
|   块2左边界       |   块2右边界       |
+-------------------+-------------------+
|       ...       |       ...       |
+-------------------+-------------------+

可变长度的选项。


25.6 路径MTU发现

什么是路径MTU发现

路径MTU发现(Path MTU Discovery, PMTUD):

  • 发现路径上的最小MTU
  • 发送合适大小的分组
  • 避免分片
  • 提高效率

路径MTU发现避免分片。


为什么需要路径MTU发现

为什么需要:

  • 不同链路MTU不同
  • 路径上最小的MTU是瓶颈
  • 发大了会分片,效率低
  • 发小了浪费带宽
  • 找到刚好的大小最好

找到路径MTU,效率最高。


路径MTU发现的原理

原理:

  1. 发送分组,设置DF位(不分片)
  2. 如果中间链路MTU不够
    • 路由器丢弃
    • 发ICMP不可达(需要分片)
  3. 收到ICMP后,减小MTU
  4. 重新发送
  5. 直到能通过

DF位:

  • Don’t Fragment
  • 不分片
  • MTU不够就丢弃,发ICMP

用DF位和ICMP发现路径MTU。


路径MTU发现的问题

问题:

  1. ICMP被过滤

    • 有些防火墙过滤ICMP
    • 收不到ICMP
    • 不知道MTU变小了
    • 分组丢了,不知道原因
  2. MTU变化

    • 路由变化,MTU可能变
    • 需要重新发现
  3. 性能影响

    • 发现过程中丢包
    • 影响性能

路径MTU发现也有问题。


25.7 TCP性能优化总结

性能优化技术总结

TCP性能优化技术:

技术作用选项类型
窗口扩大支持更大的窗口选项3
时间戳精确RTT测量 + PAWS选项8
SACK选择性确认,精确重传选项5
路径MTU发现避免分片,提高效率DF位+ICMP
慢启动/拥塞避免拥塞控制算法
快速重传/快速恢复快速恢复算法

各种优化技术提高性能。


性能优化的建议

性能优化建议:

  1. 开启窗口扩大

    • 大带宽延迟积需要
    • 现在一般默认开启
  2. 开启时间戳

    • 精确RTT测量
    • PAWS
    • 现在一般默认开启
  3. 开启SACK

    • 提高丢包恢复效率
    • 现在一般默认开启
  4. 开启路径MTU发现

    • 避免分片
    • 提高效率
    • 现在一般默认开启
  5. 增大缓冲区

    • 大窗口需要大缓冲区
    • 根据需要调整
  6. 使用合适的MSS

    • 大的MSS效率高
    • 路径MTU发现

各种优化建议。


25.8 小结

长肥管道

  1. 什么是长肥管道

    • 高带宽大延迟
    • 带宽延迟积大
  2. 问题

    • 窗口不够大
    • 序号回绕
    • RTT测量不准
    • 丢包影响大
  3. 解决方法

    • 窗口扩大
    • 时间戳
    • SACK
    • 路径MTU发现

窗口扩大选项

  1. 作用

    • 支持更大的窗口
    • 长肥管道需要
  2. 原理

    • 移位因子
    • 实际窗口 = 窗口值 << 移位
  3. 协商

    • SYN中协商
    • 双方都支持才启用

时间戳选项

  1. 作用

    • 精确RTT测量
    • PAWS防止序号回绕
  2. RTT测量

    • 每个ACK都能测
    • 更精确
  3. PAWS

    • 时间戳一直增加
    • 旧的时间戳小,丢弃

选择性确认(SACK)

  1. 作用

    • 确认不连续的块
    • 只重传丢的
    • 提高效率
  2. 原理

    • 接收方报告收到的块
    • 发送方只重传没收到的
  3. 格式

    • 多个块
    • 每个块左右边界

路径MTU发现

  1. 作用

    • 发现路径最小MTU
    • 避免分片
    • 提高效率
  2. 原理

    • DF位
    • ICMP不可达
    • 减小MTU重试
  3. 问题

    • ICMP被过滤
    • MTU变化

性能优化总结

  1. 优化技术

    • 窗口扩大
    • 时间戳
    • SACK
    • 路径MTU发现
    • 拥塞控制算法
  2. 优化建议

    • 开启各种选项
    • 增大缓冲区
    • 合适的MSS

关键概念

  1. 长肥管道

    • 高带宽大延迟
    • 需要特殊处理
  2. 窗口扩大

    • 支持大窗口
    • 移位因子
  3. 时间戳

    • RTT测量
    • PAWS
  4. SACK

    • 选择性确认
    • 精确重传
  5. 路径MTU发现

    • 避免分片
    • DF+ICMP

时间戳