TCP连接的流程详解
摘要:本文详细解析了TCP协议的三次握手和四次挥手过程。三次握手通过SYN和ACK标志建立连接:客户端发起SYN,服务器回复SYN+ACK,客户端确认ACK。四次挥手则通过FIN和ACK标志终止连接:一方发送FIN,对方ACK确认;待数据发送完毕后发送FIN,最后收到ACK确认关闭。文章还解释了seq序列号、ack确认号的含义,以及FIN-WAIT、CLOSE-WAIT等状态的变化过程。这些机制确
一.重要标志
开始之前,先记住几个标识。
-
SYN=1:意思是 “这是我的开始号,我们开始连接吧!”
-
ACK=1:意思是 “我收到了你的号,下一个我期待这个号!”
-
seq(序列号):“我发的数据从多少开始编号”
-
ack(确认号):“我期待你发给我的下一个数据编号是多少”
| 标志组合 | 常见场景 | 含义 |
|---|---|---|
| SYN=1, ACK=0 | 第一次握手 | “我要发起连接” |
| SYN=1, ACK=1 | 第二次握手 | “我确认你的连接,我也要连接你” |
| SYN=0, ACK=1 | 第三次握手/普通数据 | “我确认收到你的数据” |
| SYN=0, ACK=0 | 纯数据发送 | “我只是发数据,不建立连接也不确认” |
二:三次握手的过程
第一次握手:客户端发起
SYN=1, ACK=0 seq=1000
翻译成人话:
客户端对服务器说:
“喂!服务器!我想和你建立连接(SYN=1)。
我还没收到你的东西,所以不需要确认(ACK=0)。
我的数据会从 1000 开始编号(seq=1000)。”
此时服务器知道: 客户端要用1000开始发数据。
第二次握手:服务器回复
SYN=1, ACK=1 seq=5000 ack=1001
翻译成人话:
服务器对客户端说:
“好的客户端!我同意和你连接,并且我也要发起连接(SYN=1)。
我收到了你的1000号数据(ACK=1)。
我期待你下一份数据编号是 1001(ack=1001)。
我的数据会从 5000 开始编号(seq=5000)。”
关键理解:
-
ack=1001的意思是:“你的1000号(SYN)我收到了,请发1001号给我” -
为什么是1001不是1000?因为SYN本身就算一个数据编号,占了一个号
-
这个包既是确认(ACK),也是发起(SYN),所以两个标志都是1
第三次握手:客户端确认
SYN=0, ACK=1 seq=1001 ack=5001
翻译成人话:
客户端对服务器说:
“服务器!我不发起新连接了(SYN=0)。
我收到了你的5000号数据(ACK=1)。
我期待你下一份数据编号是 5001(ack=5001)。
我的下一份数据将从 1001 开始编号(seq=1001)。”
关键理解:
-
ack=5001的意思是:“你的5000号(SYN)我收到了,请发5001号给我” -
客户端的seq为什么是1001?因为它的1000号(SYN)已经用掉了

三:四次挥手过程

第一步:客户端发送FIN
客户端 → 服务端 报文:FIN标志=1 含义:"我没有数据要发送了,想关闭连接" 客户端状态:FIN-WAIT-1
第二步:服务端发送ACK
服务端 → 客户端 报文:ACK标志=1 含义:"收到你的关闭请求了,但我可能还有数据要发" 服务端状态:CLOSE-WAIT 客户端状态:FIN-WAIT-2(收到ACK后) 注意:服务端**还没发自己的FIN**,因为它可能还有数据要传给客户端
第三步:服务端发送FIN
(当服务端也准备好关闭时)
服务端 → 客户端 报文:FIN标志=1 含义:"我也没有数据要发送了,可以关闭了" 服务端状态:LAST-ACK(等待最后一个ACK)
第四步:客户端发送ACK
客户端 → 服务端 报文:ACK标志=1 含义:"收到你的关闭请求,确认关闭" 客户端状态:TIME-WAIT(等待2MSL时间) 服务端状态:收到ACK后进入CLOSED
每个状态的含义
| 状态 | 含义 | 持续时间 |
|---|---|---|
| FIN-WAIT-1 | 已发送FIN,等待ACK | 短暂 |
| FIN-WAIT-2 | 收到ACK,等待对方的FIN | 可能较长 |
| CLOSE-WAIT | 收到FIN,准备关闭 | 应用控制 |
| LAST-ACK | 已发FIN,等待最后一个ACK | 短暂 |
| TIME-WAIT | 等待2MSL(确保对方收到ACK) | 2MSL(1-4分钟) |
更多推荐



所有评论(0)