日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

协议簇:IPv4 解析

發布時間:2024/7/23 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 协议簇:IPv4 解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

IP 是一種無連接的協議. 操作在使用分組交換的鏈路層(如以太網)上。此協議會盡最大努力交付數據包。

盡最大努力意味著:
IP 協議不保證數據的可靠傳輸, 沒有流量控制機制, 不保證傳輸序列(意味著 IP 數據包會在傳輸過程中亂序), 沒有接受確認 (ACK) 機制, 也沒有重傳機制.

主要功能

IP 協議提供了兩個基本的功能 尋址(Address) 和 分片(Fragmentation).

這里我們先簡單看一下概念,后面會詳細分析具體是如何實現的.

尋址(Address)

IP 協議定義了 32 bit 的 IP 地址. IP 協議的實現模塊會根據 IP 數據包頭部中的目的地址發送/轉發數據包到目的地址.

  • 數據包在由源地址到目的地址的過程中,可能會經過多個中間節點, 這些節點需要使用適當的路由協議轉發數據包。也可能丟棄數據包。
  • IP 協議實現模塊認為每個 IP 數據包都是獨立的,任意兩個 IP 數據包之間沒有任何聯系.
  • IP 協議還提供了以下機制來配置 IP 協議提供的服務:

  • Type of Service: 用來保證 IP 協議服務的的質量.
  • Time to Live: 指定一個 IP 數據包的生命周期的上限. 這個值由發送發設置,該數據包沒經過一個中間節點,該數據包中的 Time to Live 值便減少1,當這個值變為零并且還未到達目的地址,該數據包會在該中間節點被丟棄.
  • Options: 一些控制位,在某些情況下會被使用.
  • Header Checksum: 用來檢測數據包在傳輸過程中是否發生了錯誤. 如果在某個節點發現數據出錯,數據會在該節點被丟棄.
  • 分片(Fragmentation)

    由于不同的物理鏈路對于數據的最大長度有著不同的限制,因此 IP 數據在傳輸過程中可能會被拆分為多個較小的數據包進行傳輸.

    發送方可以將數據包設置為 ”don‘t fragment", 這種數據包會被丟棄當數據包的大小大于當前物理鏈路的最大數據包限制.

    IPv4 Header 格式


    接下來,我們逐一介紹一下每個字段的含義:

  • Version: 4 bit. 表明當前 IP 協議的版本.
  • IHL: 是 Internet Hander Length 的縮寫,長度為 4 bit. 它的值是一個整數,指向 IP 數據包中所承載的實際數據的開始字節. 單位為 4 字節.
  • Type of Service: 8 bit. 表明當前數據包所期待的服務類型。 8 個 bit 的含義分別如下:
    • bits 0-2: 表明數據包的優先級
    • bit 3: 0 代表 Normal-Delay, 1 代表 Low-Delay
    • bit 4: 0 代表 Normal-Throughput,1 代表 High-Throughput
    • bit 5: 0 代表 Normal-Reliable, 1 代表 High-Reliable
    • bits 6-7: 保留
      這個字段很少使用,這里僅供參考.
  • Total Length: 16 bit. 表明當前數據包的總長度, 包括 IP 頭和數據. 單位是字節. 最大長度為 65535 字節,
  • Identification: 16 bit. 一個由發送者設置的 id 值,用來幫助將分片后的數據包整合為一個數據包. 后邊詳細介紹
  • Flags: 3 bit. 每個 bit 的含義如下:
    • bit 0: 保留
    • bit 1: (DF) 0 代表 May Fragment, 1 代表 Don’t Fragment
    • bit 2: (MF) 0 代表 Last Fragment, 1 代表 More Fragments
  • Fragment Offset: 13 bit. 表明當前分片在所有分片中的位置. 單位為 8 字節.第一個分片該字段的值為 0.
  • Time to Live: 8 bit.
  • Protocol: 8 bit. 表明當前 IP 數據包中所承載的數據的協議. 也就是位于 IP 協議之上的協議.
  • Header Checksum: 16 bit. 在數據包傳輸過程中,該值會隨著 IP頭部的值的改變而改變. 比如: Time to Live 變化,或者 IP 包被分片,這種情況下,都需要重新計算 checksum.
  • Source Address, Destination Address: 各占 32 bit.
  • Options: 可變長度字段. 由于 Options 比較復雜,下面詳細描述
  • Padding: 可變長字段. 用來將 IP 數據包長度填充為 32 bit 的整數倍. 填沖的 bit 位的值均為 0.
  • Options

    該字段在 IP 頭部屬于可選字段,可以出現也可以不出現.

    Optinos 字段中可以包含 0 到多個 Option,對于每個 Option 它的合法格式有以下兩種:

  • 使用一個單獨的 Option-Type 作為該字段的值
  • Option-Type + Option-Length + Option-Data 作為該字段的值
  • 一個字節的 Option-Length 表明 后續 Option-Data 的長度. 單位也為字節.

    Option-Type:

    該類型長度為 8 bit. 每個 bit 的含義如下:

    • bit 0: copied field,
    • bit 1-2: option class
    • bit 3-7: option number
    Copied field:

    表明當需要對原始數據包進行分片時,該 Option 是否需要拷貝到每個分片中去.

    • 0 代表 not copied
    • 1 代表 copied
    Option class:
    • 0: 代表 Control
    • 1: 保留
    • 2: 代表 Debugging and measurement
    • 3: 保留
    當前可用的 Option
    ClassNumberLengthDescription
    00-End of Option list. 占用一個字節.沒有長度
    01-No operation. 占用一個字節.沒有長度
    0211Security.
    03var.Loose Source Routing. 使用源發送者所提供的信息路由當前數據包
    09var.Strict Source Routing. 使用源發送者所提供的信息路由當前數據包
    07var.Record Route. 用于跟蹤當當前數據包的路由
    084Stream ID. 用于包含 Stream ID
    24var.Internet Timestamp

    抓包分析

    未分片IP包

    經過上面的學習,我們來嘗試著分析一個 Wireshark 抓到的 IP 數據包.

    原始二進制數據為:
    45 00 00 28 fa f1 40 00 32 06 ec 59 a1 75 ff 00
    c0 a8 00 66

  • 第一個字段為 Version,這里是 IPv4 協議,因此第一個字節便是 4.
  • 第二個字段為 IHL, 我們看到它的值是 5, 由于該字段的單位為 4 字節,因此實際的數據是 20. 也就是說我們這個 IP包的包頭長度為 20 字節. 說明一點, IP頭的最小長度便是 20 字節。
  • 第三個字段為 Type of Service. 很明顯 wireshark 使用的描述和 RFC 中定義不同. 不過也沒關系,該字段的值為 0. 也就是未使用.
  • 第四個字段為 Total Length, 表明當前 IP包的整體長度為 40 字節。 20 字節的 IP 頭部 和 20 字節的 TCP 數據.
  • 第五個字段是 Identification
  • 第六個字段是 Flags,它的值是 010 (二進制), 表明不要對當前 IP 數據包分片,且當前分片是 last frament.
  • 第七個字段是 Fragment Offset, 由于該 IP 數據包未被分片,因此 我們看到 Fragment Offset 字段為 0.
  • 第八個字段是 Time to Live, 它的值是 50.
  • 第九個字段是 Protocol, 表明當前 IP 數據包中所承載的數據是 TCP 協議的數據包.
  • 第十個字段是 Checksum
  • 第十一個字段和十二個字段分別代表源地址和目的地址.
  • Padding: 截圖中未體現出來. 由于該數據包的實際長度為 50 字節,并非是 32 bit 的整數倍,因此需要使用 Padding 字段來填充該 IP 數據包. 計算得知 padding 應為 2 個字節,值為 0x0000.
  • 分片 IP包

    接下來我們來看看分片的 IP 數據包是怎么樣的.
    這里我們將會看到一個分成三個分片的數據包. 這里我們只關注分片相關的幾個字段,其他字段參照上面分析.

    第一個分片

    這里我們需要關注的字段有: Identification, Flags, 和 Fragment Offset 三個字段.

    且看上圖,這是一個IP包被分為三片中的第一片.

  • 我們知道 Identification 的值是一個 Id,并沒有具體意義,暫且略過.
  • Flags 的值為 001(二進制), 根據 Flags 的定義我們知道:
    • 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
    • 第三個 bit 為 1, 代表 More Fragment, 說明該數據包不是原始數據包分片中的最后一個.
  • Fragment Offset 為 0, 代表當前分片是原始數據包分片中的第一個.
  • 接下來且看第二個分片

    4. 注意到當前分片的 Identification 值與第一個分片的值相同.
    5. Flags 的值為 001(二進制), 根據 Flags 的定義我們知道:
    - 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
    - 第三個 bit 為 1, 代表 More Fragment, 說明該數據包不是原始數據包分片中的最后一個.
    6. Fragment Offset 為 1480. 這里需要注意 wireshark 顯示的是計算過之后的值,如果你看它的原始數據的畫你會發現該位的實際值為 .00010111001(二進制), 由于該字段的單位為 8 byte,因此等同于 00010111001 * 8 也就是 wireshark 中顯示的那個值了. 由第一張圖可以看到,第一個分片中的數據長度為 1480,因此第二個分片中的 Fragment offset 便對應于原始數據包中從 1480 位置除開始的數據. 數據長度依然為 1480.

    接下來且看最后一個分片

    7. 注意到當前分片的 Identification 值與前兩個分片的值相同.
    8. Flags 的值為 000(二進制), 根據 Flags 的定義我們知道:
    - 第二個 bit 為 0, 代表 May Fragment,說明該數據包可以被分片
    - 第三個 bit 為 0, 代表 Last Fragment, 說明該數據包是最后一個分片.
    9. Fragment Offset 為 2960. 由于前兩個分片的數據長度均為 1480,這個分片中的數據自然要從 2960 處開始了.

    總結一下 IP 分片:
    10. 如果將一個數據包的 Flags 中的 Don’t Flag 標志設置為 1, 那么該 IP 數據包不能被分片
    11. 對于需要進行分片的數據包而言,分片規則如下:
    - 對于第一個分片, Framgent Offset 設置為 0, 需要設置 More Fragment
    - 對于中間分片, 需要設置 More Fragment, 且 Frament Offset 為之前所有分片中數據長度之和除以 8.
    - 對于最后一個分片, 需要設置 Last Fragment, 且 Fragment Offset 為之前所有分片數據長度之和除以 8
    - 同一個 IP 數據包分片之后的 IP 數據包需要設置相同的 Identification.

    END!

    總結

    以上是生活随笔為你收集整理的协议簇:IPv4 解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。