一、摘要
對之前幾篇博文涉及到的網絡通信協議進行分析,概述出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”,緊急指針。