IP數據包格式


IP數據包格式

0 4 8 16 31

|4位版本 | 4位首部長度 | 8位服務類型 | 16位總長度(字節數)|

|16位標識 | 3位標志 | 13位片偏移 |

|8位生存時間| 8位協議 | 16位首部校驗和 |

|32位源IP地址|

|32位目的IP地址|

|選項(可無)|

|數據|

netinet/ip.h中定義ip:

struct ip

{

#if __BYTE_ORDER == __LITTLE_ENDIAN

unsigned int ip_hl:4; /* header length */

unsigned int ip_v:4; /* version */

#endif

#if __BYTE_ORDER == __BIG_ENDIAN

unsigned int ip_v:4; /* version */

unsigned int ip_hl:4; /* header length */

#endif

u_int8_t ip_tos; /* type of service */

u_short ip_len; /* total length */

u_short ip_id; /* identification */

u_short ip_off; /* fragment offset field */

#define IP_RF 0x8000 /* reserved fragment flag */

#define IP_DF 0x4000 /* dont fragment flag */

#define IP_MF 0x2000 /* more fragments flag */

#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */

u_int8_t ip_ttl; /* time to live */

u_int8_t ip_p; /* protocol */

u_short ip_sum; /* checksum */

struct in_addr ip_src, ip_dst; /* source and dest address */

};

解析

  1. 4位首部長度(ip_hl):這個值以4字節為單位,IP協議首部的固定長度為20個字節,如果IP包沒有選項,那么這個值為5.
  2. 4位版本(ip_v):這里是4,現在IPV6已經出來了。
  3. ip_tos服務類型:說明提供的優先權。
  4. ip_len:IP數據包的總長度,最大為65535,字節數。包括IP首部和IP層payload(數據)。
  5. ip_id:唯一地標識主機發送的每一份數據報,一個數據報的所有分片具有相同的標識。
  6. 3位標識,第一位RF保留,第二位DF是否分片,1不分片(默認),0分片;第三位MF是否還有分片,1還有片(默認),0無片。
  7. ip_off碎片偏移:和上面ID一起用來重組碎片。
  8. ip_ttl生存時間:每經過一個路由時減1,直到為0時被拋棄。單位不是秒,而是跳hop。
  9. ip_p協議:表示創建這個IP數據包的高層協議,如TCP,UDP,ICMP和IGMP協議。
  10. ip_sum首部校驗和:提供對首部數據的校驗。
  11. ip_src,ip_dst:發送者和校驗者IP地址。

12. 分片: 把一個數據報為了適合網絡傳輸而分成多個數據報的過程稱為分片,被分片后的各個IP數據報可能經過不同的路徑到達目標主機。 一個IP數據報在傳輸過程中可能被分片,也可能不被分片。如果被分片,分片后的IP數據報和原來沒有分片的IP數據報結構是相同的,即也是由IP頭部和IP數據區兩個部分組成: 分片后的IP數據報,數據區是原IP數據報數據區的一個連續部分,頭部是原IP數據報頭部的復制,但與原來未分片的IP數據報頭部有兩點主要不同:標志和片偏移

(1)標志:在IP數據報頭部有一個叫“標志”的字段,用3位二進制數表示: 不分片DF(Do not Fragment)標志如果被置1,則數據報在傳輸過程中不能被分片,如網絡連通性測試命令ping就可以用-F參數設置為在數據傳輸時不分片,但這樣當數據不能通過MTU較小的網絡時,將產生數據不可達的錯誤。 片未完MF(More Fragment)標志如果被置1,說明該數據報不是分片后的最后一個數據報,最后一個數據報的該位被置0。

(2)片偏移:IP數據報被分片后,各片數據區在原來IP數據區中的位置用13位片偏移來表示。上圖中分片1的偏移為0;分片2的偏移為600;分片3的偏移為1200。實際在IP地址中,由於偏移是以8個字節為單位進行計算的,因而在IP數據報中分片1的偏移是0;分片2的偏移是75;分片3的偏移是150。

13. 重組: 當分了片的IP數據報到達最終目標主機時,目標主機對各分片進行組裝,恢復成源主機發送時的IP數據報,這個過程叫做IP數據報的重組。 在IP數據報頭部中,標識用16位二進制數表示,它唯一地標識主機發送的每一份數據報。在一個數據報被分片時,每個分片僅把數據報“標識”字段的值原樣復制一份,所以一個數據報的所有分片具有相同的標識。 目標端主機重組數據報的原理是:

(1)根據“標識”字段可以確定收到的分片屬於原來哪個IP數據報;

(2)根據“標志”字段的“片未完MF”子字段可以確定分片是不是最后一個分片;

(3)根據“偏移量”字段可以確定分片在原數據報中的位置。

14. IP數據包的首部長度和數據包長度都是變長的,但總是4字節的整數倍。每個IP數據包長度最大為1500字節(MTU),包首長20~60字節(選項最多40字節),所以數據長度為1480~1440字節。

 

參考:https://blog.csdn.net/wangzhen209/article/details/74453548 


免責聲明!

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



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