天天看點

TCP序列号和确認号詳解

TCP序列号和确認号詳解

在網絡分析中,讀懂TCP序列号和确認号在的變化趨勢,可以幫助我們學習TCP協定以及排查通訊故障,如通過檢視序列号和确認号可以确定資料傳輸是否亂序。但我在查閱了目前很多資料後發現,它們大多隻簡單介紹了TCP通訊的過程,并沒有對序列号和确認号進行詳細介紹,結合執行個體的講解就更沒有了。近段時間由于工作的原因,需要對TCP的序列号和确認号進行深入學習,下面便是我學習後的一些知識點總結,希望對TCP序列号和确認号感興趣的朋友有一定幫助。

1.  序列号和确認号的簡介及作用

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.  實際資料包分析

結合上面的理論,下面我們通路網頁來捕獲資料包,通過實際的資料包來驗證序列号和确認号在TCP連接配接建立、傳輸資料以及關閉連接配接時的變化。

此次環境中,用戶端為192.168.0.92,伺服器為:222.77.187.23。

3.1 TCP建立連接配接

在捕獲的資料包中,首先我們來檢視建立連接配接的三次握手資訊,并且觀察資料包中序列号和确認号的變化。為了讓大家看的更加明白,我在這裡使用了“添加資料包注釋”的功能。

我們先來檢視建立連接配接的第一步,如圖1所示。

(圖1  建立連接配接第一步)

圖1中,用戶端向伺服器發起一個同步請求資料包,請求連接配接伺服器的80端口,用戶端随機産生一個初始序列号(ISN)為2712239078,确認号為0。

注意:在實際情況中,我們通路網站首先進行的是域名解析,這裡我們設定了過濾器是以沒有捕獲到DNS資料包。 

接下來我們再看建立連接配接的第二步。如圖2。

(圖2  建立連接配接第二步)

圖2中,伺服器收到客戶的同步請求資料包後,并向用戶端發送一個同步确認資料。這個資料包中,伺服器随機産生一個初始序列号(1288781508),同時,将用戶端發送的初始序列号(ISN)加1(2712239078+1=2712239079)以作為确認号發回給客戶段進行确認。

我們再來檢視建立連接配接的第三步,如下圖3。

(圖3  建立連接配接第三步)

圖3中,用戶端收到這個同步确認資料包後,再次對伺服器進行一次确認。在這個資料包中,序列号為上一個資料包的确認号(2712239079),确認号為伺服器的初始序列号(ISN)加1(1288781508+1=1288781509),以對伺服器的同步确認資料包進行确認,這樣TCP連接配接就建立了。

3.2 TCP傳輸資料

TCP連接配接建立後,馬上就開始傳輸資料,這裡用戶端主動向伺服器發送一個GET請求,來送出自己的請求資訊。

下面我們就來看用戶端發送給伺服器的GET請求資料包,如圖4所示,

(圖4  傳輸資料)

圖4中的是用戶端向伺服器發送的GET請求據資料包,我們注意看序列号和确認号的值!該資料包中,序列号為2712239079,确認号為1288781509,這和三次握手的第三步的資料包中的序列号和确認号相同。

從圖4中看出這個資料包的大小為1018位元組,其中減去14位元組Ethernet報頭,20位元組的IP報頭,20位元組的TCP報頭和4位元組的FCS(1018-14-20-20-4=960),得到傳輸的資料大小為1432。我們将該資料包中的序列号加上該資料大小(即2712239079+960=2712240039),發現與“下一個序列号”的值完全吻合,也就是下一個資料包中伺服器發送給用戶端的資料包中的确認号,如圖5所示。

(圖5 确認收到)

注意:“下一個序列号”是科來網絡分析系統為了友善使用者查找下一個連續資料包,而根據資料包序列号和确認号自動計算得出,該字段在實際資料包中是不存在的。

3.3 TCP關閉連接配接

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

(圖6  關閉連接配接第一步)

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

然後用戶端收到該終止資料包,會對伺服器發送一個确認資料包,該資料包中,序列号為第1步中的确認号值(2712240039),而确認号為第1步的資料包中的序列号+1(1288781777+1=1288781778);

我們注意觀察序列号和确認号的變化情況,如圖7所示。

(圖7  關閉連接配接第二步)

随後,就是來自用戶端被動發起的關閉,它與伺服器主動發起的關閉同理,隻不過這次是被動關閉用戶端方向上的TCP連接配接,我們就不重複說明,如圖8和圖9所示。

(圖8  關閉連接配接第三步)

(圖9  關閉連接配接第四步)

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

本文轉自gauyanm 51CTO部落格,原文連結:http://blog.51cto.com/gauyanm/235333,如需轉載請自行聯系原作者

繼續閱讀