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