天天看點

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

1. 概述

TCP/IP應該是程式員的基本功,但是之前對這個印象總是模模糊糊,花了一些時間對相關的東西進行了整理。本文介紹網絡傳輸中的基本元素,主要包括如下内容

  • 幀的分類、結構及字段意義
  • 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義
  • 序列号和确認号
  • TCP的視窗機制和可用視窗大小協商機制

2. 幀

網絡上,單次傳輸的資料量是有限。在傳輸資料時,會将大資料分割若幹個資料包進行傳輸。這個資料包稱作以太幀(Frame),幀也稱為協定資料單元(PDU)。不同的協定使用不同的幀格式和MTU值(Maxitum Transmission Unit 最大傳輸單元),幀主要有兩大類:

  • IEEE 802.3 以太網标準:又分為3種類型
    • Novell raw IEEE 802.3
    • IEEE 802.2 LLC
    • IEEE 802.2 SNAP
  • Ethernet II 幀,又稱為DIX幀,是最常見的幀類型,是TCP/IP網絡中使用的以太網幀格式

EEE 802.3幀和Ethernet II 幀是互相相容,它們的格式也很像,如下圖:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

以太網幀的大小範圍(即MTU)應該是[64=46+18, 1522=1500+22],其實最開始EthernetII和802.3規定最大幀為1518,後來為支援vlan,1998年802.3ac規定最大幀為1518+4(vlan)=1522

備注:如果幀長小于64位元組,則要求“填充”,以使這個幀的長度達到64位元組

2.1. IEEE 802.3格式

上節圖中第一行:顯示IEEE 802.3 格式,各個字段意義如下:

  • 一個幀以7個位元組(Preamble)的前導碼和1個位元組(Start of frame delimiter)的幀開始符作為幀的開始。
  • 報頭包含源位址(MAC source)和目标位址的MAC位址(MAC destination),以Payload部分的長度(length (IEEE 802.3))和可選的用于說明VLAN成員關系和傳輸優先級的IEEE 802.1Q VLAN 标簽(802.1Q tag (optional))。
  • 幀校驗碼(Frame check sequence )是一個32位循環備援校驗碼,以便驗證幀資料是否被損壞。
  • 幀間距(Interpacket gap):當一個幀發送出去之後,發送方在下次發送幀之前,需要再發送至少12個octet的空閑線路狀态碼。
  • 負載(Payload):幀的負載

2.2. Ethernet II 幀格式

Ethernet II 幀是事實的标準,它和IEEE 802.3 幀除了以下部分外,其他基本都相同:

1. 前序部分,802.3拆分為Preamble(7 octets)和SFD(Start of frame delimiter, 1 octet);Ethernet II隻有Preamble(8 octets)。

2. 對802.3來說,類型或長度部分(Ethertype (Ethernet II) or length (IEEE 802.3)),表示的是長度,其值小于等于1500;對Ethernet II來說,表示的是類型,其值大于1536,通過值大小即可區分兩種幀。另外1500 and 1536之間的數字未定義。

“802.1Q tag (optional)”是可選部分,去除這個字段後,常用的Ethernet II 幀格式如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

3. 包的概述

通過wireshark抓包,選取一個包

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

它主要包括5部分内容:

- 第一行實體層資料,實體層資料幀,這層資料機關為比特(bit)

- 第二行資料鍊路層資料,以太網幀頭部資訊,這層資料機關為幀(frame)

- 第三行網絡層資料,IP頭資訊,這層資料機關為資料包(packet)

- 第四行傳輸層資料,TCP頭資訊,這層資料機關可以叫資料包(packet),為了區分如果是TCP的資料單元稱為段 (segments)而UDP協定的資料單元稱為資料報(datagrams)

- 第五行應用層資料,負載的資料,不是必須

下面會詳細介紹前四層的詳細結構和字段說明

4. 實體層資料幀概況

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

以上内容不是直接從網絡中傳送過來的,而是在解析幀時産生的。是以這些内容不計算在幀的長度中。

5. 資料鍊路層以太網幀頭部資訊

太網幀頭部的格式如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

在wireshark中詳細的資訊如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

6. IP資料報格式

IP資料報格式如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

各個字段的意義如下:

  • 目前的協定版本号是4,是以I P有時也稱作I P v 4。
  • 首部長度指的是首部占 32 bit字的數目,包括任何選項。由于它是一個 4比特字段,是以首部最長為6 0個位元組
  • 服務類型(TOS):現在大多數的T C P / I P實作都不支援TO S特性
  • 總長度字段是指整個 I P資料報的長度,以位元組為機關。利用首部長度字段和總長度字段,就可以知道 I P資料報中資料内容的起始位置和長度。由于該字段長 1 6比特,是以 I P資料報最長可達 6 5 5 3 5位元組
  • 辨別字段唯一地辨別主機發送的每一份資料報。通常每發送一份封包它的值就會加 1
  • 标志字段和片偏移字段:在分片時使用,當發送的IP資料報的大小超過了MTU時,IP層就需要對資料進行分片,否則資料将無法發送成功。IP分片發生在IP層,不僅源端主機會進行分片,中間的路由器也有可能分片,因為不同的網絡的MTU是不一樣的,如果傳輸路徑上的某個網絡的MTU比源端網絡的MTU要小,路由器就可能對IP資料報再次進行分片。而分片資料的重組隻會發生在目的端的IP層。
  • 生存時間字段設定了資料報可以經過的最多路由器數。它指定了資料報的生存時間。T T L的初始值由源主機設定,一旦經過一個處理它的路由器,它的值就減去 1。當該字段的值為 0時,資料報就被丢棄,并發送 I C M P封包通知源主機
  • 協定字段: TCP/UDP
  • 首部檢驗和字段是根據I P首部計算的檢驗和碼。它不對首部後面的資料進行計算
  • 源 I P位址
  • 目的 I P位址
  • 任選項,是資料報中的一個可變長的可選資訊

備注:T C P首部如果不計任選字段,它通常是 2 0個位元組。

在wireshark中詳細的資訊如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

7. TCP資料報格式

TCP資料報格式:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

各個字段的意義如下:

  • 源端和目的端的端口号,用于尋找發端和收端應用程序。這兩個值加上I P首部中的源端I P位址和目的端I P位址唯一确定一個T C P連接配接
  • 序号用來辨別從T C P發端向T C P收端發送的資料位元組流,它表示在這個封包段中的的第一個資料位元組。如果将位元組流看作在兩個應用程式間的單向流動,則 T C P用序号對每個位元組進行計數。
    • 序号(Sequence Number):用來辨別從TCP發端向TCP收端發送的資料位元組流,它表示在這個封包段中的的第一個資料位元組在資料流中的序号;主要用來解決網絡報亂序的問題;
    • 确認序号(Acknowledgment Number):32位确認序列号包含發送确認的一端所期望收到的下一個序号,是以,确認序号應當是上次已成功收到資料位元組序号加1。主要用來解決丢包的問題
  • 首部長度 需要這個值是因為任選字段的長度是可變的。這個字段占4 bit,是以T C P最多有6 0位元組的首部。然而,沒有任選字段,正常的長度是 2 0位元組
  • 在TCP首部中有6個标志比特。它們中的多個可同時被設定為 1
    • URG 緊急指針,用來保證TCP連接配接不被中斷,并且督促中間層裝置要盡快處理這些資料
    • ACK 确認序号有效
    • PSH 接收方應該盡快将這個封包段交給應用層。這個标志位表示Push操作。所謂Push操作就是指在資料包到達接收端以後,立即傳送給應用程式,而不是在緩沖區中排隊
    • RST 表示連接配接複位請求。用來複位那些産生錯誤的連接配接,也被用來拒絕錯誤和非法的資料包
    • SYN 同步序号用來發起一個連接配接。
    • FIN 發端完成發送任務。表示發送端已經達到資料末尾,沒有資料可以傳送了
  • 視窗大小:T C P的流量控制由連接配接的每一端通過聲明的視窗大小來提供。視窗大小為位元組數,起始于确認序号字段指明的值,這個值是接收端正期望接收的位元組。視窗大小是一個 16 bit字段,因而視窗大小最大為 6 5 5 3 5位元組。
  • 校驗和:檢驗和覆寫了整個的T C P封包段:T C P首部和T C P資料。這是一個強制性的字段,一定是由發端計算和存儲,并由收端進行驗證。
  • 緊急指針:隻有當U R G标志置1時緊急指針才有效。緊急指針是一個正的偏移量,和序号字段中的值相加表示緊急資料最後一個位元組的序号。 T C P的緊急方式是發送端向另一端發送緊急資料的一種方式。

備注:TCP頭的資訊長度為20位元組

在wireshark中詳細的資訊如下:

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

8. 長度計算

在上文中出現了N個長度,全部羅列如下:

  • 幀長度,即整個包的總長度 = 2220位元組
  • 實體層資料幀概述資訊長度:此部分的資料不是從網絡上傳輸的資料,而是接收到資訊時産生的記錄,是以不計算到幀的長度,即0位元組
  • 資料鍊路層以太網幀頭部資訊長度 = 14位元組,固定值
  • IP頭長度 = 20位元組
  • TCP頭升序 = 20 位元組
  • TCP負載的資料 = 2160 位元組

我們整理一下它們的關系

幀長度(2220位元組) = 實體層資料幀概述資訊長度(0位元組) + 資料鍊路層以太網幀頭部資訊長度(14位元組) + IP頭長度( 20位元組) + TCP頭長度 (20 位元組) + TCP負載的資料 (2166 位元組)

9. 序号增加規則和相對序号

TCP會話的每一端都包含一個32位(bit)的序列号,序列号為目前端成功發送的資料位數,确認号為目前端成功接收的資料位數。備注,如果收到的包有SYN标志位和FIN标志位,确認号也需要加1。

每個TCP會話中,初始序列号是随機的,可能是任何值,如0xf61c6cbe。但是在wireshark中,為了友善,使用相對序列号/确認号,而不是實際序列号/确認号。顯示的相對值=(實際的序列号 - 會話初始的序列号)

10. TCP的視窗機制和可用視窗大小協商機制

TCP通過序列号及确認号機制讓資料可靠的傳送。如果每次發送一個資料都需要确認,則傳輸效率會很低。為此引入了滑動視窗機制。滑動視窗充分利用雙方的帶寬及緩沖區,發送方不必等待對方的确認,可以連續發送多個資料包給對方,而對方可以暫時把這些資料存放在緩沖區,并給對方一個确認。這樣,可以大大增加資料傳輸的速度。為了避免接收方的緩沖區填滿導緻資料丢失的情況,引入了TCP視窗的可用視窗大小協商機制。通信雙方通過TCP包中了字段Windows scale和windows size value來告知對方目前可用緩沖值。

10.1 下面通過抓包檢視TCP會話是如何協商可用視窗大小

在預設的TCP協定裡,封包隻能用16位視窗,即最大值為65535。但是随着帶寬已經大規模提升,千兆不很常見,65535長度視窗已經不夠用,為了突破這個限制,便有了Window Size Scaling選項,使得真正的可用視窗大小為 2Window Size Scaling * windows size value 。

以三次握手協定說明視窗協商的過程

在雙方第一次握手的協定包裡

包中重要的屬性如下:

windows size value : 8192

calculated window size : 8192 (因為雙方還沒有協商完畢,還不知道對方是否支援Windows scale,是以本次的可用視窗值等于calculated window size)

Windows scale: 2 (multiply by 4)

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

第二次握手

包中重要的屬性如下:

windows size value : 14600

calculated window size : 14600 (因為雙方還沒有協商完畢,還不知道對方是否支援Windows scale,是以本次的可用視窗值等于calculated window size)

Windows scale: 7(multiply by 128):同時也表示自己支援這個屬性

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

第三次的握手

包中重要的屬性如下:

windowss size value : 16652

Calculated window size : 66608

因為雙方都支援Window Size Scaling選項,是以啟用這個功能,Calculated window size 變大。

Calculated window size = windowss size value * Windows size scaling factor

Windows size scaling factor : 4 = 2Window Size Scaling

即: 66608 = 16652 * 4 = 16652 * 2 2

是以告訴對方,我的可用視窗大小為66608

如果有一方不支援這個屬性,則Windows size scaling factor不可用,視窗的大小隻能是windowss size value值

網絡系列一 結合wireshark學習TCP/IP協定中幀,IP包,TCP包的包結構及字段意義

繼續閱讀