一.重要标志

开始之前,先记住几个标识。

  • 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分钟)
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐