TCP協議中的Ack和Seq號
阿新 • • 發佈:2022-05-21
一、基本概念
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=78
,ack=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=1441
,1441=6
號包的seq+6
號包的len=1+1440=1441
,表示我收到啦 len=0
總結
傳送方的包,包括seq
和len
,接收方如何告知對方資料已經收到呢?
答案就在於接收方的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