原文鏈接:https://www.cnblogs.com/god-of-death/p/7905817.html
下圖爲網絡編程實戰學習筆記(八)中demo的實驗抓包情況
TCP ------ 抓包分析(seq ack)總結的挺好的,直接抄過來了。
總結:
1、ACK包可以和其他包合在一起,比如ACK包可以攜帶數據
2、可以接收多個數據包後,一次性給一個應答,不用每個數據包一一對應給應答
3、在通信過程中,通過接收到的包的ack值可以判斷是否是上一個本機發送包的應答包(ack值與上一個本機發送包的seq有關),seq值和ack值的確定規則如下:
三次握手:
第一次握手(發送):seq爲x(x爲任意值),無視ack(因爲是第一個包,不需要給其他包應答)
第二次握手(發送):seq爲y(y爲任意值),ack等於接收包seq+1(即x+1)
第三次握手(發送):seq等於上一個本機發送包seq+1(即x+1),也就是1,ack等於接收包seq+1(即y+1)
數據傳輸:
某主機發送的seq和ack是根據上一個接收包的seq、ack和len得到,具體爲:seq=ack,ack=seq+len
提醒:如果某一主機連續發了4個包,後三個包的seq和ack和第一個包的一樣
提醒:seq會單調增大
特別:如果握手完第一個數據包是客戶端發送,第一個數據包的seq和ack和第三次握手的一樣
四次揮手:
如果是服務器發起的揮手,揮手前最後一個包是服務器發送:
如果是客戶端發起的揮手,揮手前最後一個包是客戶端發送:
第一次揮手(發送):seq爲上一個本機發送包seq+len,ack爲上一個本機發送包ack
第二個揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1
第三次揮手(發送):和第二次揮手一樣
第四次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1
如果是服務器發起的揮手,揮手前最後一個包是客戶端發送:
如果是客戶端發起的揮手,揮手前最後一個包是服務器發送:
第一次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+len
第二個揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1
第三次揮手(發送):和第二次揮手一樣
第四次揮手(發送):seq爲本次接收包ack,ack爲本次接收包seq+1