Chinaunix首页 | 论坛 | 博客
  • 博客访问: 101756
  • 博文数量: 21
  • 博客积分: 193
  • 博客等级: 入伍新兵
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-30 10:36
文章分类
文章存档

2011年(21)

分类:

2011-07-01 11:40:32

// /usr/include/linux/ip.h
struct iphdr {
#if defined(__LITTLE_ENDIAN_BITFIELD)
         __u8    ihl:4,
                 version:4;
#elif defined (__BIG_ENDIAN_BITFIELD)
         __u8    version:4,
                 ihl:4; // 版本 占用4位
#else
#error  "Please fix "
#endif
       // ihl :IP包头长度(Header Length):长度4比特。这个字段的作用是为了描述IP包头的
//长度,因为在IP包头中有变长的可选部分。IP包头最小长度为20字节,由于变长的可选部分
//最大长度可能会变成60字节。
__u8    tos;//服务类型
        __be16  tot_len;// 以字节为单位计算的IP包的长度 (包括头部和数据),
//所以IP包最大长度65535字节
        __be16  id;//该字段和Flags和Fragment Offest字段联合使用,对大的上层
//数据包进行分段(fragment)操作。路由器将一个包拆分后,所有拆分开的小包被标记相
//同的值,以便目的端设备能够区分哪个包属于被拆分开的包的一部分。
        __be16  frag_off;//长度3比特。该字段第一位不使用。第二位是DF(Don't Fragment)位,
//DF位设为1时表明路由器不能对该上层数据包分段。如果一个上层数据包无法在不分段的
//行转发,则路由器会丢弃该上层数据包并返回一个错误信息。第三位是MF(More Fragments)位,
//当路由器对一个上层数据包分段,则路由器会在除了最后一个分段的IP包的包头中将MF位设为1。
        __u8    ttl;//长度8比特。当IP包进行传送时,先会对该字段赋予某个特定的值。当IP包经过
//每一个沿途的路由器的时候,每个沿途的路由器会将IP包的TTL值减少1。如果TTL减少为0,
//则该IP包会被丢弃。这个字段可以防止由于路由环路而导致IP包在网络中不停被转发。
        __u8    protocol;//长度8比特。标识了上层所使用的协议。以下是比较常用的协议号:
//1    ICMP
//2    IGMP 
//6    TCP
//17   UDP
        __sum16 check;//用来做IP头部的正确性检测,但不包含数据部分。因为每个路由器要改变TTL的值,
//所以路由器会为每个通过的数据包重新计算这个值。
        __be32  saddr;
        __be32  daddr;//标识了这个IP包的起源和目标地址。
        /*The options start here. */
这是一个可变长的字段。该字段属于可选项,主要用于测试,由起源设备根据需要改写
};

因为IP包头长度(Header Length)部分的单位为32bit,所以IP包头的长度必须为32bit的整数倍。因此,
在可选项后面,IP协议会填充若干个0,以达到32bit的整数倍。

阅读(1373) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~