第24章 TCP的未来和性能
所属:TCP/IP详解 卷1:协议 来源:TCP/IP详解 卷1:协议
本章介绍TCP的未来和性能,包括路径MTU发现、长肥管道、窗口扩大选项、时间戳选项和选择性确认等。
24.1 引言
TCP性能问题
TCP性能问题:
- 原始的TCP有一些限制
- 窗口只有16位,最大64KB
- 没有时间戳,RTT测量不准
- 没有选择确认,只能重传前面的
- 长肥管道下性能差
原始TCP有性能限制。
TCP的扩展
TCP的扩展:
- 窗口扩大选项
- 时间戳选项
- 选择性确认(SACK)
- 路径MTU发现
- 等等
目的:
- 提高TCP性能
- 适应高速网络
- 适应长延迟网络
TCP有很多扩展提高性能。
本章讨论的内容
本章讨论的内容:
- 路径MTU发现
- 长肥管道
- 窗口扩大选项
- 时间戳选项
- 选择性确认SACK
- TCP性能
本章介绍TCP的性能和扩展。
24.2 路径MTU发现
什么是路径MTU发现
路径MTU发现(Path MTU Discovery, PMTUD):
- 发现从源到目的的路径上最小的MTU
- 用这个MTU发送
- 避免分片
- 提高效率
路径MTU发现找到路径上最小的MTU。
为什么需要路径MTU发现
为什么需要路径MTU发现:
- 分片不好
- 一个分片丢了,整个都要重传
- 效率低
- 路由器负担重
- 不分片更好
- 一次性发对大小
- 效率高
所以:
- 找到路径上最小的MTU
- 按这个大小发
- 不分片
避免分片,提高效率。
怎么工作的
路径MTU发现的工作过程:
-
发送方假设路径MTU等于出口MTU
- 比如以太网1500
- 设置DF位(不分片)
-
发送数据包
- DF=1
- 如果中间有MTU更小的链路
- 路由器转发不了
- 又不能分片
- 就丢包
-
路由器发ICMP不可达
- 类型:需要分片但DF置位
- 还包含下一跳的MTU
-
发送方收到ICMP
- 知道MTU更小了
- 减小路径MTU
- 用更小的大小重发
-
重复直到能通过
- 不断调整
- 找到合适的MTU
用DF位和ICMP发现路径MTU。
PMTUD的问题
PMTUD的问题:
-
ICMP被过滤
- 有些防火墙过滤ICMP
- 发送方收不到ICMP
- 不知道MTU小了
- 包一直丢
- 连接挂了
-
黑洞问题
- ICMP被过滤
- 包丢了但不知道为什么
- 叫MTU黑洞
-
解决方法
- 探测
- 猜测
- 或者关闭PMTUD
ICMP被过滤会有问题。
24.3 长肥管道
什么是长肥管道
长肥管道(Long Fat Pipe, LFN):
- 长:延迟大
- 肥:带宽高
- 带宽延迟积(BDP)很大
- 管道容量大
例子:
- 跨洋的10Gbps链路
- 延迟100ms
- BDP = 10Gbps × 0.1s = 125MB
- 很大!
长肥管道就是带宽高延迟大的网络。
长肥管道的问题
长肥管道的问题:
-
窗口不够大
- 原始TCP窗口只有16位
- 最大64KB
- 管道有125MB
- 窗口太小填不满
- 吞吐量上不去
-
序号回绕
- 序号只有32位
- 高速网络下
- 序号很快就用完了
- 回绕了
- 旧的和新的分不清
-
RTT测量不准
- 重传的时候
- 不知道ACK是哪个的
- RTT测不准
-
丢包恢复慢
- 丢一个包
- 要等超时
- 或者只能重传一个
- 恢复慢
长肥管道下原始TCP性能差。
解决方法
解决方法:
-
窗口扩大选项
- 把窗口扩大到更大
- 最大可以到1GB
- 填满管道
-
时间戳选项
- 更好的RTT测量
- 防止序号回绕
-
选择性确认SACK
- 可以确认不连续的块
- 快速重传多个
- 恢复快
各种TCP扩展解决长肥管道问题。
24.4 窗口扩大选项
什么是窗口扩大选项
窗口扩大选项(Window Scale Option):
- TCP选项的一种
- 在SYN里协商
- 把窗口大小的位数扩大
- 从16位扩大到最多30位
- 最大窗口从64KB变成1GB
窗口扩大选项增大窗口大小。
怎么工作的
窗口扩大选项怎么工作:
-
连接建立时协商
- SYN里带窗口扩大选项
- 说自己的移位是多少
- 双方都要支持才行
-
移位计数
- 窗口大小字段左移移位位
- 实际窗口 = 窗口字段 << 移位
- 移位最多14位
- 16 + 14 = 30位
- 最大2^30字节 = 1GB
-
数据传输时
- 窗口字段还是16位
- 但实际要乘以2^移位
- 就是更大的窗口
用移位的方式扩大窗口。
为什么用移位
为什么用移位而不是直接加大字段:
- 兼容旧版本
- 旧的TCP不认识这个选项
- 就不用移位,还是16位
- 不影响
- 向后兼容
向后兼容。
效果
窗口扩大选项的效果:
- 窗口最大可以到1GB
- 长肥管道也能填满
- 吞吐量上去了
- 充分利用带宽
大窗口提高吞吐量。
24.5 时间戳选项
什么是时间戳选项
时间戳选项(Timestamp Option):
- TCP选项的一种
- 每个段都带时间戳
- 对方回应的时候带回来
- 可以更准确地测量RTT
- 还可以防止序号回绕
时间戳选项有两个作用。
RTT测量
RTT测量:
-
发送方发段的时候
- 带上当前时间戳
-
接收方回ACK的时候
- 把收到的时间戳再带回去
- 回显
-
发送方收到ACK
- 用当前时间减去时间戳
- 就是RTT
- 很准确
好处:
- 每个段都可以测RTT
- 重传的也能测
- 不用Karn算法那么麻烦
- 更准确
时间戳让RTT测量更准确。
防止序号回绕
防止序号回绕(PAWS, Protection Against Wrapped Sequences):
问题:
- 序号只有32位
- 高速网络下
- 序号很快就用完了
- 回绕了
- 旧的重复的段和新的序号一样
- 分不清哪个是哪个
解决:
- 时间戳
- 旧的段时间戳小
- 新的段时间戳大
- 时间戳小的就丢掉
- 不会混淆
时间戳防止序号回绕。
时间戳的其他用途
时间戳的其他用途:
- 更好的重传超时计算
- 更好的拥塞控制
- 等等
时间戳还有其他用处。
24.6 选择性确认SACK
什么是选择性确认
选择性确认(Selective Acknowledgment, SACK):
- TCP选项的一种
- 可以确认不连续的数据块
- 告诉发送方哪些收到了,哪些没收到
- 发送方可以只重传没收到的
- 不用都重传
SACK可以选择性确认。
为什么需要SACK
为什么需要SACK:
问题:
- 原始TCP是累计确认
- 只能确认到连续的最后一个
- 中间丢了一个
- 后面的都收到了
- 但发送方不知道
- 只能重传丢的那个后面的
- 浪费带宽
例子:
- 发了1-10
- 3丢了
- 4-10都收到了
- 接收方只能ACK 3
- 发送方不知道4-10收到了
- 超时了就从3开始重传
- 4-10白收了,还要重传
- 浪费
累计确认在丢包时效率低。
SACK怎么工作
SACK怎么工作:
-
连接建立时协商
- SYN里带SACK允许选项
- 双方都支持才行
-
接收方收到不连续的数据
- 发SACK
- 告诉发送方哪些块收到了
- 比如:收到了4-10,缺3
-
发送方收到SACK
- 知道哪些收到了,哪些没收到
- 只重传没收到的
- 不用重传已经收到的
- 节省带宽
SACK告诉发送方哪些收到了。
SACK的好处
SACK的好处:
- 丢包恢复快
- 只重传丢的
- 不重传已经收到的
- 节省带宽
- 提高吞吐量
- 长肥管道下尤其有用
SACK提高丢包恢复效率。
24.7 小结
TCP性能概述
-
原始TCP的限制
- 窗口最大64KB
- 序号32位
- 累计确认
- 长肥管道下性能差
-
TCP扩展
- 窗口扩大选项
- 时间戳选项
- 选择性确认SACK
- 路径MTU发现
- 提高性能
路径MTU发现
-
什么是PMTUD
- 发现路径上最小的MTU
- 避免分片
-
怎么工作
- DF位
- ICMP需要分片
- 调整MTU
-
问题
- ICMP被过滤
- MTU黑洞
长肥管道
-
什么是长肥管道
- 带宽高,延迟大
- BDP大
-
问题
- 窗口不够大
- 序号回绕
- RTT测量不准
- 丢包恢复慢
-
解决
- 窗口扩大
- 时间戳
- SACK
窗口扩大选项
-
什么是窗口扩大
- 扩大窗口位数
- 最大30位
- 最大1GB
-
怎么工作
- SYN协商移位
- 实际窗口 = 窗口字段 << 移位
-
效果
- 大窗口
- 填满长肥管道
- 高吞吐量
时间戳选项
-
什么是时间戳
- 每个段带时间戳
- 回显
-
RTT测量
- 每个段都能测
- 更准确
-
防止序号回绕
- PAWS
- 时间戳区分新旧
选择性确认SACK
-
什么是SACK
- 选择性确认
- 可以确认不连续的块
-
为什么需要
- 累计确认效率低
- 丢包要重传很多
-
怎么工作
- 告诉发送方哪些收到了
- 只重传丢的
-
好处
- 恢复快
- 节省带宽
- 提高吞吐量
关键概念
-
路径MTU发现
- 找最小MTU
- 避免分片
-
长肥管道
- 高带宽大延迟
- BDP大
-
窗口扩大选项
- 大窗口
- 最大1GB
-
时间戳选项
- RTT测量
- PAWS
-
选择性确认SACK
- 选择性确认
- 快速恢复