以太網/ IPV4/IPV6包頭,TCP包頭格式回顧


問題:以太網數據包,承載的數據內容大小46~1500字節,是如何來的?

以太網數據包結構

 

 

 

 

 以太網協議規定最小鏈路層數據包(幀)為64字節,其中以太網首部+尾部共計18字節(源/目的MAC12字節;上層協議號2字節;CRC尾部4字節)

  • 最小包的限制決定了以太網數據幀內數據,最小為46字節=64-18
  • 最大1500的由來 請參考知乎:https://www.zhihu.com/question/21524257/answer/118266374

 

IPV4數據包結構(20字節):

1-1 版本4位:表示版本號,目前最廣泛的是IPv4=B0100,相信IPv6=B0110

1-2 頭長4位:數據包頭部長度。它表示數據包頭部包括多少個32位長整型,也就是多少個4字節的數據。無選項則為5(紅色部分)。

1-3 服務類型:包括8個二進制位,每個位的意義如下:

       過程字段:3位,設置了數據包的重要性,取值越大數據越重要,取值范圍為:0(正常)~ 7(網絡控制)

       延遲字段:1位,取值:0(正常)、1(期特低的延遲)

       流量字段:1位,取值:0(正常)、1(期特高的流量)

       可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)

       成本字段:1位,取值:0(正常)、1(期特最小成本)

       保留字段:1位 ,未使用

1-4 總長度16位:當前IP數據包的總長度,單位是字節。當然最大只能是65535,即63KB。

2-1 重組標識16位:發送者發送的包的順序,依序遞增1,如果客戶端收到的包亂序了。依據這個排序,例如下圖

 

2-2 標志3位:

  第一位:保留字段

  第二位:取值:0(允許數據報分段)、1(數據報不能分段)

  第三位:后面是否有更多分片,取值:0(數據包后面沒有包,該包為最后的包)、1(數據包后面有更多的包)

2-3 段偏移量13位:與更多段位組合,幫助接收方組合分段的報文,以字節為單位。

【示例wireshark抓包 標准位+偏移量共計 16位】

3-1 生存時間8位:經常ping命令看到的TTL(Time To Live)就是這個,每經過一個路由器,該值就減一,到零丟棄。

3-2 協議代碼8位:表明使用該包裹的上層協議,如TCP=6,ICMP=1,UDP=17等。

【示例TCP】

3-3 IP頭檢驗和16位:是IPv4數據包頭部的校驗和。

IP首部檢驗和字段(16位,2字節),只計算IP頭部的的所有字段的校驗和,它不對首部后面的數據進行計算。 

發送方:計算一份數據報的IP頭部檢驗和,則需要首先把此檢驗和字段置為0。然后對首部中每個16 bit(2字節)進行二進制反碼求和(整個首部看成是由一串16 bit的字組成),然后結果存在此檢驗和字段中。

接受方:當收到一份IP數據報后,對首部中每個16 bit(2字節)進行二進制反碼的求和。由於接收方在計算過程中包含了發送方存在首部中的檢驗和,因此,如果首部在傳輸過程中沒有發生任何差錯,那么接收方計算的結果應該為全1。如果結果不是全1(即檢驗和錯誤),那么IP就丟棄收到的數據報。但是不生成差錯報文,由上層去發現丟失的數據報並進行重傳。

4-1 源始地址:32位=4字節,我們常看到的IP是將每個字節用點(.)分開,如此而已。

 

 

 5-1 目的地址:32位,同上。

6-1 可選選項:主要是給一些特殊的情況使用,往往安全路由會當作攻擊而過濾掉,普聯(TP_LINK)的TL-ER5110路由就能這么做。

7-1.用戶數據。

 

IPV6數據包結構(40字節)

1-1 版本(Version):版本字段用來表示IP協議的版本,該字段長度為4比特位,對應值為6(0110)。


1-2 流量分類(Traffic Class):流量分類字段用來標識對應IPv6的流量類別,該字段長度為8比特位,類似於IPv4中的ToS(服務類型)字段。


1-3 流標簽(Flow Label):流標簽字段時IPv6數據報中新增的一個字段,該字段長度為20比特位,可用來標記報文的數據流類型,以便在網絡層區分不同的報文。


2-1 有效載荷長度(PayLoad Length):有效載荷長度字段是以字節為單位的標識IPv6數據報中有效載荷部分(包括所有擴展報頭部分)的總長度,也就是除了IPv6的基本報頭以外的其他部分的總長度,該字段長度為16比特位。


2-2 下一個頭部(Next Header) :下一個頭部字段用來標識當前報頭的下一個頭部類型,該字段長度為8比特位。每種擴展報頭都有其對應的值。下一個頭部字段內定義的擴展報頭類型與IPv4中的協議字段值類似,但在IPv6數據報中,緊接着IPv6報頭的可能是上層協議頭部(當沒有擴展報頭或者為最后一個擴展報頭時才是上層協議頭),也可能是IPv6擴展報頭。


2-3 跳數限制(Hop Limit):跳數限制於IPv4報文中的TTL字段類似,指定了報文可以有效轉發的次數,該字段長度為8比特位。報文每經過一個路由器結點,跳數值就減1,當此字段值減到0時,則直接丟棄該報文。


3+4+5 源地址(Source IP Address):源IP地址字段標識了發送該IPv6報文發送者的IPv6地址,占128位。
6+7+8 目的IP地址(Destination IP Address):目的IP地址字段標識了IPv6報文的接收者的IPv6地址,占128位。


9-N IPv6擴展報頭:Pv6擴展報頭是跟在IPv6基本報頭后面的可選報頭。可以有0個,或者多個擴展報頭。數據包僅僅需要傳送各自數據包所需要的信息,不需要傳送用不到的字段。所以可以通過定義新的擴展報頭添加到IPv6數據包中來增加新的可選功能。

主要的IPv6擴展報頭有一下幾類:

逐跳選項頭(Hop-by-hop Options Header):傳送必須被轉發路徑中的每一個節點都檢驗處理的信息。例如,路由器告警和超大包有效載荷選項等。
目的選項頭(Destination Options Header):承載特別針對數據包目的地地址的可選信息
路由頭(Routing Header):本擴展報頭類型值為43,通過列出在到達目的地的路徑中數據包所要經過的節點列表來提供源路由選擇的功能。
分段頭(Fragment Header):本擴展報頭類型值為44,用於標識數據報的分段,在IPv4中就有對應的字段。當源節點發送的報文超過傳輸鏈路MTU(源節點和目的節點之間傳輸路徑的MTU)時,需要對報文進行分段時使用。
認證頭(Authentication Header,AH):本擴展報頭類型值為51,該包頭由 IPSec 使用用,以提供認證、數據完整性和防重放保護。它還確保基本IPv6 包頭中一些字段的保護。該包頭在 IPv4 和 IPv6 中是相同的. 通常稱之為 IPSec認證包頭 (AH)用於IPSec,提供報文驗證,完整性檢查。
封裝安全有效載荷頭(Encapsulating Security Payload,ESP):本擴展頭類型值為50,用於IPSec,提供報文驗證、完整性檢查差和加密。

========================================================

TCP數據包結構(20字節)

1-1 源始端口16位:現在知道為啥TCP端口范圍是 0-65535了吧

1-2 目的端口:同上。

2-1 數據序號32位:TCP為發送的每個字節都編一個號碼,這里存儲當前數據包數據第一個字節的序號。

3-1 確認序號32位:為了安全,TCP告訴接受者希望他下次接到數據包的第一個字節的序號也同時代表自己確認接收到了這個序號-1字節的數據了。

4-1 首部長度4位:類似IP--->表明數據距包頭有多少個32位(有幾個四個字節)。20個字節,則為5

4-2 保留6位:未使用,應置零。

4-3 緊急比特URG:當URG=1時,表明緊急指針字段有效。它告訴系統此報文段中有緊急數據,應盡快傳送(相當於高優先級的數據)。

4-4 確認比特ACK:只有當ACK=1時確認號字段才有效。當ACK=0時,確認號無效。參考TCP三次握手

4-5 PSH:表示要求對方在接到數據后立即請求遞交給應用程序,而不是緩沖起來直到緩沖區收滿為止。一般為1.

4-6 復位比特RST(Reset) :當RST=1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然后再重新建立運輸連接。參考TCP三次握手

4-7 同步比特SYN:同步比特SYN置為1,就表示這是一個連接請求或連接接受報文。參考TCP三次握手

4-8 終止比特FIN(FINal):用來釋放一個連接。當FIN=1時,表明此報文段的發送端的數據已發送完畢,並要求釋放運輸連接。

4-9 窗口字段16位:窗口字段用來控制對方發送的數據量,單位為字節。TCP連接的一端根據設置的緩存空間大小確定自己的接收窗口大小,然后通知對方以確定對方的發送窗口的上限。

5-1.包校驗和16位,包括首部和數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的偽首部。校驗范圍包括TCP頭、數據報內容和概念性偽頭部。

概念性偽頭部又包括源IP,目的IP,TCP協議號。

 

 

5-2.緊急指針16位,緊急指針指出在本報文段中的緊急數據的最后一個字節的序號:指向數據報中緊急數據最后一個字節的下一個字節。

6-1.可選選項0~160位,類似IP,是可選選項。

6-2.填充N位,使選項湊足32位(TCP頭長度必須是33位(4字節)的倍數,頭固定長度為20字節,首部長度字段代表多少個4字節,當無可選項時首部長度字段置為5代表=5*4字節=20)。

7-1.用戶數據……

 

TCP包頭可選項詳解:

原文鏈接:https://blog.csdn.net/xiaoting451292510/article/details/102756146

可選項字段的格式

 

 每個選項的開始是1字節的kind字段,說明選項的類型。一個TCP包可以包含多個可選項。

 

 

 

TCP頭部選項功能

TCP頭部的選項部分是TCP為了適應復雜的網絡環境和更好的服務應用層而進行設計 的。TCP選項部分最長可以達到40byte ,再加上TCP選項外的固定的20byte字節部分, TCP的最長頭部可達60byteo TCP頭部長度可以通過TCP頭部中的"數據偏移"位來查看。(值得注意的是TCP偏移量的單位是32位,也就是4byteo而TCP偏移量共占4bit位, 取最大的1111計算也就是十進制的15。15*4byte=60byte #這個也是TCP的首部不超 過60byte的原因。)

大多數的TCP選項部分出現在TCP連接建立階段,也就是TCP的三次握手數據包中。 當然有些選項也會出現在已經建立連接的session中,不過此種情況較少出現。

TCP選項部分占有的位數必須是8bit的倍數,這也就是說,即使出現我們應用的選項 部分為4bit M旦也必須使用4bit的墊片。這樣才符合RFC的要求

TCP選項部分實際運用的有以下幾種:

  1. 最大報文傳輸段(Maximum Segment Size —MSS )
  2. 窗口擴大選項(window scaling )
  3. 選擇確認選項(Selective Acknowledgements —SACK )
  4. 時間戳選項(timestamps )
  5. NOP

最大報文傳輸段(Maximum Segment Size —MSS )

MSS是TCP選項中最經常出現,也是最早岀現的選項。MSS選項占4byte。MSS是每一個TCP報文段中數據字段的最大長度,注意:只是數據部分的字段,不包括TCP的頭 部。TCP在三次握手中,每一方都會通告其期望收到的MSS ( MSS只出現在SYN數據包中)如果一方不接受另一方的MSS值則定位默認值536byte

MSS值太小或太大都是不合適。太小例如MSS值只有lbyte那么為了傳輸這lbyte 數據,至少要消耗20字節IP頭部+20字節TCP頭部二40byte ,這還不包括其二層頭部所 需要的開銷,顯然這種數據傳輸效率是很低的。MSS過大,導致數據包可以封裝很大,那 么在IP傳輸中分片的可能性就會增大,接受方在處理分片包所消耗的資源和處理時間都會 增大,如果分片在傳輸中還發生了重傳,那么其網絡開銷也會增大。因此合理的MSS是至 關重要的。MSS的合理值應為保證數據包不分片的最大值。對於以太網MSS可以達到 1460byte.

與MSS相似的在IP層也有f 類似的概念…MTU ( Maximum Transfer Unit )下 圖可以清晰翻譯MSS與MTU的關系:

   MTU = IP頭 + TCP頭 + MSS

窗口擴大選項(window scaling )

我們知道TCP最大的窗口大小為64Kb ,在早期網絡這是夠用的,但隨着各種復雜 網絡的產生,特別是類似衛星通信這種時延和帶寬都也交大的通信而產生,需要更大窗口來滿足性能和高吞吐率”於是窗口擴大選項便產生了。

我們用下圖一些圖來說明為什么需要這個選項,和其主要功能:

我們假設Host A—B是一條高速的WAN鏈路。通信距離較遠,延時也由於距離的原因變大。A向B發送大量數據,由於有足夠帶寬,那么A在很短時間內就可以發送完64Kb 的數據,而由於窗口過小,A只能停止發送,直到B對A發送的數據進行ACK確認。上面我們可以推算,在time 2-3和后面的time 5-6之間A-B是沒有實際數據發送的。而大量的時間被浪費在了等待對方回應上。

如果我們改進我們的窗口大小,使之變的更大,如下圖:

現在我們把窗口擴大到256kb ,我們看到,由於窗口足夠大,A可以發送大量的數據 報,在其還在忙着發送報文的時間內,對A數據的ACK就已經可以返回了。(黃色的部分可以想象成一個個數據包,大量的數據包排長隊在網絡中傳輸L這樣,A-B的通信就避免 了消耗大量的等待時間。對TCP的性能改善是巨大的。

Windows scaling占3個byte ,其中的f 字節表示移位值So新的窗口值等於TCP 首部的窗口位數從16增大到(16+S L這相當於把窗口值向左移動S位后獲得實際的窗口 大小。移位值准許使用的最大值是14相當於窗口最大值增大到65535*2^14也就是1GB。

窗口擴大選項在TCP建立之初進行協商,如果已經實現了窗口擴大,當不再需要其擴大窗口時,發送S=0選項就可以恢復到窗口大小16。

選擇確認選項(Selective Acknowledgements —SACK )


我們假設TCP傳輸中有這種情況岀現:收到的報文無差錯,只是未按序列號,中間還缺 少一些序列號,那么能能否只傳輸缺少的數據,而不重傳已經正確到達的數據?這就是選擇確認的技術。用下列例子來說明一下:

要傳輸的數據共5個,分別編號為1,234,5。A-B Host。B作為接受者,發現數據接 收是這樣的1 3 5。而中間的2和4沒有到達其他都是正確的數據報。那么如果選用SACK , A將只會重傳2和4,而不是所有的報文都重傳。

SACK選項在TCP建立連接時由SYN數據包中加上〃允許SACK"的置為1來實現。SACK 對原來TCP首部的確認號字段不會產生影響,只是在發生不連續傳輸中才會使用。

我們知道TCP的數據報文是有字塊邊界的”例如上面例子,怎么形容丟失的數據包2 呢,我們會以之間的數據包說明,也就是說丟失的數據是有左右邊界的。而此邊界在 傳輸中是用TCP序列號來表示的。由於TCP首部選項部分最多只有40字節,而指明一個 邊界要用掉4字節(因為TCP序列號是32位,也就是4字節),因此在選項中最多只能指 明4個字節塊的邊界信息。這是因為4個字塊要有8個邊界(前后邊界\另外還需要2 個功能字節,一個字節用來指明使用SACK選項,另一字節指明這個選項要占多少字節。4* ( 4*2 ) +2=34byte。所以最多只能指出4個字節塊邊界信息。

 

 

 

一般來說,計算機都是默認支持選擇確認的。上面這張圖是剛才通過wireshark工具抓取到的接收方給發送方發送的一個tcp確認包,在這個tcp選擇確認(SACK)包中,在圖1的tcp選項的SACK選項是選擇確認(SACK)能保障可靠傳輸最為重要的依據。所以,這里我們重點關注tcp選項部分,在tcp首部中可以看到確認號為:2336611189,首部長度是32字節,Window size valaue字段是接收方的接收窗口,同於通知發送方將發送窗口大小設置為65520字節

從該tcp數據包的tcp選項來看這是一個選擇確認(SACK)包,也就是說這個確認包只有tcp首部,沒有數據部分,Kind:SACK(5)用來表示這是選擇確認(SACK),該字段占用一個字節。Length表示tcp選項長度,占用一個字節,左邊界和右邊界各占用4字節,也就是說這里總共用掉了10字節。

其中left edge表示接收方接收到的數據塊中的左邊界位置(起始字節),

right edge可以理解為接收方接收到的數據塊中的結束位置(右邊界),

那么我們可以根據捕獲的數據報中的確認號丟失的數據塊中的起始字節,也就是要重傳的起始字節,再結合接收窗口,左邊界和右邊界。我們可以推出接收窗口中的已經接收到的數據塊,和未接收到的數據塊,如下圖所示:

 

 

 從上圖中我們可以清晰的看到滑動窗口中的數據分布如上圖所示,其中未接收到的字節數據塊表示需要重傳的數據,那么發送方在進行選擇性重傳時,會從2336611189字節的位置開始重傳注意:對於已經接收到的字節數據塊(2336631881 - 2336693150)是不會被重傳的。

如上圖所示,現有10個分組數據,第1個分組為1-100,第2個分組為101-200,其他以此類推… 假設發送方發送了這10個分組,然后接收方接收到數據后給發送方發送了一個選擇確認(SACK)數據報,其中tcp首部中給出確認號為201,同時tcp選項中攜帶了8個左/右邊界。

  發送方接收到選擇確認數據包后,會根據數據包中的tcp首部中的確認號201,從201字節位置開始重傳,再根據tcp首部的tcp選項中的選擇確認(SACK)選項指明的已經收到的數據塊的8個邊界,進行選擇性重傳(201-300),(401-500),(601-700),(801-900)分組(對於已經收到的數據塊(301-400),(501-600),(701-800),(901-1000)是不會重傳的,因為選擇確認(SACK)選項中給出的邊界是指明已經接收到的數據塊和未接收到的數據塊。換句話說,邊界就是接收方用來告訴發送方:“哪些數據已經收到,哪些數據沒收到”。然后發送方再選擇對未收到的數據進行重傳)。

時間戳選項(timestamps )

時間戳選項占10個字節,其中最主要的字段時間戳字段(4字節)和時間戳回送回答字段(4字節)

時間戳選項主要的功能有兩個:

  • 1 .用來計算往返時間RTT(Round-Trip Time往返時延)。發送方在發送報文段時把當前時鍾的時間值放入時間戳字段,接收方在確認該報文段時把時間戳字段值復制到時間戳回送回答字段。因此,發送方在 收到確認報文后,可以准確計算出RTT。時間戳是一個單調增長的值,接收方只需要回 顯收到的內容,因此是不需要關注時間戳的單元是什么,也不需要連接雙發的時鍾同步。

  • 2 . PAWS:防止回繞的序號。我們知道序列號只有32位,而每增加2^32個序列號后就會重復使用原來用過的序列號。假設我們有F高速網絡,通信的主機雙方有足夠大的帶 寬用來快速的傳輸數據。例如lGb/s的速率發送報文段,則不到35秒鍾數據字節的序 列號就會重復。這樣對TCP傳輸帶來混亂的情況。這種情況之出現在高速鏈路上。而采 用時間戳選項”可以很容易的分辨出相同序列號的數據報,哪個是最近發送,哪個是以前發送的。

NOP

NOP ( no operation ),從字面意思也看出來了,這個字段實際上是沒有但可意義的字 段。設計該字段主要是用來提供填充墊片。TCP的頭部必須是4byte的倍數,但是大多數 的TCP選項不是4byte的倍數。假如出現了整個TCP選項部分不是4byte的倍數,那么就 需要使用1或多個字節無意義的nop來填充,使之符合TCP的頭部構造的規定。例如,選 項部分只有6byte , 2個字節的nop就會用來做墊片。

  • NOP也會做為分割不同的選項數據,例如我們的TCP會話中同時使用了窗口擴大選項和 SACK那么TCP頭部中的SACK的表示部分與窗口擴大選項中的參數之間使用nop隔離。 明確不同的選項之間的分割點,因此在一個數據包中出現多個nop是不奇怪的。

總結
TCP協議是一個設計可靠的,優越的協議,通過TCP的選項部分也可以看到其設計之 精妙。TCP的選項部分做為TCP頭部的補充滿足了對復雜網絡和苛刻傳輸條件的要求。TCP 選項在給網絡帶來性能提升和高可靠的同時”也會被黑客所利用。

例如,每個操作系統都有自己獨特的處理TCP選項部分的特點和排序規則。利用這種 系統的特殊性結合其他手段可以很容易的識別出是明哪種操作系統對了解和分析主機漏洞提 供了更多的參數。

 

 

 

UDP數據包結構(8字節)

 

 

======================THE    END==================================

 


免責聲明!

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



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