TCP/IP協議棧概述及各層包頭分析


一、摘要

  對之前幾篇博文涉及到的網絡通信協議進行分析,概述出TCP/IP的協議棧模型,最后根據實例對各層包頭進行分析。

 

二、標准TCP/IP協議棧模型

  標准TCP/IP協議是用於計算機通信的一組協議,通常被稱為TCP/IP協議棧,以它為基礎組建的互聯網是目前國際上規模最大的計算機網絡。正因為互聯網的廣泛應用,使得TCP/IP成為了事實上的網絡標准。

1、OSI模型和TCP/IP協議模型

  圖1是OSI模型和TCP/IP協議模型的對比。

圖1 OSI模型和TCP/IP協議模型

2、TCP/IP協議模型分層

(1)網絡接口層

  TCP/IP協議模型的基層,負責數據幀的發送和接收。對應OSI模型中的物理層和數據鏈路層,是TCP/IP的最底層,不過通常在描述TCP/IP模型時還是會划分具體為物理層(PHY)和數據鏈路層(MAC)。

(2)網絡層

  通過互聯協議將數據包封裝成互聯網數據包,並運行必要的路由算法。這里有4種互聯協議。

  (a)網際協議IP:負責在主機和網絡之間的路徑尋址和數據包路由。

  (b)地址解析協議ARP:獲得同一物理網絡中的主機硬件地址。

  (c)網際控制消息協議ICMP:發送消息,並報告有關數據包的傳送錯誤。

  (d)互聯組管理協議IGMP:用來實現本地多路廣播路由器報告。

(3)傳輸層

  傳輸協議在主機之間提供通信會話。傳輸協議的選擇根據數據傳輸方式而定。主要有以下2種傳輸協議:

  (a)傳輸控制協議TCP:為應用程序提供可靠的通信連接,適用於要求得到響應的應用程序。

  (b)用戶數據包協議UDP:提供無連接通信,且不對傳輸包進行可靠性確認。

(4)應用層

  應用程序通過這一層訪問網絡,主要包括常見的FTP、HTTP、DNS和TELNET協議。

3、TCP/IP協議模型對數據的封裝

圖2 各層數據包之間的相關性

  在TCP/IP協議模型的4層協議中,各層數據包封裝情況如圖2所示。在發送數據時,將數據從最上層到最下層一次打包(加上包頭和部分尾部信息);在接收數據時,則將從數據從最下層到最上層依次拆包(去掉包頭和部分尾部信息)。這些打包和拆包操作就是由TCP/IP協議棧實現的。下面根據實例對上述包頭進行詳細分析。

 

三、TCP/IP協議棧中各層包頭的分析

1、獲取數據包  

  (a) 以“DIY_DE2之DM9000A網卡調試系列例程(二)——DM9000A測試、自收發、實現UDP”為實例

  獲取數據包的方式有兩種:通過wireshark抓包工具抓取數據包和通過NIOS II端中斷的方式獲取PC端發送的數據包,獲取的數據包分別如下:

通過wireshark獲得:

e0 cb 4e b7 9e d1 01 60

6e 11 02 0f 08 00 45 00

05 d8 00 00 00 00 80 11

b1 97 c0 a8 00 2c c0 a8

02 01 04 00 04 00 05 c4

00 00

  這42個字節即是該例程的數據發送到PC端的包頭,42個字節之后就是有效數據,最后的4個字節則為校驗位。通過上述例程語句也能很清楚的分析各個數據的含義。

通過NIOS II端獲得:

ff   ff   ff  ff   ff   ff  e0 cb 

4e b7 9e d1 08 00 45 00 

00 1e 3c ac 00 00 80 11 

3b 7a c0 a8 02 01 ff   ff  

ff  ff  04  00 04 00 00 0a

04 31

  同上。

  由於該例程主要是實現UDP,所以TCP包頭不夠明了,為了全面的分析各個包頭,將使用下面的例程。

  (b) 以“DIY_DE2之DM9000A網卡調試系列例程(四)——基於NicheStack協議棧的TCP/IP實現”為實例

  通過wireshark獲取的數據包如下:

00 07 ed ff 06 00 00 0f

ea fd 9f 96 08 00 45 00

00 29 38 13 40 00 40 06 

7d 60 c0 a8 02 0a c0 a8

02 01 18 98 00 17 37 8d

49 3b 00 46 74 e0 50 18

fe d9 ea f7 00 00 32

  下面將對其做具體分析。

2、MAC包頭

  MAC包頭占有14字節,即:

  00 07 ed ff 06 00 00 0f ea fd 9f 96 08 00

  很容易看出來 00 07 ed ff 06 00 和 00 0f ea fd 9f 96 分別是DIY_DE2和PC的MAC地址,后面的 08 00,不知道是什么。

3、IP包頭

  IP包頭占有20個字節,即:

  45 00 00 29 38 13 40 00 40 06 7d 60 c0 a8 02 0a c0 a8 02 01

  (1) “45”,其中“4”是IP協議的版本(Version),說明是IP4。“5”是IHL位,表示IP頭部的長度,是一個4bit字段,最大就是1111了,值為12,IP頭部的最大長度就是60字節。而這里為“5”,說明是20字節,這是標准的IP頭部長度,頭部報文中沒有發送可選部分數據。 

  (2) “00”,服務類型(Type of Service)。這個8bit字段由3bit的優先權子字段(現在已經被忽略),4 bit的TOS子字段以及1 bit的未用字段(現在為0)構成.4 bit的TOS子字段包含:最小延時、最大吞吐量、最高可靠性以及最小費用構成,這四個1bit位最多只能有一個為1,本例中都為0,表示是一般服務。 

  (3) “00 29”,IP數據報文總長,包含頭部以及數據,這里表示41字節。這41字節由20字節的IP頭部以及21字節的TCP頭構成(最后的一個字節為數據)。因此目前最大的IP數據包長度是65535字節。 

  (4) “38 13”,兩個字節的標志位,這個是讓目的主機來判斷新來的分段屬於哪個分組。 

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

  (6) “00”,待定。

  (7) “40”這個字節就是TTL(Time To Live)了,表示一個IP數據流的生命周期,用Ping顯示的結果,能得到TTL的值,很多文章就說通過TTL位來判別主機類型。因為一般主機都有默認的TTL值,不同系統的默認值不一樣。比如WINDOWS為128。不過,一般Ping得到的都不是默認值,這是因為每次IP數據包經過一個路由器的時候TTL就減一,當減到0時,這個數據包就消亡了。這也時Tracert的原理。本例中為“40”,轉換為十進制就是64了,我用的WinXP。 

  (8) “06”,這個字節表示傳輸層的協議類型(Protocol)。在RFC790中有定義,6表示傳輸層是TCP協議。 

  (9) “7d 60”這個16bit是頭校驗和(Header Checksum)。 

  (10) “c0 a8 02 0a”,這個是源地址,也就是PC的IP地址,轉換為十進制的IP地址就是:192.168.2.10。

  (11) “c0 a8 02 01”,這個是目標地址,也就是DIY_DE2的地址,轉換為十進制的IP地址就是:192.168.2.1。

4、TCP包頭

  TCP包頭占有20個字節,即:

  18 98 00 17 37 8d 49 3b 00 46 74 e0 50 18 fe d9 ea f7 00 00

  (1) “18 98”,表示本地端口號,轉換為十進制就是3368。

  (2) “00 15”,表示目標端口號,轉換為十進制就是23,因為我是連接TELNET站點,所以,這個就是23。

  (3) “37 8d 49 3b”,是順序號(Sequence Number),簡寫為SEQ。

  (4) “00 46 74 e0”,是確認號(Acknowledgment Number),簡寫為ACKNUM。

  (5) “50 18”,轉換為二進制,“0101 0000 0001 1000”。這兩個字節,總共16bit,有好多東西。第一個4bit“0101”,是TCP頭長,十進制為5,表示20個字節。接着的6bit現在TCP協議沒有用上,都為0。最后的6bit“01 1000”是六個重要的標志。這是兩個計算機數據交流的信息標志。接收和發送斷根據這些標志來確定信息流的種類。下面是一些介紹: 

  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=0,ACK=1,當然就是表示連接請求了。在分析TCP包頭時候,要注意這兩位的變換。 

  (6) “fe d9”,窗口值,用來控制實現流量控制。

  (7) “ea f7”,檢驗和,TCP的檢驗和是強制的。

  (8) “00 00”,緊急指針。


免責聲明!

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



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