TCP序列號和確認號詳解

2022-02-20 19:07:48 字數 3379 閱讀 9922

簡介與作用

tcp協議工作在osi的傳輸層,是一種可靠的面向連線的資料流協議,tcp之所以可靠,是因為它保證了傳送資料報的順序。順序是用乙個序列號來保證的。響應包內也包括乙個序列號,表示接收方準備好這個序列號的包。在tcp傳送乙個資料報時,它會把這個資料報放入重發佇列中,同時啟動計時器,如果收到了關於這個包的確認資訊,便將此資料報從佇列中刪除,如果在計時器超時的時候仍然沒有收到確認資訊,則需要重新傳送該資料報。另外,tcp通過資料分段中的序列號來保證所有傳輸的資料可以按照正常的順序進行重組,從而保障資料傳輸的完整。 .

在tcp通訊中主要有連線的建立、資料的傳輸、連線的關閉三個過程!每個過程完成不同的工作,而且序列號和確認號在每個過程中的變化都是不同的。 

tcp建立連線

tcp建立連線也就是我們常說的三次握手,我們這裡以客戶端向伺服器端發起連線為例來說明序列號和確認號。

客戶端向伺服器傳送乙個同步資料報請求建立連線,該資料報中,初始序列號(isn)是客戶端隨機產生的乙個值2712239078, 確認號是0

伺服器收到這個同步請求資料報後,會對客戶端進行乙個同步確認ack。這個資料報中,序列號是伺服器隨機產生的乙個值1288781508 ,確認號是客戶端的初始序列號+1 (2712239078+1=2712239079) 

客戶端收到這個同步確認資料報後,再對伺服器進行乙個確認。該資料報中,序列號是上乙個同步請求資料報中的確認號值2712239079 ,確認號是伺服器的初始序列號+1 (1288781508+1=1288781509)

tcp傳輸資料

這裡客戶端主動向伺服器傳送乙個get請求,來提交自己的請求資訊。

該資料報中,序列號為2712239079,確認號為1288781509,這和三次握手的第三步的資料報中的序列號和確認號相同。

從圖4中看出這個資料報的大小為1018位元組,其中減去14位元組ethernet報頭,20位元組的ip報頭,20位元組的tcp報頭和4位元組的fcs(1018-14-20-20-4=960),得到傳輸的資料大小為1432。我們將該資料報中的序列號加上該資料大小(即2712239079+960=2712240039),發現與「下乙個序列號」的值完全吻合,也就是下乙個資料報中伺服器傳送給客戶端的資料報中的確認號 

確認收到 

三次握手(總結)

client --> 置syn標誌 序列號 = j,確認號 = 0 ----> server

client

clinet --> 置ack標誌 序列號 = j + 1,確認號 = k + 1 --> server

鏈結建立後,接下來client端傳送的資料報將從j + 1開始,server端傳送的資料報將從k + 1開始,這裡要說明的是:建立鏈結時,client端宣稱自己的初始序列號是j,server端宣稱自己的初始序列號是k,但是建立連線後的資料報卻各自中初始序列號+1開始,這是因為syn請求本身需要占用乙個序列號 

資料傳輸(總結)

client --> 置psh標誌,置ack標誌 序列號 = 55555, 確認號 = 22222,資料報長度 = 11 ---> server

client

client

client --> 置ack標誌,序列號 = 55566, 確認號 = 22244(=22222+22),資料報長度 = 0 ---> server

tcp的建立與終止

三次握手狀態遷移圖

客戶端   closed->syn_sent->established->

伺服器   closed->listen->syn收到->established 

closed: 表示初始狀態。

listen: 表示伺服器端的某個socket處於監聽狀態,可以接受連線了

syn_rcvd: 這個狀態表示接受到了syn報文,並發出ack 包

syn_sent: 當客戶端socket執行connect連線時,它首先傳送syn報文,因此也隨即它會進入到了syn_sent狀態,並等待服務端的傳送三次握手中的第2個報      文。syn_sent狀態表示客戶端已傳送syn報文。

established:表示連線已經建立

四次揮手

客戶端  fin_wait_1>fin_wait_2->time_wait->closed

伺服器  close_wait->last_ack->closed

fin_wait_1: 當socket在established狀態時,它想主動關閉連線,向對方傳送了fin報文,此時該socket即進入到fin_wait_1狀態。而當對方回應ack報      文後,則進入到fin_wait_2狀態,

fin_wait_2:上面已經詳細解釋了這種狀態,實際上fin_wait_2狀態下的socket,表示半連線,也即有一方要求close連線,但另外還告訴對方,我暫時還有點       資料需要傳送給你,稍後再關閉連線。

time_wait: 表示收到了對方的fin報文,並傳送出了ack報文就等2msl(2倍最大生存時間)後即可回到closed可用狀態了。

close_wait: 這種狀態的含義其實是表示在等待關閉。當對方close乙個socket後傳送fin報文給自己,你系統毫無疑問地會回應乙個ack報文給對方,此時則進入

到close_wait狀態。接下來呢,實際上你真正需要考慮的事情是察看你是否還有資料傳送給對方,如果沒有的話,那麼你也就可以close這個socket,傳送fin報文給對方,也即關閉連線。所以你在close_wait狀態下,需要完成的事情是等待你去關閉連線。

nlast_ack: 它是被動關閉一方在傳送fin報文後,最後等待對方的ack報文。當收到ack報文後,也即可以進入到closed可用狀態了。

TCP序列號和確認號詳解

1.序列號和確認號的簡介及作用 tcp協議工作在osi的傳輸層,是一種可靠的面向連線的資料流協議,tcp之所以可靠,是因為它保證了傳送資料報的順序。順序是用乙個序列號來保證的。響應包內也包括乙個序列號,表示接收方準備好這個序列號的包。在tcp傳送乙個資料報時,它會把這個資料報放入重發佇列中,同時啟動...

TCP序列號和確認號詳解

1.序列號和確認號的簡介及作用 tcp協議工作在osi的傳輸層,是一種可靠的面向連線的資料流協議,tcp之所以可靠,是因為它保證了傳送資料報的順序。順序是用乙個序列號來保證的。響應包內也包括乙個序列號,表示接收方準備好這個序列號的包。在tcp傳送乙個資料報時,它會把這個資料報放入重發佇列中,同時啟動...

TCP三次握手的過程,以及序列號和確認號的作用

tcp握手協議 在tcp ip協議中,tcp協議提供可靠的連線服務,採用三次握手建立乙個連線。1 第一次握手 建立連線時,客戶端傳送syn包 syn j 到伺服器,並進入syn send狀態,等待伺服器確認 syn 同步序列編號 synchronize sequence numbers 2 第二次握...