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 established02. 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 协议详解