ToolkitX
知识库工具箱

TCP/IP 协议

三次握手、四次挥手、可靠传输

25min·进阶

01. TCP 三次握手——先确认再干活

TCP 三次握手就像打电话确认线路通不通。你拨号(发 SYN:「我想跟你连」),对方接起来说「喂?听得到吗?」(回 SYN-ACK:「收到了,我也要连」),然后你说「能听清,开聊」(回 ACK)——好了,连接建立。 技术细节: 第一步:客户端发 SYN=1,带起始序列号 x 第二步:服务端回复 SYN=1, ACK=1,确认号 x+1,自己带序列号 y 第三步:客户端回 ACK=1,确认号 y+1,连接建立 说白了就是双方互相确认收发能力都没问题,然后才正经传数据。
bash
# 抓包看三次握手
sudo tcpdump -i eth0 port 80 -nn

# 看当前建立的连接
ss -tn state established

02. TCP 四次挥手——好聚好散

断开连接要四次挥手,就像朋友分别: A 说「我先走了」(发 FIN) B 说「好我知道了,但让我把剩下的话说完」(先回 ACK) B 说完后说「那我也走了」(发 FIN) A 最后回「好的拜拜」(回 ACK),再默默等一会儿才彻底走 为啥比握手多一次?因为 TCP 是全双工的——两边同时在发数据,断开时必须各自说「我不发了」,没法合并。

03. TCP 的 11 种状态——连接的心情日记

TCP 连接在不同阶段有不同的状态: LISTEN——等别人来连我,像开店等客人 SYN_SENT——我发出连接请求了,在等回复 SYN_RCVD——收到别人的请求并回复了,等他最后确认 ESTABLISHED——连上了,正常通信中 FIN_WAIT_1——我先提出要断开 FIN_WAIT_2——对方说知道了,我在等他那边也关 TIME_WAIT——两边都关了但多等一会儿确保最后 ACK 被收到 CLOSE_WAIT——对方要断了我收到了但还没回应(多半是你代码忘了 close!) LAST_ACK——我也准备关了,等最后确认 CLOSING——巧了,两边同时说断开 CLOSED——彻底结束 TIME_WAIT 太多→短连接太频繁。CLOSE_WAIT 太多→代码忘了 close()。

04. UDP——TCP 的闪电侠兄弟

TCP 可靠但慢,UDP 快但不可靠。UDP 不确认、不重传、不排序,像往河里扔漂流瓶,到了就到了没到拉倒。 UDP 适合:视频通话和直播(丢几帧无所谓但延迟高了卡顿)、在线游戏(操作必须实时)、DNS 查询(小包丢了重问)。 结论:在乎数据完整用 TCP,在乎速度用 UDP。

知识测验

1/5正确 0

TCP 三次握手第二步服务器回复什么?

下一节

HTTP 协议详解

下一节