IP數據包格式

IP數據包格式網絡

0 4 8 16 31ide

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

|16位標識 | 3位標誌 | 13位片偏移 |spa

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

|32位源IP地址|blog

|32位目的IP地址|ip

|選項(可無)|路由

|數據|get

netinet/ip.h中定義ip:qt

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字節。

 

參考:http://www.javashuo.com/article/p-yewwioey-kc.html 

相關文章
相關標籤/搜索