第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字节
- 远远不够
长肥管道需要特殊处理。
长肥管道的问题
长肥管道的问题:
-
窗口不够大
- 16位窗口字段,最大65535字节
- 长肥管道需要更大的窗口
- 跑不满带宽
-
序号回绕
- 32位序号
- 高速网络下很快就回绕了
- 旧的分组可能混淆
-
RTT测量不准
- 重传歧义
- RTT测量不准
-
丢包影响大
- 窗口大,丢一个重传很多
- 影响吞吐量
长肥管道有很多问题。
解决方法
长肥管道的解决方法:
-
窗口扩大选项
- 扩大窗口字段
- 支持更大的窗口
-
时间戳选项
- 更精确的RTT测量
- PAWS防止序号回绕
-
选择性确认(SACK)
- 更精确的重传
- 只重传丢的
-
路径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的工作原理:
-
接收方
- 收到乱序的数据
- 记录收到的块
- 在SACK选项中告诉发送方
-
发送方
- 收到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发现的原理
原理:
- 发送分组,设置DF位(不分片)
- 如果中间链路MTU不够
- 路由器丢弃
- 发ICMP不可达(需要分片)
- 收到ICMP后,减小MTU
- 重新发送
- 直到能通过
DF位:
- Don’t Fragment
- 不分片
- MTU不够就丢弃,发ICMP
用DF位和ICMP发现路径MTU。
路径MTU发现的问题
问题:
-
ICMP被过滤
- 有些防火墙过滤ICMP
- 收不到ICMP
- 不知道MTU变小了
- 分组丢了,不知道原因
-
MTU变化
- 路由变化,MTU可能变
- 需要重新发现
-
性能影响
- 发现过程中丢包
- 影响性能
路径MTU发现也有问题。
25.7 TCP性能优化总结
性能优化技术总结
TCP性能优化技术:
| 技术 | 作用 | 选项类型 |
|---|---|---|
| 窗口扩大 | 支持更大的窗口 | 选项3 |
| 时间戳 | 精确RTT测量 + PAWS | 选项8 |
| SACK | 选择性确认,精确重传 | 选项5 |
| 路径MTU发现 | 避免分片,提高效率 | DF位+ICMP |
| 慢启动/拥塞避免 | 拥塞控制 | 算法 |
| 快速重传/快速恢复 | 快速恢复 | 算法 |
各种优化技术提高性能。
性能优化的建议
性能优化建议:
-
开启窗口扩大
- 大带宽延迟积需要
- 现在一般默认开启
-
开启时间戳
- 精确RTT测量
- PAWS
- 现在一般默认开启
-
开启SACK
- 提高丢包恢复效率
- 现在一般默认开启
-
开启路径MTU发现
- 避免分片
- 提高效率
- 现在一般默认开启
-
增大缓冲区
- 大窗口需要大缓冲区
- 根据需要调整
-
使用合适的MSS
- 大的MSS效率高
- 路径MTU发现
各种优化建议。
25.8 小结
长肥管道
-
什么是长肥管道
- 高带宽大延迟
- 带宽延迟积大
-
问题
- 窗口不够大
- 序号回绕
- RTT测量不准
- 丢包影响大
-
解决方法
- 窗口扩大
- 时间戳
- SACK
- 路径MTU发现
窗口扩大选项
-
作用
- 支持更大的窗口
- 长肥管道需要
-
原理
- 移位因子
- 实际窗口 = 窗口值 << 移位
-
协商
- SYN中协商
- 双方都支持才启用
时间戳选项
-
作用
- 精确RTT测量
- PAWS防止序号回绕
-
RTT测量
- 每个ACK都能测
- 更精确
-
PAWS
- 时间戳一直增加
- 旧的时间戳小,丢弃
选择性确认(SACK)
-
作用
- 确认不连续的块
- 只重传丢的
- 提高效率
-
原理
- 接收方报告收到的块
- 发送方只重传没收到的
-
格式
- 多个块
- 每个块左右边界
路径MTU发现
-
作用
- 发现路径最小MTU
- 避免分片
- 提高效率
-
原理
- DF位
- ICMP不可达
- 减小MTU重试
-
问题
- ICMP被过滤
- MTU变化
性能优化总结
-
优化技术
- 窗口扩大
- 时间戳
- SACK
- 路径MTU发现
- 拥塞控制算法
-
优化建议
- 开启各种选项
- 增大缓冲区
- 合适的MSS
关键概念
-
长肥管道
- 高带宽大延迟
- 需要特殊处理
-
窗口扩大
- 支持大窗口
- 移位因子
-
时间戳
- RTT测量
- PAWS
-
SACK
- 选择性确认
- 精确重传
-
路径MTU发现
- 避免分片
- DF+ICMP