【转】TCP的SEQ和ACK的生成
TCP序列號和確認(rèn)號詳解
完整的PDF下載:
在網(wǎng)絡(luò)分析中,讀懂TCP序列號和確認(rèn)號在的變化趨勢,可以幫助我們學(xué)習(xí)TCP協(xié)議以及排查通訊故障,如通過查看序列號和確認(rèn)號可以確定數(shù)據(jù)傳輸是否亂序。但我在查閱了當(dāng)前很多資料后發(fā)現(xiàn),它們大多只簡單介紹了TCP通訊的過程,并沒有對序列號和確認(rèn)號進(jìn)行詳細(xì)介紹,結(jié)合實(shí)例的講解就更沒有了。近段時間由于工作的原因,需要對TCP的序列號和確認(rèn)號進(jìn)行深入學(xué)習(xí),下面便是我學(xué)習(xí)后的一些知識點(diǎn)總結(jié),希望對TCP序列號和確認(rèn)號感興趣的朋友有一定幫助。
1.?? 序列號和確認(rèn)號的簡介及作用
TCP協(xié)議工作在OSI的傳輸層,是一種可靠的面向連接的數(shù)據(jù)流協(xié)議,TCP之所以可靠,是因?yàn)樗WC了傳送數(shù)據(jù)包的順序。順序是用一個序列號來保證的。響應(yīng)包內(nèi)也包括一個序列號,表示接收方準(zhǔn)備好這個序列號的包。在TCP傳送一個數(shù)據(jù)包時,它會把這個數(shù)據(jù)包放入重發(fā)隊(duì)列中,同時啟動計(jì)時器,如果收到了關(guān)于這個包的確認(rèn)信息,便將此數(shù)據(jù)包從隊(duì)列中刪除,如果在計(jì)時器超時的時候仍然沒有收到確認(rèn)信息,則需要重新發(fā)送該數(shù)據(jù)包。另外,TCP通過數(shù)據(jù)分段中的序列號來保證所有傳輸?shù)臄?shù)據(jù)可以按照正常的順序進(jìn)行重組,從而保障數(shù)據(jù)傳輸?shù)耐暾?br />
2.?? TCP的通訊過程
在TCP通訊中主要有連接的建立、數(shù)據(jù)的傳輸、連接的關(guān)閉三個過程!每個過程完成不同的工作,而且序列號和確認(rèn)號在每個過程中的變化都是不同的。
2.1 TCP建立連接
TCP建立連接,也就是我們常說的三次握手,它需要三步完成。在TCP的三次握手中,發(fā)送第一個SYN的一端執(zhí)行的是主動打開。而接收這個SYN并發(fā)回下一個SYN的另一端執(zhí)行的是被動打開。
這里以客戶端向服務(wù)器發(fā)起連接來說明。
1)?? 第1步:客戶端向服務(wù)器發(fā)送一個同步數(shù)據(jù)包請求建立連接,該數(shù)據(jù)包中,初始序列號(ISN)是客戶端隨機(jī)產(chǎn)生的一個值,確認(rèn)號是0;
2)?? 第2步:服務(wù)器收到這個同步請求數(shù)據(jù)包后,會對客戶端進(jìn)行一個同步確認(rèn)。這個數(shù)據(jù)包中,序列號(ISN)是服務(wù)器隨機(jī)產(chǎn)生的一個值,確認(rèn)號是客戶端的初始序列號+1;
3)?? 第3步:客戶端收到這個同步確認(rèn)數(shù)據(jù)包后,再對服務(wù)器進(jìn)行一個確認(rèn)。該數(shù)據(jù)包中,序列號是上一個同步請求數(shù)據(jù)包中的確認(rèn)號值,確認(rèn)號是服務(wù)器的初始序列號+1。
注意:因?yàn)橐粋€SYN將占用一個序號,所以要加1。
初始序列號(ISN)隨時間而變化的,而且不同的操作系統(tǒng)也會有不同的實(shí)現(xiàn)方式,所以每個連接的初始序列號是不同的。TCP連接兩端會在建立連接時,交互一些信息,如窗口大小、MSS等,以便為接著的數(shù)據(jù)傳輸做準(zhǔn)備。
RFC793指出ISN可以看作是一個32bit的計(jì)數(shù)器,每4ms加1,這樣選擇序號的目的在于防止在網(wǎng)絡(luò)中被延遲的分組在以后被重復(fù)傳輸,而導(dǎo)致某個連接的一端對它作錯誤的判斷。
2.2 TCP傳輸數(shù)據(jù)
在TCP建立連接后,就可以開始傳輸數(shù)據(jù)了。TCP工作在全雙工模式,它可以同時進(jìn)行雙向數(shù)據(jù)傳輸。這里為了簡化,我們只談服務(wù)器向客戶端發(fā)送數(shù)據(jù)的情況,而客戶端向服務(wù)器發(fā)送數(shù)據(jù)的原理和它是類似的,這里便不重復(fù)說明。
服務(wù)器向客戶端發(fā)送一個數(shù)據(jù)包后,客戶端收到這個數(shù)據(jù)包后,會向服務(wù)器發(fā)送一個確認(rèn)數(shù)據(jù)包。
傳輸數(shù)據(jù)的簡要過程如下:
1)?? 發(fā)送數(shù)據(jù):服務(wù)器向客戶端發(fā)送一個帶有數(shù)據(jù)的數(shù)據(jù)包,該數(shù)據(jù)包中的序列號和確認(rèn)號與建立連接第三步的數(shù)據(jù)包中的序列號和確認(rèn)號相同;
2)?? 確認(rèn)收到:客戶端收到該數(shù)據(jù)包,向服務(wù)器發(fā)送一個確認(rèn)數(shù)據(jù)包,該數(shù)據(jù)包中,序列號是為上一個數(shù)據(jù)包中的確認(rèn)號值,而確認(rèn)號為服務(wù)器發(fā)送的上一個數(shù)據(jù)包中的序列號+所該數(shù)據(jù)包中所帶數(shù)據(jù)的大小。
數(shù)據(jù)分段中的序列號可以保證所有傳輸?shù)臄?shù)據(jù)按照正常的次序進(jìn)行重組,而且通過確認(rèn)保證數(shù)據(jù)傳輸?shù)耐暾浴?br />
2.3 TCP關(guān)閉連接
前面我們提到,建立一個連接需要3個步驟,但是關(guān)閉一個連接需要經(jīng)過4個步驟。因?yàn)門CP連接是全雙工的工作模式,所以每個方向上需要單獨(dú)關(guān)閉。在TCP關(guān)閉連接時,首先關(guān)閉的一方(即發(fā)送第一個終止數(shù)據(jù)包的)將執(zhí)行主動關(guān)閉,而另一方(收到這個終止數(shù)據(jù)包的)再執(zhí)行被動關(guān)閉。
關(guān)閉連接的4個步驟如下:?
1)?? 第1步:服務(wù)器完成它的數(shù)據(jù)發(fā)送任務(wù)后,會主動向客戶端發(fā)送一個終止數(shù)據(jù)包,以關(guān)閉在這個方向上的TCP連接。該數(shù)據(jù)包中,序列號為客戶端發(fā)送的上一個數(shù)據(jù)包中的確認(rèn)號值,而確認(rèn)號為服務(wù)器發(fā)送的上一個數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶的數(shù)據(jù)的大小;
2)?? 第2步:客戶端收到服務(wù)器發(fā)送的終止數(shù)據(jù)包后,將對服務(wù)器發(fā)送確認(rèn)信息,以關(guān)閉該方向上的TCP連接。這時的數(shù)據(jù)包中,序列號為第1步中的確認(rèn)號值,而確認(rèn)號為第1步的數(shù)據(jù)包中的序列號+1;
3)?? 第3步:同理,客戶端完成它的數(shù)據(jù)發(fā)送任務(wù)后,就也會向服務(wù)器發(fā)送一個終止數(shù)據(jù)包,以關(guān)閉在這個方向上的TCP連接,該數(shù)據(jù)包中,序列號為服務(wù)器發(fā)送的上一個數(shù)據(jù)包中的確認(rèn)號值,而確認(rèn)號為客戶端發(fā)送的上一個數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶數(shù)據(jù)的大小;
4)?? 第4步:服務(wù)器收到客戶端發(fā)送的終止數(shù)據(jù)包后,將對客戶端發(fā)送確認(rèn)信息,以關(guān)閉該方向上的TCP連接。這時在數(shù)據(jù)包中,序列號為第3步中的確認(rèn)號值,而確認(rèn)號為第3步數(shù)據(jù)包中的序列號+1;
注意:因?yàn)镕IN和SYN一樣,也要占一個序號。理論上服務(wù)器在TCP連接關(guān)閉時發(fā)送的終止數(shù)據(jù)包中,只有終止位是置1,然后客戶端進(jìn)行確認(rèn)。但是在實(shí)際的TCP實(shí)現(xiàn)中,在終止數(shù)據(jù)包中,確認(rèn)位和終止位是同時置為1的,確認(rèn)位置為1表示對最后一次傳輸?shù)臄?shù)據(jù)進(jìn)行確認(rèn),終止位置為1表示關(guān)閉該方向的TCP連接。
3.?? 實(shí)際數(shù)據(jù)包分析
結(jié)合上面的理論,下面我們訪問網(wǎng)頁來捕獲數(shù)據(jù)包,通過實(shí)際的數(shù)據(jù)包來驗(yàn)證序列號和確認(rèn)號在TCP連接建立、傳輸數(shù)據(jù)以及關(guān)閉連接時的變化。
打開科來網(wǎng)絡(luò)分析系統(tǒng),首先為減少數(shù)據(jù)干擾,在過濾器中設(shè)置只捕獲TCP協(xié)議的數(shù)據(jù),然后開始捕獲,同時,訪問,待頁面下載完成后,停止捕獲。
此次環(huán)境中,客戶端為192.168.0.92,服務(wù)器為:222.77.187.23。
3.1 TCP建立連接
在捕獲的數(shù)據(jù)包中,首先我們來查看建立連接的三次握手信息,并且觀察數(shù)據(jù)包中序列號和確認(rèn)號的變化。為了讓大家看的更加明白,我在這里使用了“添加數(shù)據(jù)包注釋”的功能。
( 建立連接第一步)
客戶端向服務(wù)器發(fā)起一個同步請求數(shù)據(jù)包,請求連接服務(wù)器的80端口,客戶端隨機(jī)產(chǎn)生一個初始序列號(ISN)為2712239078,確認(rèn)號為0。
注意:在實(shí)際情況中,我們訪問網(wǎng)站首先進(jìn)行的是域名解析,這里我們設(shè)置了過濾器所以沒有捕獲到DNS數(shù)據(jù)包。?
( 建立連接第二步)
服務(wù)器收到客戶的同步請求數(shù)據(jù)包后,并向客戶端發(fā)送一個同步確認(rèn)數(shù)據(jù)。這個數(shù)據(jù)包中,服務(wù)器隨機(jī)產(chǎn)生一個初始序列號(1288781508),同時,將客戶端發(fā)送的初始序列號(ISN)加1(2712239078+1=2712239079)以作為確認(rèn)號發(fā)回給客戶段進(jìn)行確認(rèn)。
( 建立連接第三步)
客戶端收到這個同步確認(rèn)數(shù)據(jù)包后,再次對服務(wù)器進(jìn)行一次確認(rèn)。在這個數(shù)據(jù)包中,序列號為上一個數(shù)據(jù)包的確認(rèn)號(2712239079),確認(rèn)號為服務(wù)器的初始序列號(ISN)加1(1288781508+1=1288781509),以對服務(wù)器的同步確認(rèn)數(shù)據(jù)包進(jìn)行確認(rèn),這樣TCP連接就建立了。
3.2 TCP傳輸數(shù)據(jù)
TCP連接建立后,馬上就開始傳輸數(shù)據(jù),這里客戶端主動向服務(wù)器發(fā)送一個GET請求,來提交自己的請求信息。
(?? 傳輸數(shù)據(jù))
圖4中的是客戶端向服務(wù)器發(fā)送的GET請求據(jù)數(shù)據(jù)包,我們注意看序列號和確認(rèn)號的值!該數(shù)據(jù)包中,序列號為2712239079,確認(rèn)號為1288781509,這和三次握手的第三步的數(shù)據(jù)包中的序列號和確認(rèn)號相同。
從圖4中看出這個數(shù)據(jù)包的大小為1018字節(jié),其中減去14字節(jié)Ethernet報頭,20字節(jié)的IP報頭,20字節(jié)的TCP報頭和4字節(jié)的FCS(1018-14-20-20-4=960),得到傳輸?shù)臄?shù)據(jù)大小為1432。我們將該數(shù)據(jù)包中的序列號加上該數(shù)據(jù)大小(即2712239079+960=2712240039),發(fā)現(xiàn)與“下一個序列號”的值完全吻合,也就是下一個數(shù)據(jù)包中服務(wù)器發(fā)送給客戶端的數(shù)據(jù)包中的確認(rèn)號。
( 確認(rèn)收到)
注意:“下一個序列號”是科來網(wǎng)絡(luò)分析系統(tǒng)為了方便用戶查找下一個連續(xù)數(shù)據(jù)包,而根據(jù)數(shù)據(jù)包序列號和確認(rèn)號自動計(jì)算得出,該字段在實(shí)際數(shù)據(jù)包中是不存在的。
3.3 TCP關(guān)閉連接
在傳輸數(shù)據(jù)完成之后,TCP會關(guān)閉連接,這里是服務(wù)器主動關(guān)閉該方向上的TCP連接。我們繼續(xù)來觀察捕獲的數(shù)據(jù)包,先來看關(guān)閉連接的第一步,這里是服務(wù)器主動發(fā)起關(guān)閉
(?? 關(guān)閉連接第一步)
服務(wù)器向客戶端主動發(fā)起確認(rèn)位和終止位同時置為1的數(shù)據(jù)包,確認(rèn)位置1表示對最后一次傳輸?shù)臄?shù)據(jù)進(jìn)行確認(rèn),終止位置1表示關(guān)閉該方向的TCP連接,關(guān)閉服務(wù)器和客戶端的TCP連接。在這個數(shù)據(jù)包中,序列號為客戶端發(fā)送的上一個數(shù)據(jù)包中所帶的確認(rèn)號值(1288781777),而確認(rèn)號為服務(wù)器發(fā)送的上一個數(shù)據(jù)包中的序列號+該數(shù)據(jù)包所帶的數(shù)據(jù)的大小(2712238597+1432=2712240039);
然后客戶端收到該終止數(shù)據(jù)包,會對服務(wù)器發(fā)送一個確認(rèn)數(shù)據(jù)包,該數(shù)據(jù)包中,序列號為第1步中的確認(rèn)號值(2712240039),而確認(rèn)號為第1步的數(shù)據(jù)包中的序列號+1(1288781777+1=1288781778);
我們注意觀察序列號和確認(rèn)號的變化情況。
( 關(guān)閉連接第二步)
隨后,就是來自客戶端被動發(fā)起的關(guān)閉,它與服務(wù)器主動發(fā)起的關(guān)閉同理,只不過這次是被動關(guān)閉客戶端方向上的TCP連接,我們就不重復(fù)說明。
我們根據(jù)以上對TCP的建立連接、傳輸數(shù)據(jù)和關(guān)閉連接三個過程的抓包分析,成功的驗(yàn)證了前面所說的理論。
轉(zhuǎn)載于:https://www.cnblogs.com/ynxs/p/3655944.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的【转】TCP的SEQ和ACK的生成的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android Developers
- 下一篇: 设计模式学习--------3.简单工厂