1. 程式人生 > 其它 >TCP協議中的Ack和Seq號

TCP協議中的Ack和Seq號

一、基本概念

seq:表示本次傳送資料的偏移量,也就是從哪裡開始傳送資料。

len:表示本次tcp攜帶的資料長度。

ack:首先意味著已經收到對方多少位元組資料,其次告訴對方接下來的包的seq要從ack確定的數值繼續接力。

二、Wireshark抓包

本地請求61.135.185.32這個ip,這個過程的抓包如下。

三次握手

(客戶端)1號包:我能和你建立連線嗎?

  • seq=0,表示這是一個新的開始
  • 沒有ack,因為還沒有建立連線,也就不存在我收到了對方多少的資料的說法
  • Len=0,表示我沒有傳輸資料,就是一個想要建立連線的tcp包而已。

(服務端)2號包:我收到了,我們能進行連線,快來玩吧。

  • seq=0
  • ack=1暗示了兩點,第一表示我收到了你剛才的那個seq=0的連線請求,另外告訴對方接下來請從seq=1開始給我傳輸資料
  • Len=0,表示同樣沒有傳輸資料。

(客戶端)3號包:好的,那我們就連線吧。

  • seq=1,響應上面的包,我真的從seq=1開始傳輸哦
  • ack=1,表示我收到了你的seq=0同意連線,下面你也請從seq=1給我傳輸資料吧
  • Len=0

好了,三次握手愉快的結束,建立起來了連線。

 

總結一下三次握手的過程:

  • 起始包的seq都等於0
  • 三次握手中的ack=對方上一個的seq+1
  • seq等於對方上次的ack

資料傳輸過程

(客戶端)4號包:我要你的首頁資訊

客戶端傳送http請求,http請求需要tcp進行控制,然後交給ip層,然後由網絡卡發出...

注意4號幀tcp包的內容

  • seq=1,因為上次沒有傳輸資料,seq號不變,也就是3號包的seq=1,len=0
  • ack=1,告訴服務端你要是傳送資料,得從seq=1開始哈
  • len=77,表示我這次傳輸的資料位元組數

(服務端)5號包:好的,我收到你的請求了。

  • seq=1,如4號包的ack所要求的
  • ack=78ack=4號包的seq+4號包的len = 1+77=78表示客戶端啊,你要是再發就從seq=78開始傳送哈
  • len=0

(服務端)`6`號包:諾,給你的資料

5、6號均為服務端傳送的包,在這期間沒有接收到包,理所應當的,5、6

號包的seq、ack是一樣的。

  • seq=1
  • ack=78
  • len=1440,資料的長度

(客戶端)7號包:收到啦

  • seq=78,你讓我從78發,我就從78
  • ack=14411441=6號包的seq+6號包的len=1+1440=1441,表示我收到啦
  • len=0

總結

傳送方的包,包括seqlen,接收方如何告知對方資料已經收到呢?

答案就在於接收方的ack=傳送方的seq+傳送方的len

整體來講,就是這樣。

特殊情況在於三次握手時,客戶端、服務端握手時,len=0,此時對方就不是ack=seq+0,而是ack=seq+1

 

參考連結:

https://blog.csdn.net/zhangdaxia2/article/details/107760114

https://zhuanlan.zhihu.com/p/439614017