第5周:TCP 协议栈内部机制
目标:深入理解 TCP 协议栈细节,掌握关键 socket 选项的使用场景。
1. TCP 协议栈核心机制
1.1 Nagle 算法
问题:小包发送效率低(每个包 40 字节头 + 少量数据)
1 | 发送端发送 "H" (1 byte) |
Nagle 算法规则:
1 | if (有未确认的数据 AND 数据 < MSS) { |
关闭 Nagle:
1 | int flag = 1; |
使用场景:
- 交互式应用(SSH、telnet、游戏):关闭 Nagle,降低延迟
- 文件传输、批量数据:保持 Nagle,提高吞吐
1.2 延迟确认(Delayed ACK)
1 | 接收方收到数据后: |
影响 Nagle + Delayed ACK 的经典问题:
1 | 发送方(Nagle 开启): |
1 | // 关闭延迟 ACK |
1.3 Keepalive
1 | int keepalive = 1; |
2. 关键 Socket 选项
2.1 SO_REUSEADDR
1 | int opt = 1; |
作用:
- 允许在 TIME_WAIT 状态下重新绑定同一端口
- 解决”Address already in use”问题
- 多进程绑定同一端口进行负载均衡(配合 SO_REUSEPORT)
注意:
- 必须设置在
bind()之前 - 不影响正在使用中的连接
2.2 SO_REUSEPORT
1 | int opt = 1; |
作用:
- 允许多个 socket(可跨进程)绑定同一 (IP, Port)
- 内核自动负载均衡分发新连接到不同 socket
- 实现内核级别的 accept 负载均衡
对比:
| 特性 | SO_REUSEADDR | SO_REUSEPORT |
|---|---|---|
| 多进程 bind | 部分支持 | 完全支持 |
| 负载均衡 | 无 | 内核级 |
| 惊群 | 仍有 | 消除 |
| Linux 版本 | 3.9+ | 3.9+ |
2.3 TCP 缓冲区调优
1 | // 发送缓冲区 |
2.4 SO_LINGER
1 | struct linger ling = { |
行为对比:
| l_onoff | l_linger | close() 行为 |
|---|---|---|
| 0 | - | 默认(优雅关闭,等待数据发送完) |
| 1 | 0 | 立即发 RST,丢弃缓冲区数据 |
| 1 | >0 | 等待最多 l_linger 秒发送剩余数据 |
2.5 选项速查表
1 | // Socket 层选项 |
3. TCP 超时与重传
3.1 RTO(Retransmission Timeout)
1 | RTT (Round Trip Time) = 往返时间 |
3.2 Linux TCP 超时参数
1 | # 查看 / 设置 |
1 | # 查看当前 TCP 连接的超时和重传状态 |
4. TCP 性能调优实践
4.1 Linux 系统调优
1 | # /etc/sysctl.conf 调优 |
4.2 BBR 拥塞控制
1 | # 查看支持的拥塞控制算法 |
BBR 优势(Google 开发):
- 基于带宽和延迟而非丢包检测拥塞
- 在高丢包/高延迟网络中表现优异
- 启动更快,吞吐更高
5. 实践:SO_REUSEPORT 负载均衡测试
1 | // reuseport_test.c |
1 | gcc -o reuseport_test reuseport_test.c |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/07/28/第5周:TCP 协议栈内部机制/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!