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 */
};
解析
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字節。