TCP 协议
2025/12/21大约 3 分钟
TCP 协议
核心概念
TCP(Transmission Control Protocol) 位于传输层,提供面向连接、可靠、有序、字节流的服务。通过序列号、确认号、重传、流量控制、拥塞控制等机制,确保数据在不可靠的 IP 网络上可靠传输。
关键特性:
- 面向连接:三次握手建立连接,四次挥手释放连接。
- 可靠传输:超时重传、快速重传、累计 ACK。
- 有序交付:序列号确保按序重组,乱序缓存重排。
- 流量控制:滑动窗口防止接收端被淹没(基于接收窗口 rwnd)。
- 拥塞控制:慢启动、拥塞避免、快重传、快恢复(基于 cwnd)。
连接建立与释放
- 三次握手:SYN → SYN/ACK → ACK,防止历史报文干扰,确认双方收发能力。
- 四次挥手:FIN/ACK ×2 + ACK,允许全双工各自独立关闭。
- TIME_WAIT:2MSL,确保迟到报文被丢弃,防止旧连接干扰新连接。
可靠性与滑动窗口
- 序列号/确认号:按字节编号,ACK 确认下一个期望字节。
- 滑动窗口:发送窗口 = min(rwnd, cwnd),控制在途数据量;零窗口时可用窗口探测报文恢复传输。
- 重传机制:
- 超时重传:RTO 动态估计 RTT(平滑 RTT + RTT 方差)。
- 快速重传:收到 3 个重复 ACK 立即重传,避免等待超时。
拥塞控制(经典 Reno 视角)
- 慢启动:cwnd 从 1 MSS 指数增长,至 ssthresh。
- 拥塞避免:线性增长 cwnd。
- 快速重传/快恢复:3 个重复 ACK 触发,ssthresh = cwnd/2,cwnd = ssthresh + 3 MSS,后线性增长。
常见改进:CUBIC(Linux 默认)、BBR(基于带宽/时延估计)。
常见问题与排查
- 高 RTT/丢包:检查
mtr/ping,确认链路质量;观察重传率、拥塞窗口。 - 吞吐低:可能 MSS/窗口受限;检查
net.ipv4.tcp_window_scaling、rmem/wmem;确认是否被小包/ACK 延迟限制。 - TIME_WAIT 多:短连接频繁;可复用
net.ipv4.tcp_tw_reuse=1(客户端场景),或开启长连接/连接池。 - 半连接攻击:SYN Flood;服务端可用 SYN Cookie、加大 backlog、启用 SYN Proxy。
相关高频面试题
Q1: 三次握手为什么不是两次?
- 需要双向确认收发能力,防止旧 SYN 造成伪连接;两次无法确认客户端接收能力。
Q2: 四次挥手中 TIME_WAIT 的作用?
- 确保旧报文自然消亡、防止序列号混淆;允许对端未收到 ACK 时重发 FIN,持续 2MSL 后新连接才安全复用端口。
Q3: 滑动窗口与拥塞窗口的区别?
- rwnd 反映接收端能力,cwnd 反映网络拥塞状况;发送窗口取两者最小值。
Q4: 快速重传与超时重传的触发条件?
- 快速重传:3 个重复 ACK 即重传,恢复快;超时重传:RTO 到期才重传,代价高。
Q5: 延迟 ACK 有何影响?
- 减少 ACK 数量,但可能增加交互延迟;对小包交互敏感的场景可适当调低延迟或配合 Nagle 调优。
Q6: 如何提升 TCP 吞吐?
- 合理 MSS 与窗口扩展(Window Scaling),调优 rmem/wmem;启用 TSO/GRO;使用 BBR 或更新的拥塞算法;减少丢包/重传率;长连接复用减少握手开销。