第47周:网络协议深度问答
目标:掌握 TCP/IP 核心问题,能够清晰讲解从驱动到 socket 的完整调用链,定位常见网络故障。
1. TCP 高频问答
1.1 三次握手与四次挥手
Q: 为什么是三次握手而不是两次?
1 | 三次握手的必要性: |
Q: 为什么挥手是四次而不是三次?
1 | 建立连接:服务端可以合并 SYN+ACK(被动) |
Q: TCP 握手队列
1 | Linux TCP 握手状态: |
1.2 TIME_WAIT 问题
Q: 为什么需要 TIME_WAIT?为什么是 2MSL?
1 | TIME_WAIT 必要性: |
Q: TIME_WAIT 太多怎么办?
1 | TIME_WAIT 大量出现的常见场景: |
1.3 TCP 重传与 RTT
Q: TCP 如何估算 RTT?
1 | RFC 6298 算法: |
Q: TCP 重传机制
1 | 1. 超时重传(Timeout Retransmission) |
1.4 TCP 拥塞控制
Q: 详细讲一下 Cubic 算法
1 | Cubic(Linux 3.0+ 默认): |
Q: BBR 与 Cubic 的区别?
1 | Cubic: |
1.5 滑动窗口
Q: TCP 滑动窗口的工作机制?
1 | 发送方: |
1.6 TCP 其他问题
Q: TCP 粘包如何解决?
1 | 粘包原因: |
Q: TCP keepalive 和应用层心跳的区别?
1 | TCP Keepalive(内核): |
2. 内核网络路径详解
2.1 收包路径完整调用链
1 | 包从网卡到用户态的完整路径: |
2.2 发包路径
1 | 用户态 write() → 内核 → 网卡 |
2.3 关键函数
1 | 常用内核函数(面试考点): |
3. 故障排查
3.1 常见故障与定位
故障 1:连接被拒绝
1 | 症状: |
故障 2:连接超时
1 | 症状: |
故障 3:丢包
1 | 症状: |
故障 4:延迟高
1 | 排查: |
3.2 性能分析工具
1 | # === 网络状态 === |
3.3 常见连接状态
1 | LISTEN:监听 |
4. 协议族对比
4.1 TCP vs UDP
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接 | 无连接 |
| 可靠 | 可靠(ACK + 重传) | 不可靠 |
| 顺序 | 保序 | 不保序 |
| 流控 | 滑动窗口 | 无 |
| 拥塞 | 拥塞控制 | 无(应用负责) |
| 开销 | 大头(20B +) | 小头(8B) |
| 延迟 | 较高(握手 + ACK) | 低 |
| 适用 | HTTP、FTP、邮件 | DNS、视频、实时 |
4.2 HTTP/1.1 vs HTTP/2 vs HTTP/3
1 | HTTP/1.1: |
4.3 IPv4 vs IPv6
1 | IPv4: |
4.4 长连接 vs 短连接
1 | 短连接: |
5. 性能调优实战
5.1 调优原则
1 | 原则 1:测量先行 |
5.2 关键参数
1 | # === TCP 缓冲区 === |
6. 面试中的网络问题应对
6.1 表达框架
1 | 网络问题回答框架(5 步): |
6.2 常见追问
1 | Q: 你说 2MSL,那 2MSL 应该是 2 * 60s,TIME_WAIT 不是要等 2 分钟吗? |
7. 总结与建议
1 | 准备网络面试的方法: |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/05/05/第47周:网络协议深度问答/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!