TCP的SEQ和ACK的生成

2021-06-19 02:56:17 字數 4279 閱讀 9447

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

2.   tcp的通訊過程

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

2.1 tcp建立連線

tcp建立連線,也就是我們常說的三次握手,它需要三步完成。在tcp的三次握手中,傳送第乙個syn的一端執行的是主動開啟。而接收這個syn並發回下乙個syn的另一端執行的是被動開啟。

這裡以客戶端向伺服器發起連線來說明。

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

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

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

注意:因為乙個syn將占用乙個序號,所以要加1。

初始序列號(isn)隨時間而變化的,而且不同的作業系統也會有不同的實現方式,所以每個連線的初始序列號是不同的。tcp連線兩端會在建立連線時,互動一些資訊,如視窗大小、mss等,以便為接著的資料傳輸做準備。

rfc793指出isn可以看作是乙個32bit的計數器,每4ms加1,這樣選擇序號的目的在於防止在網路中被延遲的分組在以後被重複傳輸,而導致某個連線的一端對它作錯誤的判斷。

2.2 tcp傳輸資料

在tcp建立連線後,就可以開始傳輸資料了。tcp工作在全雙工模式,它可以同時進行雙向資料傳輸。這裡為了簡化,我們只談伺服器向客戶端傳送資料的情況,而客戶端向伺服器傳送資料的原理和它是類似的,這裡便不重複說明。

伺服器向客戶端傳送乙個資料報後,客戶端收到這個資料報後,會向伺服器傳送乙個確認資料報。

傳輸資料的簡要過程如下:

1)   傳送資料:伺服器向客戶端傳送乙個帶有資料的資料報,該資料報中的序列號和確認號與建立連線第三步的資料報中的序列號和確認號相同;

2)   確認收到:客戶端收到該資料報,向伺服器傳送乙個確認資料報,該資料報中,序列號是為上乙個資料報中的確認號值,而確認號為伺服器傳送的上乙個資料報中的序列號+所該資料報中所帶資料的大小。

資料分段中的序列號可以保證所有傳輸的資料按照正常的次序進行重組,而且通過確認保證資料傳輸的完整性。

2.3 tcp關閉連線

前面我們提到,建立乙個連線需要3個步驟,但是關閉乙個連線需要經過4個步驟。因為tcp連線是全雙工的工作模式,所以每個方向上需要單獨關閉。在tcp關閉連線時,首先關閉的一方(即傳送第乙個終止資料報的)將執行主動關閉,而另一方(收到這個終止資料報的)再執行被動關閉。

關閉連線的4個步驟如下: 

1)   第1步:伺服器完成它的資料傳送任務後,會主動向客戶端傳送乙個終止資料報,以關閉在這個方向上的tcp連線。該資料報中,序列號為客戶端傳送的上乙個資料報中的確認號值,而確認號為伺服器傳送的上乙個資料報中的序列號+該資料報所帶的資料的大小;

2)   第2步:客戶端收到伺服器傳送的終止資料報後,將對伺服器傳送確認資訊,以關閉該方向上的tcp連線。這時的資料報中,序列號為第1步中的確認號值,而確認號為第1步的資料報中的序列號+1;

3)   第3步:同理,客戶端完成它的資料傳送任務後,就也會向伺服器傳送乙個終止資料報,以關閉在這個方向上的tcp連線,該資料報中,序列號為伺服器傳送的上乙個資料報中的確認號值,而確認號為客戶端傳送的上乙個資料報中的序列號+該資料報所帶資料的大小;

4)   第4步:伺服器收到客戶端傳送的終止資料報後,將對客戶端傳送確認資訊,以關閉該方向上的tcp連線。這時在資料報中,序列號為第3步中的確認號值,而確認號為第3步資料報中的序列號+1;

注意:因為fin和syn一樣,也要佔乙個序號。理論上伺服器在tcp連線關閉時傳送的終止資料報中,只有終止位是置1,然後客戶端進行確認。但是在實際的tcp實現中,在終止資料報中,確認位和終止位是同時置為1的,確認位置為1表示對最後一次傳輸的資料進行確認,終止位置為1表示關閉該方向的tcp連線。

3.   實際資料報分析

在捕獲的資料報中,首先我們來檢視建立連線的三次握手資訊,並且觀察資料報中序列號和確認號的變化。為了讓大家看的更加明白,我在這裡使用了「新增資料報注釋」的功能。

( 建立連線第一步)

客戶端向伺服器發起乙個同步請求資料報,請求連線伺服器的80埠,客戶端隨機產生乙個初始序列號(isn)為2712239078,確認號為0。

注意:在實際情況中,我們訪問**首先進行的是網域名稱解析,這裡我們設定了過濾器所以沒有捕獲到dns資料報。 

( 建立連線第二步)

伺服器收到客戶的同步請求資料報後,並向客戶端傳送乙個同步確認資料。這個資料報中,伺服器隨機產生乙個初始序列號(1288781508),同時,將客戶端傳送的初始序列號(isn)加1(2712239078+1=2712239079)以作為確認號發回給客戶段進行確認。

( 建立連線第三步)

客戶端收到這個同步確認資料報後,再次對伺服器進行一次確認。在這個資料報中,序列號為上乙個資料報的確認號(2712239079),確認號為伺服器的初始序列號(isn)加1(1288781508+1=1288781509),以對伺服器的同步確認資料報進行確認,這樣tcp連線就建立了。

3.2 tcp傳輸資料

tcp連線建立後,馬上就開始傳輸資料,這裡客戶端主動向伺服器傳送乙個get請求,來提交自己的請求資訊。

(   傳輸資料)

圖4中的是客戶端向伺服器傳送的get請求據資料報,我們注意看序列號和確認號的值!該資料報中,序列號為2712239079,確認號為1288781509,這和三次握手的第三步的資料報中的序列號和確認號相同。

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

( 確認收到)

注意:「下乙個序列號」是科來網路分析系統為了方便使用者查詢下乙個連續資料報,而根據資料報序列號和確認號自動計算得出,該字段在實際資料報中是不存在的。

3.3 tcp關閉連線

在傳輸資料完成之後,tcp會關閉連線,這裡是伺服器主動關閉該方向上的tcp連線。我們繼續來觀察捕獲的資料報,先來看關閉連線的第一步,這裡是伺服器主動發起關閉

(   關閉連線第一步)

伺服器向客戶端主動發起確認位和終止位同時置為1的資料報,確認位置1表示對最後一次傳輸的資料進行確認,終止位置1表示關閉該方向的tcp連線,關閉伺服器和客戶端的tcp連線。在這個資料報中,序列號為客戶端傳送的上乙個資料報中所帶的確認號值(1288781777),而確認號為伺服器傳送的上乙個資料報中的序列號+該資料報所帶的資料的大小(2712238597+1432=2712240039);

然後客戶端收到該終止資料報,會對伺服器傳送乙個確認資料報,該資料報中,序列號為第1步中的確認號值(2712240039),而確認號為第1步的資料報中的序列號+1(1288781777+1=1288781778);

我們注意觀察序列號和確認號的變化情況。

( 關閉連線第二步)

隨後,就是來自客戶端被動發起的關閉,它與伺服器主動發起的關閉同理,只不過這次是被動關閉客戶端方向上的tcp連線,我們就不重複說明。

我們根據以上對tcp的建立連線、傳輸資料和關閉連線三個過程的抓包分析,成功的驗證了前面所說的理論。

TCP的SEQ和ACK的生成

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

TCP的SEQ和ACK的生成

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

TCP連線中seq和ack是什麼東西呢

seq是序列號,這是為了連線以後傳送資料用的,ack是對收到的資料報的確認,值是等待接收的資料報的序列號。在第一次訊息傳送中,a隨機選取乙個序列號作為自己的初始序號傳送給b 第二次訊息b使用ack對a的資料報進行確認,因為已經收到了序列號為x的資料報,準備接收序列號為x 1的包,所以ack x 1,...