第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发现的工作过程:

  1. 发送方假设路径MTU等于出口MTU

    • 比如以太网1500
    • 设置DF位(不分片)
  2. 发送数据包

    • DF=1
    • 如果中间有MTU更小的链路
    • 路由器转发不了
    • 又不能分片
    • 就丢包
  3. 路由器发ICMP不可达

    • 类型:需要分片但DF置位
    • 还包含下一跳的MTU
  4. 发送方收到ICMP

    • 知道MTU更小了
    • 减小路径MTU
    • 用更小的大小重发
  5. 重复直到能通过

    • 不断调整
    • 找到合适的MTU

用DF位和ICMP发现路径MTU。


PMTUD的问题

PMTUD的问题:

  1. ICMP被过滤

    • 有些防火墙过滤ICMP
    • 发送方收不到ICMP
    • 不知道MTU小了
    • 包一直丢
    • 连接挂了
  2. 黑洞问题

    • ICMP被过滤
    • 包丢了但不知道为什么
    • 叫MTU黑洞
  3. 解决方法

    • 探测
    • 猜测
    • 或者关闭PMTUD

ICMP被过滤会有问题。


24.3 长肥管道

什么是长肥管道

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

  • 长:延迟大
  • 肥:带宽高
  • 带宽延迟积(BDP)很大
  • 管道容量大

例子:

  • 跨洋的10Gbps链路
  • 延迟100ms
  • BDP = 10Gbps × 0.1s = 125MB
  • 很大!

长肥管道就是带宽高延迟大的网络。


长肥管道的问题

长肥管道的问题:

  1. 窗口不够大

    • 原始TCP窗口只有16位
    • 最大64KB
    • 管道有125MB
    • 窗口太小填不满
    • 吞吐量上不去
  2. 序号回绕

    • 序号只有32位
    • 高速网络下
    • 序号很快就用完了
    • 回绕了
    • 旧的和新的分不清
  3. RTT测量不准

    • 重传的时候
    • 不知道ACK是哪个的
    • RTT测不准
  4. 丢包恢复慢

    • 丢一个包
    • 要等超时
    • 或者只能重传一个
    • 恢复慢

长肥管道下原始TCP性能差。


解决方法

解决方法:

  1. 窗口扩大选项

    • 把窗口扩大到更大
    • 最大可以到1GB
    • 填满管道
  2. 时间戳选项

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

    • 可以确认不连续的块
    • 快速重传多个
    • 恢复快

各种TCP扩展解决长肥管道问题。


24.4 窗口扩大选项

什么是窗口扩大选项

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

  • TCP选项的一种
  • 在SYN里协商
  • 把窗口大小的位数扩大
  • 从16位扩大到最多30位
  • 最大窗口从64KB变成1GB

窗口扩大选项增大窗口大小。


怎么工作的

窗口扩大选项怎么工作:

  1. 连接建立时协商

    • SYN里带窗口扩大选项
    • 说自己的移位是多少
    • 双方都要支持才行
  2. 移位计数

    • 窗口大小字段左移移位位
    • 实际窗口 = 窗口字段 << 移位
    • 移位最多14位
    • 16 + 14 = 30位
    • 最大2^30字节 = 1GB
  3. 数据传输时

    • 窗口字段还是16位
    • 但实际要乘以2^移位
    • 就是更大的窗口

用移位的方式扩大窗口。


为什么用移位

为什么用移位而不是直接加大字段:

  • 兼容旧版本
  • 旧的TCP不认识这个选项
  • 就不用移位,还是16位
  • 不影响
  • 向后兼容

向后兼容。


效果

窗口扩大选项的效果:

  • 窗口最大可以到1GB
  • 长肥管道也能填满
  • 吞吐量上去了
  • 充分利用带宽

大窗口提高吞吐量。


24.5 时间戳选项

什么是时间戳选项

时间戳选项(Timestamp Option):

  • TCP选项的一种
  • 每个段都带时间戳
  • 对方回应的时候带回来
  • 可以更准确地测量RTT
  • 还可以防止序号回绕

时间戳选项有两个作用。


RTT测量

RTT测量:

  1. 发送方发段的时候

    • 带上当前时间戳
  2. 接收方回ACK的时候

    • 把收到的时间戳再带回去
    • 回显
  3. 发送方收到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怎么工作:

  1. 连接建立时协商

    • SYN里带SACK允许选项
    • 双方都支持才行
  2. 接收方收到不连续的数据

    • 发SACK
    • 告诉发送方哪些块收到了
    • 比如:收到了4-10,缺3
  3. 发送方收到SACK

    • 知道哪些收到了,哪些没收到
    • 只重传没收到的
    • 不用重传已经收到的
    • 节省带宽

SACK告诉发送方哪些收到了。


SACK的好处

SACK的好处:

  • 丢包恢复快
  • 只重传丢的
  • 不重传已经收到的
  • 节省带宽
  • 提高吞吐量
  • 长肥管道下尤其有用

SACK提高丢包恢复效率。


24.7 小结

TCP性能概述

  1. 原始TCP的限制

    • 窗口最大64KB
    • 序号32位
    • 累计确认
    • 长肥管道下性能差
  2. TCP扩展

    • 窗口扩大选项
    • 时间戳选项
    • 选择性确认SACK
    • 路径MTU发现
    • 提高性能

路径MTU发现

  1. 什么是PMTUD

    • 发现路径上最小的MTU
    • 避免分片
  2. 怎么工作

    • DF位
    • ICMP需要分片
    • 调整MTU
  3. 问题

    • ICMP被过滤
    • MTU黑洞

长肥管道

  1. 什么是长肥管道

    • 带宽高,延迟大
    • BDP大
  2. 问题

    • 窗口不够大
    • 序号回绕
    • RTT测量不准
    • 丢包恢复慢
  3. 解决

    • 窗口扩大
    • 时间戳
    • SACK

窗口扩大选项

  1. 什么是窗口扩大

    • 扩大窗口位数
    • 最大30位
    • 最大1GB
  2. 怎么工作

    • SYN协商移位
    • 实际窗口 = 窗口字段 << 移位
  3. 效果

    • 大窗口
    • 填满长肥管道
    • 高吞吐量

时间戳选项

  1. 什么是时间戳

    • 每个段带时间戳
    • 回显
  2. RTT测量

    • 每个段都能测
    • 更准确
  3. 防止序号回绕

    • PAWS
    • 时间戳区分新旧

选择性确认SACK

  1. 什么是SACK

    • 选择性确认
    • 可以确认不连续的块
  2. 为什么需要

    • 累计确认效率低
    • 丢包要重传很多
  3. 怎么工作

    • 告诉发送方哪些收到了
    • 只重传丢的
  4. 好处

    • 恢复快
    • 节省带宽
    • 提高吞吐量

关键概念

  1. 路径MTU发现

    • 找最小MTU
    • 避免分片
  2. 长肥管道

    • 高带宽大延迟
    • BDP大
  3. 窗口扩大选项

    • 大窗口
    • 最大1GB
  4. 时间戳选项

    • RTT测量
    • PAWS
  5. 选择性确认SACK

    • 选择性确认
    • 快速恢复

TCP性能