IP选项和IP首部数据结构

一.
IP选项的作用:LSRR为例子进行说明,主要分为选项的生成、选项的转发、选项的接收三部分。
先看一个源站路由选项的例子,下文的说明都将以此为例。
主机IP:192.168.1.99
源路由:192.168.1.1 192.168.1.2
192.168.1.100[dest ip]
源站路由选项在各个主机上的情况:
该图与<TCP/IP卷一>上的示例不同,因为这里的选项[#R1, R2, D]是以实际传输中的形式标注的,下图是源站路由选项在此过程中的具体形式:
       0x83 说明是LSRR    注意选项中的IP地址
二.
#ifndef WIN32
#include <endian.h>
#else
#include <winsock.h>
#ifndef LITTLE_ENDIAN       //Intel的x86系列CPU,little endian则是低地址存放最低有效字节(LSB)  
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321     //Motorola的PowerPC系列CPU,big endian是指低地址存放最高有效字节(MSB),
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#endif

#define    IPVERSION    4    //协议版本
struct ip {
#if BYTE_ORDER == LITTLE_ENDIAN
    u_char    ip_hl:4,         /* header length *///报头长度,部分占4个BIT位
            ip_v:4;             /* version *///协议版本4
#endif
#if BYTE_ORDER == BIG_ENDIAN
    u_char    ip_v:4,            /* version */
            ip_hl:4;         /* header length */
#endif
    u_char    ip_tos;           //服务类型----网络控制和优先权
    short    ip_len;             //长度
    u_short    ip_id;            //标识段,标识是第几个ip包
    short    ip_off;             //标志段,与标记字段和分片偏移字段一起用于IP报文的分片,这个字段还将在同一原始文件被分片的报文上打上相同的标记,以便接收设备可以识别出属于同一个报文的分片
//下面三行对应IP报头标志位的三位数
#define    IP_DF 0x4000            //是否分片,第二位为1(不可分包)
#define    IP_MF 0x2000            /* more fragments flag *///
#define    IP_OFFMASK 0x1fff       //段移位或后继分片,即二三位为00(可分包,此为最后一个包)或01(还有后继包)
    u_char    ip_ttl;           //生命周期
    u_char    ip_p;             //上层使用协议,即传输协议
    u_short    ip_sum;             //校验和
    struct    in_addr ip_src,ip_dst;    /* source and dest address */
};

#define    IP_MAXPACKET    65535        //IP包最大长度

//服务质量设置
#define    IPTOS_LOWDELAY        0x10 //用来为交互式通信最小化延迟时间   标准 TOS 标识
#define    IPTOS_THROUGHPUT    0x08 //优化吞吐量
#define    IPTOS_RELIABILITY    0x04 //可靠性优化

/*
 * Definitions for IP precedence (also in ip_tos) (hopefully unused)
 */
//IP优先级定义
#define    IPTOS_PREC_NETCONTROL        0xe0
#define    IPTOS_PREC_INTERNETCONTROL    0xc0
#define    IPTOS_PREC_CRITIC_ECP        0xa0
#define    IPTOS_PREC_FLASHOVERRIDE    0x80
#define    IPTOS_PREC_FLASH        0x60
#define    IPTOS_PREC_IMMEDIATE        0x40
#define    IPTOS_PREC_PRIORITY        0x20
#define    IPTOS_PREC_ROUTINE        0x00

/*
 * Definitions for options.
 */
//选项定义
#define    IPOPT_COPIED(o)        ((o)&0x80)
#define    IPOPT_CLASS(o)        ((o)&0x60)
#define    IPOPT_NUMBER(o)        ((o)&0x1f)

#define    IPOPT_CONTROL        0x00
#define    IPOPT_RESERVED1        0x20
#define    IPOPT_DEBMEAS        0x40
#define    IPOPT_RESERVED2        0x60

#define    IPOPT_EOL        0        /* end of option list */
#define    IPOPT_NOP        1        /* no operation */

#define    IPOPT_RR        7        /* record packet route */
#define    IPOPT_TS        68        /* timestamp */
#define    IPOPT_SECURITY        130        /* provide s,c,h,tcc */
#define    IPOPT_LSRR        131        //宽松路由
#define    IPOPT_SATID        136        /* satnet id */
#define    IPOPT_SSRR        137        /* strict source route */

/*
 * Offsets to fields in options other than EOL and NOP.
 */
#define    IPOPT_OPTVAL        0        /* option ID */
#define    IPOPT_OLEN        1        /* option length */
#define IPOPT_OFFSET        2        /* offset within option */
#define    IPOPT_MINOFF        4        /* min value of above */

/*
 * Time stamp option structure.
 */
struct    ip_timestamp {
    u_char    ipt_code;        /* IPOPT_TS */
    u_char    ipt_len;        /* size of structure (variable) */
    u_char    ipt_ptr;        /* index of current entry */
#if BYTE_ORDER == LITTLE_ENDIAN
    u_char    ipt_flg:4,        /* flags, see below */
        ipt_oflw:4;        /* overflow counter */
#endif
#if BYTE_ORDER == BIG_ENDIAN
    u_char    ipt_oflw:4,        /* overflow counter */
        ipt_flg:4;        /* flags, see below */
#endif
    union ipt_timestamp {
        n_long    ipt_time[1];
        struct    ipt_ta {
            struct in_addr ipt_addr;
            n_long ipt_time;
        } ipt_ta[1];
    } ipt_timestamp;
};

/* flag bits for ipt_flg */
#define    IPOPT_TS_TSONLY        0        /* timestamps only */
#define    IPOPT_TS_TSANDADDR    1        /* timestamps and addresses */
#define    IPOPT_TS_PRESPEC    3        /* specified modules only */

/* bits for security (not byte swapped) */
//安全位不是字节交换
#define    IPOPT_SECUR_UNCLASS    0x0000
#define    IPOPT_SECUR_CONFID    0xf135
#define    IPOPT_SECUR_EFTO    0x789a
#define    IPOPT_SECUR_MMMM    0xbc4d
#define    IPOPT_SECUR_RESTR    0xaf13
#define    IPOPT_SECUR_SECRET    0xd788
#define    IPOPT_SECUR_TOPSECRET    0x6bc5

/*
 * Internet implementation parameters. 互联网实施参数
 */
#define    MAXTTL        255     
#define    IPDEFTTL    64      
#define    IPFRAGTTL    60    
#define    IPTTLDEC    1      

#define    IP_MSS        576        /* default maximum segment size *///#define    IP_MSS        576        /* default maximum segment size *//最大分节大小,通知对端它能接受的每个TCP分节中的最大数据量
                            //TCP的MSS选项中,MSS值是一个16位的字段,最大值为65535


posted @ 2012-04-26 08:48  血马雄风  阅读(3291)  评论(0)    收藏  举报