本页目录
TCP/IP 协议栈
覆盖: IPv4/IPv6 收发路径 → TCP 状态机 → 拥塞控制 (CUBIC/BBR) → 流控 (滑动窗口) → socket buffer (sk_wmem/sk_rmem) → TCP fast path 内核版本: 2.6 ~ 6.x
概述
Linux TCP/IP 栈是内核中优化最极致的子系统之一。在高速路径 (established sockets, 顺序到达的数据包),每个包的处理只有几十条指令。本文将聚焦 TCP 的接收快速路径和拥塞控制。
IPv4 收发
ip_rcv → ip_local_deliver (收包)
// net/ipv4/ip_input.c
├─ 验证: version==4, checksum OK, 长度合法
├─ netfilter
└─
├─ 查路由表: → dst_entry
│ → RTN_LOCAL: 给本机的 →
│ → RTN_UNICAST: 转发 →
└─
├─ netfilter
└─
└─ ipprot->handler → /
ip_queue_xmit (发包)
// net/ipv4/ip_output.c
├─ 查路由: → dst_entry + 源 IP
├─ 构造 IP header: protocol, TTL, DF flag, ...
├─ netfilter NF_INET_LOCAL_OUT
└─
├─ netfilter NF_INET_POST_ROUTING
└─ → QoS qdisc → 网卡驱动
TCP 快速路径: tcp_rcv_established
// net/ipv4/tcp_input.c
// 这是 TCP 收包的最热路径 (established socket, 顺序包)
// fast path (90%+ 的包走这里):
├─ 检查 header prediction:
│ ├─ PSH bit? → 跳过
│ ├─ 顺序到达? ✓
│ ├─ 窗口非零? ✓
│ └─ URG/RST/SYN? → 跳过
│
├─ 拷贝数据到 receive queue:
│ └─ → 直接到用户缓冲区?
│
├─ 更新 rcv_nxt, 窗口通告
│
└─ 如果数据已入 queue → → 唤醒 epoll/read
// slow path:
└─ / SACK / 窗口满 / FIN / RST →
TCP 状态机
拥塞控制
// net/ipv4/tcp_cong.c
// 可插拔的拥塞控制模块:
;
// CUBIC (默认):
// cwnd = C * (t - K)^3 + W_max
// K = cube_root(W_max * beta / C)
// 优点: 快速恢复, 公平, 在高速链路上表现好
// BBR (Bottleneck Bandwidth and RTT, Google):
// 不基于丢包,基于 BDP (Bandwidth-Delay Product)
// 测量: max BW (最近 10 轮) 和 min RTT (最近 10 秒)
// 目标: 保持 inflight ≈ BDP
// 优点: 在 bufferbloated 链路上远优于 CUBIC
TCP Socket Buffer 调优
# 发送缓冲区 (默认 16KB, 自动增长到 max)
# 接收缓冲区
# 自动调优 (默认开启):
# sk_wmem 和 sk_rmem 根据 RTT 和带宽探测自动增长
# → 高 BDP 链路不需要手动设置大 buffer
调试
# TCP 连接状态
# 拥塞控制
# 丢包/重传统计
|
|
# 追踪 TCP 状态
参考
- 源码:
net/ipv4/tcp_input.c,net/ipv4/tcp_output.c,net/ipv4/tcp_cong.c,net/ipv4/tcp_cubic.c,net/ipv4/tcp_bbr.c - RFC: RFC 793 (TCP), RFC 5681 (Congestion Control), RFC 8312 (CUBIC)
- LWN: "TCP fast path", "BBR congestion control"
关键词: tcp_rcv_established, fast path, CUBIC, BBR, congestion control, socket buffer, TCP state machine