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 

posted @ 2015-11-22 19:02  yuxi_o  阅读(5098)  评论(0编辑  收藏  举报