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