核心内容摘要
禅意梵音,七日轮回:一场涤荡灵魂的寺庙“躁”动之旅
初识 TCP 协议从“听说过”到“真正认识它”新手友好版 · 2026 年依然适用的核心理解大多数人第一次听到 TCP 的时候只知道两件事它和 IP 一起叫 TCP/IP它好像很可靠但真正理解它需要把下面这 7 个核心画面建立起来。
第一画面TCP 到底在解决什么问题互联网最底层的 IP 协议只负责两件事把数据包从 A 送到 B寻址 路由不保证一定送到、不保证顺序、不保证不重复、不保证不损坏TCP 在 IP 之上补上了这四件事IP 做不到的TCP 补上的能力通俗说法包可能丢失确认 重传“你收到了吗没收到我再发”包到达顺序可能乱序号 重新排序“这是第几号包裹先排好队”包可能重复去重“同一个包裹别收两次”包可能损坏校验和“内容是不是被人改过”一句话
总结TCP 把不可靠的 IP 网络伪装成了可靠的字节流管道。
第二画面TCP 最著名的“三次握手”很多人背了口诀却没记住本质。
三次握手的真正目的是双方互相确认对方的“发送”和“接收”能力都正常步骤发送方内容含义最通俗解释对方学到了什么1客户端 → 服务端“你好我要跟你说话SYN”服务端知道客户端能发2服务端 → 客户端“好的我也想跟你说话SYNACK”客户端知道服务端能收 能发3客户端 → 服务端“太好了那我们开始吧ACK”服务端知道客户端收到了我的回复少了哪一次都不行没第1次 → 服务端不知道有人想连它没第2次 → 客户端不知道服务端是否活着没第3次 → 服务端不知道客户端是否真的收到了确认第三画面TCP 头部最重要的 6 个标志位新手最容易混淆的部分标志位英文含义最接地气的说法常见出现场景SYNsynchronize“我想建立连接” / “这是新连接的第一个包”三次握手第
2步ACKacknowledgment“我确认收到你前面发的序号为 X 的数据了”几乎每个 TCP 包都有FINfinish“我发完了想优雅地结束连接”四次挥手第
3步RSTreset“出大事了连接作废马上断开”端口未监听、异常拒绝等PSHpush“别等了赶紧把数据交给应用程序”一般配合小包发送URGurgent“紧急数据优先处理”现在几乎不用了极少见记住口诀“SYN 开门FIN 关门RST 踹门ACK 点头”第四画面可靠传输的两大核心机制序号 确认应答Seq Ack每个字节都有编号不是每个包接收方告诉发送方“我已经连续收到到第 X 字节了”发送方据此判断哪些需要重传滑动窗口Sliding Window不用等上一个包确认才发下一个效率高窗口大小 对方还能接收多少字节窗口不断向前滑动 → 实现流量控制 拥塞避免第五画面四次挥手为什么不是三次步骤谁发含义最直白版为什么需要这一步1主动方“我发完了不发了FIN”—2被动方“收到我知道了ACK”告诉对方“我收到你结束的请求了”3被动方“我也发完了不发了FIN”—4主动方“好的彻底结束ACK”告诉对方“我也知道你结束了”关键点被动方第2步和第3步不能合并因为它可能还有数据要发完。
第六画面最容易混淆的对比表对比项TCPUDP是否连接面向连接有握手挥手无连接是否可靠是重传、排序、去重、校验否传输单位字节流无边界数据报有明确边界头部开销20~60 字节8 字节速度较慢快典型应用HTTP/HTTPS、SSH、MySQL、邮件DNS、视频直播、游戏、语音通话第七画面新手最常问的几个问题速答为什么建立连接要三次而不是两次两次只能确认客户端→服务端单向通双向通必须三次。
为什么关闭连接要四次而不是三次因为关闭是双向独立的任何一方都可以先说“我不发了”另一方可能还有话要说。
TIME_WAIT 是什么鬼第四次挥手发完 ACK 后主动关闭方进入 TIME_WAIT 状态通常 1–4 分钟防止最后一个 ACK 丢失导致被动方不停重发 FIN。
SYN洪泛攻击是怎么回事攻击者疯狂发 SYN不完成三次握手 → 服务端半连接队列被占满 → 正常用户连不上。
总结一句话背下来TCP 是一个工作在 IP 之上的、面向连接的、可靠的、基于字节流的、双向通信协议它用三次握手建立连接、四次挥手断开连接用序号确认滑动窗口来保证数据不丢、不乱、不重。
如果你现在能记住上面这句 三次握手 四次挥手 SYN/ACK/FIN/RST 这四个标志位就已经超过 80% 的“听说过 TCP” 的人了。
想继续深入哪个部分滑动窗口和拥塞控制的图解抓包看真实三次握手推荐工具TCP 粘包/拆包到底是怎么回事常见面试题TIME_WAIT、SYN Cookie 等TCP vs QUIC 对比现代 HTTP/3 用的是谁告诉我你最想搞懂的下一个点