TCP/IP頭部詳解


在網上找了很多有關tcp/ip頭部解析的資料,都是類似於下面的結構

抽象出圖文是這種結構,但是在底層中數據到底是怎么傳輸的呢?沒有答案,在深入學習之后,總結出數據傳輸的方式

IP數據包頭部格式:

上面是在數據到達傳輸層對數據進行IP頭部封裝的數據

TCP協議

TCP協議是傳輸協議,為應用層提供數據服務,和UDP不同,TCP提供可靠的面向連接服務,關於TCP頭部數據格式的說明

跟IP頭部差不多,基本長度為20個字節,基本介紹到此為止,詳解在網上多如牛毛,下面用兩台pc建立連接為例說明:

主機1:IP地址為192.168.1.1

主機2: IP地址為216.3.226.21

下面是TCP/IP傳輸的數據,下面這些為十六進制TCP/IP協議的數據,不是完整的網絡通信數據

第一次:向web站點發送連接請求

192.168.1.246 -> 123.56.106.180

IP頭部:45 00 00 30 52 52 40 00 80 06 2c 23 c0 a8 01 01 d8 03 e2 15

轉化成二進制:1000100111011111111111011111111111100101111111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

TCP頭部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00

轉化成二進制:1100111100100111111011111111111100010100111101010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

來看看IP頭部的數據都表示什么:

第一個字節 45:其中'4'代表IP的版本協議,說明是IPV4,'5'標識IP頭部長度,是一個4bit的字段,最大值就是1111了,IP頭部最大長度為60字節,最大值12,而這里的'5',說明有20個字節的長度,這是標准的IP頭部長度。

接下來是 00:是服務類型,由8個bit構成,每2個bit分別標識:最小延時、最大吞吐量、最高可靠性、以及最小費用。這四個1bit同時只能有1個為1。本例中都為0表示一般服務。

接下來 00 30:是IP數據報文的總長,包含頭部以及數據,這里表示48字節,這48字節表示由20字節的IP頭部,和28字節的TCP頭部構成。

接下來 52 52:轉換為十進制就是21074。這個是讓目的主機來判斷新來的分段屬於哪個分組。  

接下來 轉換為二進制就'0100 0000',其中第一位是IP協議目前沒有用上的,為0。接着的是兩個標志DF和MF。DF為1表示不要分段,MF為1表示還有進一步的分段(本例為0)。然后的“0 0000”是分段便移

接下來 80:這個字節就是TTL,表示一個IP數據流的生命周期。轉化成10進制為128,說明該數據包最多經過128次路由將被丟棄,每路由一次,TTL的值減1。

接下來 '06',這個字節表示傳輸層的協議類型。在RFC790中有定義,6表示傳輸層是TCP協議。

接下來 '2c 23'這個16bit是頭校驗和。

接下來“c0 a8 01 01”,這個就是源地址(Source Address)了,也就是主機1的IP地址。轉換為十進制的IP地址就是:192.168.1.1,同樣,繼續下來的32位“d8 03 e2 15”是目標地址,216.3.226.21

至此IP數據頭部大概解析完成,接下來解析TCP頭部

TCP頭部:0d 28 00 15 50 5f a9 06 00 00 00 00 70 02 40 00 c0 29 00 00

兩字節段'0d 2',表示本地端口號,轉換為十進制就是3368。第二個兩字節段'00 15'表示目標端口,因為我是連接FTP站點,所以,這個就是21啦,十六進制當然就是'00 15'。

 

接下來的四個字節“50 5f a9 06”是順序號(Sequence Number),簡寫為SEQ,SEQ=1348446470下面的四個字節“00 00 00 00”是確認號(Acknowledgment Number),簡寫為ACKNUM。

繼續兩個字節,'70 02',轉換為二進制吧,“0111 0000 0000 0010”。這兩個字節,總共16bit,有好多東西呢。第一個4bit'0111',是TCP頭長,十進制為7,表示28個字節(剛才說了,我省略了8字節的option數據,所以你只看見了20字節)。接着的6bit現在TCP協議沒有用上,都為0。最后的6bit“00 0010”是六個重要的標志。這是兩個計算機數據交流的信息標志。接收和發送斷根據這些標志來確定信息流的種類(三次握手和四次握手機制)。下面是一些介紹:

URG:(Urgent Pointer field significant)緊急指針。用到的時候值為1,用來處理避免TCP數據流中斷 

ACK:(Acknowledgment fieldsignificant)置1時表示確認號(AcknowledgmentNumber)為合法,為0的時候表示數據段不包含確認信息,確認號被忽略。

PSH:(Push Function),PUSH標志的數據,置1時請求的數據段在接收方得到后就可直接送到應用程序,而不必等到緩沖區滿時才傳送。 

RST:(Reset the connection)用於復位因某種原因引起出現的錯誤連接,也用來拒絕非法數據和請求。如果接收到RST位時候,通常發生了某些錯誤。

SYN:(Synchronize sequence numbers)用來建立連接,在連接請求中,SYN=1,ACK=0,連接響應時,SYN=1,ACK=1。即,SYN和ACK來區分Connection Request和Connection Accepted。

FIN:(No more data from sender)用來釋放連接,表明發送方已經沒有數據發送了。

這6個標志位,自己對號入座吧。本例中SYN=1,ACK=0,當然就是表示連接請求了。我們可以注意下面兩個過程的這兩位的變換。

后面的“40 00 c0 29 00 00”不講了,呵呵,偷懶了。后面兩次通訊的數據,自己分開看吧。我們看看連接的過程,一些重要地方的變化。

第二次,web站點返回一個可以連接的信號。 

  216.3.226.21->192.168.1.1 

  IP頭部: 45 00 00 2c c6 be 40 00 6a 06 cd ba d8 03 e2 15 c0 a8 01 01  

  TCP頭部:00 15 0d 28 4b 4f 45 c1 50 5f a9 07 60 12 20 58 64 07 00 00

第三次,我確認連接。TCP連接建立起來。  

  192.168.1.1->216.3.226.21  

  IP頭部: 45 00 00 28 52 53 40 00 80 06 2c 2a c0 a8 01 01 d8 03 e2 15  

  TCP頭部:0d 28 00 15 50 5f a9 07 4b 4f 45 c2 50 10 40 b0 5b 1c 00 00

  第一步,我發出連接請求,TCP數據為:SEQ=50 5f a9 06,ACKNUM=00 00 00 00,SYN=1,ACK=0。  

  第二步,對方確認可以連接,TCP數據為:SEQ=4b 4f 45 c1,ACKNUM=50 5f a9 07,SYN=1,ACK=1。  

  第三步,我確認建立連接。SEQ=50 5f a9 07, ACKNUM=4b 4f45c2,SYN=0,ACK=1。  

可以看出什么變化么?正式建立連接了。在之后的數據傳輸中,攜帶ACK進行安全傳輸

接收從216.3.226.21->192.168.1.1的下一個數據包中:SEQ=4b 4f 45 c2,ACKNUM=50 5f a9 07,SYN=0,ACK=1

至此基本的分析完成,其中有很多細節需要深入理解,這里不再一一贅述。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM