第20章 TCP:成块数据流
所属:TCP/IP详解 卷2:实现 来源:TCP/IP详解 卷2:实现
本章描述TCP成块数据流的处理,包括成块数据的传输、吞吐量、滑动窗口、拥塞控制和性能等。
20.1 引言
什么是成块数据流
成块数据流(bulk data flow):
- 大量数据的传输
- 比如文件传输
- 吞吐量很重要
- 效率很重要
成块数据流关注吞吐量。
成块数据流的特点
成块数据流的特点:
- 数据量大
- 持续时间长
- 吞吐量是关键
- 效率很重要
- 拥塞控制影响大
成块数据和交互式数据不同。
本章讨论的内容
本章讨论的内容:
- 成块数据的传输
- 吞吐量计算
- 滑动窗口的大小
- 拥塞控制的影响
- 慢启动和拥塞避免
- 性能问题
本章讨论成块数据流的性能。
20.2 吞吐量的计算
吞吐量的基本公式
吞吐量(throughput):
- 单位时间传输的数据量
- 通常用字节/秒或比特/秒
基本公式:
吞吐量 = 窗口大小 / 往返时间
为什么:
- 一个窗口的数据发出去
- 等一个RTT才能确认
- 才能发下一个窗口
- 所以吞吐量 = 窗口大小 / RTT
吞吐量由窗口大小和RTT决定。
带宽延迟积
带宽延迟积(Bandwidth-Delay Product, BDP):
BDP = 带宽 × 延迟
意义:
- 管道的容量
- 填满管道需要多少数据
- 窗口大小至少要等于BDP才能跑满带宽
例子:
- 带宽:100Mbps = 12.5MB/s
- 延迟:100ms = 0.1s
- BDP = 12.5MB/s × 0.1s = 1.25MB
- 窗口需要至少1.25MB才能跑满
带宽延迟积是管道的容量。
窗口大小的限制
窗口大小的限制因素:
-
接收缓冲区大小
- 窗口不能超过接收缓冲区
- 接收方控制
-
拥塞窗口大小
- 拥塞控制限制
- 网络状况决定
-
TCP窗口字段大小
- 16位,最大65535字节
- 窗口扩大选项可以更大
实际窗口:
实际窗口 = min(接收窗口, 拥塞窗口)
实际窗口是两者的最小值。
20.3 滑动窗口与成块数据
滑动窗口的效率
滑动窗口的效率:
- 窗口越大,效率越高
- 窗口小了,发送方经常等ACK
- 管道填不满
理想情况:
- 窗口 >= 带宽延迟积
- 管道一直满
- 吞吐量 = 带宽
窗口足够大才能跑满带宽。
成块数据的传输过程
成块数据的传输过程:
-
慢启动阶段
- 窗口指数增长
- 越来越快
- 直到达到ssthresh或丢包
-
拥塞避免阶段
- 窗口线性增长
- 慢慢增加
- 直到丢包
-
稳定阶段
- 窗口在某个值附近波动
- 丢包就减半
- 然后慢慢增加
- 锯齿形
成块传输经历几个阶段。
慢启动对成块数据的影响
慢启动的影响:
- 开始时很慢
- 需要时间才能达到全速
- 短连接可能还没到全速就结束了
- 长连接影响小
为什么需要慢启动:
- 防止一开始就发太多
- 导致网络拥塞
- 慢慢探测网络容量
慢启动是必要的,但影响初始速度。
20.4 拥塞控制与成块数据
拥塞控制的四个阶段
拥塞控制的四个阶段:
-
慢启动(Slow Start)
- cwnd指数增长
- 每个RTT翻倍
-
拥塞避免(Congestion Avoidance)
- cwnd线性增长
- 每个RTT加1 MSS
-
快速重传(Fast Retransmit)
- 3个重复ACK触发
- 立即重传
-
快速恢复(Fast Recovery)
- 快速重传后
- 不进入慢启动
- 直接拥塞避免
四个阶段共同工作。
拥塞控制对吞吐量的影响
拥塞控制对吞吐量的影响:
- 丢包会降低吞吐量
- 窗口减半,然后慢慢恢复
- 丢包率越高,吞吐量越低
公式(简化):
吞吐量 ≈ 1.22 × MSS / (RTT × √p)
- p是丢包率
- 丢包率越高,吞吐量越低
丢包严重影响吞吐量。
长肥管道
长肥管道(Long Fat Pipe, LFN):
- 带宽高、延迟大的网络
- 带宽延迟积很大
- 普通TCP窗口不够大
- 需要窗口扩大选项
问题:
- 16位窗口最大65535字节
- 长肥管道需要更大的窗口
- 窗口扩大选项解决
长肥管道需要特殊处理。
20.5 TCP的性能问题
影响TCP性能的因素
影响TCP性能的因素:
-
带宽
- 网络的最大速率
- 物理限制
-
延迟
- 传播延迟
- 处理延迟
- 影响吞吐量
-
丢包率
- 丢包重传
- 拥塞窗口减小
- 影响吞吐量
-
窗口大小
- 接收窗口
- 拥塞窗口
- 限制吞吐量
-
MSS大小
- 最大段大小
- 影响效率
- 大的MSS效率高
很多因素影响TCP性能。
性能优化
TCP性能优化:
-
增大缓冲区
- 增大接收缓冲区
- 窗口可以更大
- 提高吞吐量
-
窗口扩大选项
- 支持更大的窗口
- 长肥管道需要
-
路径MTU发现
- 使用最大的MSS
- 避免分片
- 提高效率
-
选择性确认(SACK)
- 更精确的重传
- 提高效率
-
时间戳选项
- 更精确的RTT测量
- PAWS防止序号回绕
各种优化提高性能。
20.6 成块数据的例子
例子:文件传输
文件传输的例子:
场景:
- 文件大小:10MB
- 带宽:100Mbps
- RTT:100ms
- MSS:1460字节
- 初始窗口:1 MSS
过程:
- 慢启动:窗口指数增长
- 达到拥塞避免:线性增长
- 可能遇到丢包,窗口减半
- 继续增长
- 传输完成
理想时间:
- 10MB / 12.5MB/s = 0.8秒
- 但实际因为慢启动、拥塞等,时间更长
实际时间比理想时间长。
20.7 小结
吞吐量计算
-
基本公式
- 吞吐量 = 窗口大小 / RTT
-
带宽延迟积
- BDP = 带宽 × 延迟
- 管道的容量
- 窗口至少要这么大
-
窗口限制
- 接收窗口
- 拥塞窗口
- 取最小值
滑动窗口与成块数据
-
窗口效率
- 窗口大效率高
- 填满管道
-
传输阶段
- 慢启动
- 拥塞避免
- 稳定阶段
-
慢启动的影响
- 开始慢
- 短连接影响大
拥塞控制与成块数据
-
四个阶段
- 慢启动
- 拥塞避免
- 快速重传
- 快速恢复
-
丢包的影响
- 降低吞吐量
- 窗口减半
-
长肥管道
- 带宽高延迟大
- 需要大窗口
- 窗口扩大选项
性能问题
-
影响因素
- 带宽、延迟
- 丢包率
- 窗口大小
- MSS大小
-
性能优化
- 增大缓冲区
- 窗口扩大
- 路径MTU发现
- SACK
- 时间戳
关键概念
-
吞吐量
- 窗口大小 / RTT
- 带宽延迟积
-
成块数据流
- 大量数据传输
- 吞吐量是关键
-
拥塞控制
- 慢启动
- 拥塞避免
- 影响吞吐量
-
长肥管道
- 高带宽大延迟
- 需要大窗口
-
性能优化
- 各种优化技术
- 提高吞吐量