码迷,mamicode.com
首页 > 其他好文 > 详细

IP数据包格式

时间:2015-11-22 20:07:43      阅读:115      评论:0      收藏:0      [点我收藏+]

标签:

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:标识这个IP数据包。
  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地址。

IP数据包的首部长度和数据包长度都是变长的,但总是4字节的整数倍。

IP数据包格式

标签:

原文地址:http://www.cnblogs.com/embedded-linux/p/4986449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!