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地址
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

浙公网安备 33010602011771号