tcp基础知识
本文摘要: TCP协议核心机制解析,涵盖三次握手/四次挥手、流量控制、拥塞控制等关键技术点。重点分析了TIME_WAIT状态的双重作用:确保最后一个ACK可靠送达(2MSL等待)和防止旧连接数据污染新连接。同时解释了半连接队列满时丢弃第三次握手ACK的设计考量(安全性和资源保护)。其他内容包括滑动窗口、延时确认、重传机制等TCP核心功能,为网络协议学习提供了系统性的技术参考。
tcp基础
博客链接
https://dongshao.blog.csdn.net/category_8925006_2.html
tcp总览
https://unlockdoc.smain.cn/online/2025-12-07/c8483e8abf88c986f97e7225056dffb8.html
https://blog.csdn.net/qq_41453285/article/details/104016416
三次握手
https://blog.csdn.net/weixin_45304503/article/details/142029483
https://blog.csdn.net/weixin_42462382/article/details/142220870
四次挥手
https://blog.csdn.net/m0_61990249/article/details/138587105
https://blog.csdn.net/michaelwoshi/article/details/121180561
TIME_WAIT 是 TCP 里最容易被误解的机制之一,但它的作用非常关键。
我用最清晰的方式给你讲明白:
TIME_WAIT 的本质作用:两个目的,缺一不可
① 保证“最后一个 ACK”能成功送达对方(可靠性)
四次挥手流程:
FIN → ACK → FIN → ACK
当主动关闭方发送最后一个 ACK 后:
- 它无法知道这个 ACK 是否丢失!
- 如果 ACK 丢了,对方会重发 FIN
- 因此主动关闭方必须在某个时间窗口内保持连接状态,一旦收到 FIN,要重新 ACK
👉 TIME_WAIT 就是这个“等待重传 FIN 的时间窗口”
② 确保旧连接的数据不会污染新连接(安全性)
TCP 是基于 序列号(sequence number) 的。
假设旧连接的 FIN、ACK 或数据包在网络中延迟很久(几分钟都可能)。
如果立即释放端口并被新的连接使用:
旧连接的延迟包 → 到达新连接 → 被误以为属于新连接
这会造成 数据错乱、协议失效、连接崩溃。
所以:
TIME_WAIT = 2 × MSL(Maximum Segment Lifetime)
MSL 是网络中一个 TCP 报文最大生存时间。
TIME_WAIT = 2MSL 就能保证旧包全部消失后,端口才真正可用。
关键总结(非常重要)
TIME_WAIT = 防止未来发生问题
CLOSE_WAIT = 表示现在已经出问题
为什么 TIME_WAIT 一定是主动关闭方来承担?
因为 主动关闭方发送最后 ACK,它必须保证对方收到。
被动关闭方不需要确认 ACK,因此不需要等待。
所以:
- 主动关闭方进入 TIME_WAIT
- 被动关闭方进入 CLOSED,直接释放资源
这也是为什么服务器常常满屏 TIME_WAIT —— 因为是它主动关闭连接。
再补一条:TIME_WAIT 的典型时长
一般为 2MSL:
- Linux 默认 MSL≈30 秒 → TIME_WAIT = 60 秒
- RFC 推荐 MSL=2 分钟 → TIME_WAIT=4 分钟(旧系统)
面试级总结(你可以直接背)
TIME_WAIT 的目的:
- 确保主动关闭方发送的最后 ACK 能被对方收到(处理丢包)。
- 确保旧连接的延迟报文无法污染新的连接(序列号安全)。
因此主动关闭的一方必须进入 TIME_WAIT,持续 2MSL 时间。
流量控制 —— 窗口、滑动窗口工作方式
https://blog.csdn.net/roboko_/article/details/149284068
拥塞控制 —— 慢启动、拥塞避免、快重传、快恢复
https://blog.csdn.net/qq_35448165/article/details/106951020
延时确认(延迟ACK)、Nagle算法
https://blog.csdn.net/qq_41453285/article/details/104121538
TCP重传机制
https://blog.csdn.net/LUCIAZZZ/article/details/146980256
TCP选线字段
https://blog.csdn.net/qq_41396647/article/details/129376978
半连接队列/全连接队列
https://blog.csdn.net/michaelwoshi/article/details/122646545
TCP 不为 accept 队列满而设置额外排队队列,而是丢弃第三次握手 ACK,让客户端重传,是为了:
- 防止服务器被攻击(不能保存额外未验证状态)
- 利用 TCP 自带的重传机制,无需额外设计队列
- 减少内核复杂性和资源占用
- 确保服务器资源只为已验证、可靠的连接提供
- 保护服务器,代价由客户端承担
更多推荐



所有评论(0)