网络拥塞模型2 tcp窗口机制核心概念对照表
TCP窗口机制核心概念对照表
| 概念 | 英文全称 | 缩写 | 控制方 | 作用 | 决定因素 | 在Wireshark中查看 |
|---|---|---|---|---|---|---|
| 接收窗口 | Receive Window | rwnd | 接收方 | 告知发送方可用缓冲区大小 | 1. 接收缓冲区大小2. 应用读取速度 | TCP头部 Window字段 |
| 拥塞窗口 | Congestion Window | cwnd | 发送方 | 防止网络过载的发送限制 | 1. 网络拥塞程度2. 拥塞控制算法 | 需计算(发送方内部状态) |
| 实际发送窗口 | Send Window / Effective Window | swnd | 发送方 | 实际可发送数据量 | min(rwnd, cwnd × MSS) |
需计算 |
| 在途字节数 | Bytes in Flight | - | 发送方 | 已发送未确认数据量 | 发送速率 × RTT | SEQ + LEN - 最大已确认SEQ |
| 拥塞点窗口 | Congestion Point cwnd | - | 发送方 | 拥塞发生时的cwnd值 | 丢包/重复ACK事件 | 需分析流量模式 |
| 滑动窗口 | Sliding Window | - | 双方 | 实现流控的移动机制 | 数据确认进度 | 观察SEQ/ACK序列变化 |
窗口动态变化机制表
| 阶段/事件 | 接收窗口(rwnd)变化 | 拥塞窗口(cwnd)变化 | 实际发送窗口(swnd)变化 |
|---|---|---|---|
| 连接建立 | 初始值(如64KB) | 初始值(1-4 MSS) | min(rwnd, cwnd×MSS) |
| 慢启动 | 可能不变或减小 | 每RTT翻倍:1→2→4→8... | 随cwnd增长而增长 |
| 拥塞避免 | 可能动态调整 | 每RTT加1:32→33→34... | 缓慢增长 |
| 接收方应用读取慢 | 减小(缓冲区满) | 不变 | 受rwnd限制减小 |
| 接收方应用读取快 | 增大(缓冲区空) | 不变 | 可能增大 |
| 检测到拥塞(丢包) | 不变 | 减半(Reno)或重置(Cubic) | 急剧减小 |
| 零窗口(接收方忙) | 降为0 | 暂停增长 | 降为0,停止发送 |
| 窗口更新(接收方恢复) | 恢复正值 | 恢复增长 | 恢复发送能力 |
窗口大小典型值表
| 窗口类型 | 典型范围 | 单位 | 影响因素 | 调优参数 |
|---|---|---|---|---|
| 接收窗口 | 64KB-1MB+ | 字节 | 1. net.ipv4.tcp_rmem2. 应用缓冲区 |
sysctl -w net.ipv4.tcp_rmem |
| 拥塞窗口 | 10-100个包 | MSS数 | 1. RTT2. 丢包率3. 算法类型 | 拥塞控制算法选择 |
| 实际发送窗口 | ≤ min(rwnd, cwnd×MSS) | 字节 | 两者较小值 | 需同时优化rwnd和cwnd |
| MSS | 1460(以太网) | 字节 | 路径MTU-40字节 | net.ipv4.tcp_mtu_probing |
瓶颈诊断表
| 现象 | 计算公式 | 瓶颈类型 | 解决方案 |
|---|---|---|---|
| cwnd主导限制 | cwnd×MSS < rwnd |
网络瓶颈 | 1. 优化网络质量2. 调整拥塞算法3. 增加带宽 |
| rwnd主导限制 | rwnd < cwnd×MSS |
接收方瓶颈 | 1. 增大接收缓冲区2. 优化应用读取速度3. 调整tcp_rmem |
| 零窗口停顿 | rwnd = 0 |
接收方过载 | 1. 优化接收方处理2. 应用层流控 |
| 窗口不增长 | cwnd停滞 | 网络限制 | 1. 检查丢包/延迟2. 确认ssthresh设置 |
| 窗口频繁变化 | rwnd波动大 | 接收方不稳定 | 1. 稳定应用处理2. 增加缓冲区 |
Wireshark分析关键字段表
| 字段位置 | 字段名 | 对应概念 | 分析意义 |
|---|---|---|---|
| TCP头部 | Window Size | 接收窗口(rwnd) | 接收方处理能力 |
| TCP头部 | Sequence Number | 发送进度 | 计算Bytes in Flight |
| TCP头部 | Acknowledgment Number | 确认进度 | 窗口滑动位置 |
| 计算字段 | Bytes in Flight | 在途数据量 | 网络管道填充度 |
| 统计信息 | RTT | 往返时间 | 影响cwnd增长 |
| 标志位 | Window Update | 窗口更新 | 接收方恢复通知 |
| 标志位 | Zero Window | 零窗口 | 接收方暂停 |
Linux系统调优参数表
| 参数 | 默认值 | 作用范围 | 影响窗口 | 调优建议 |
|---|---|---|---|---|
net.ipv4.tcp_rmem |
4096 87380 6291456 |
操作系统全局(规则),按会话生效 | 接收窗口(rwnd 上限) | 决定单个 TCP 会话可增长的接收缓冲区范围 |
net.ipv4.tcp_wmem |
4096 16384 4194304 |
操作系统全局(规则),按会话生效 | 发送缓冲区 / swnd | 高带宽或大 RTT 场景适当增大 |
net.ipv4.tcp_congestion_control |
cubic |
操作系统全局(新建会话) | 拥塞窗口(cwnd) | 根据网络特性选择算法(如 bbr / cubic) |
net.ipv4.tcp_window_scaling |
1 |
操作系统全局(握手协商) | 窗口缩放能力 | 必须开启以支持大于 64KB 的窗口 |
net.ipv4.tcp_slow_start_after_idle |
1 |
操作系统全局 | cwnd 重置策略 | 长连接场景可考虑关闭(设为 0) |
net.core.rmem_max |
212992 |
操作系统全局(硬上限) | 最大接收窗口 | 必须 ≥ tcp_rmem 的 max 值 |
net.core.wmem_max |
212992 |
操作系统全局(硬上限) | 最大发送窗口 | 必须 ≥ tcp_wmem 的 max 值 |
tcp_rmem / tcp_wmem 的“全局 vs 会话”严格说明
以:
net.ipv4.tcp_rmem = 4096 87380 6291456
为例,其含义必须拆成两层理解:
1️⃣ 参数层级(规则层)
-
该参数是 操作系统级内核参数
-
对整台主机上的所有 TCP 连接提供统一规则
2️⃣ 生效方式(执行层)
-
三个数值 作用于“每一个 TCP 会话”
-
含义是:
| 字段 | 含义 | 作用对象 |
|---|---|---|
| 4096 | 单个 TCP 会话的最小接收缓冲区 | 每个会话 |
| 87380 | 单个 TCP 会话的默认接收缓冲区 | 每个会话 |
| 6291456 | 单个 TCP 会话允许增长到的最大值 | 每个会话 |
关键结论:
这不是“所有 TCP 会话的总内存限制”
而是“每个 TCP 会话的可动态取值区间”
为什么不是所有会话合计?
-
Linux 不会在连接建立时为每个 TCP 会话预分配 max 值
-
接收缓冲区是:
-
按会话独立
-
按需增长
-
在全局内存压力下动态回收
-
当系统内存或 socket memory 压力增大时:
-
多个 TCP 会话都会被限制增长
-
而不是某一个会话独占 max 值
一句话工程级定义(可直接引用)
tcp_rmem / tcp_wmem是操作系统级的规则参数,
定义的是“单个 TCP 会话缓冲区的动态取值范围”,
而不是所有 TCP 会话的总内存配额。

浙公网安备 33010602011771号