作者在 2008-12-30 09:49:40 发布以下内容
IP包头数据结构及校验
最简单的IP数据包头:
typedef struct _IPHDR{
u08 nVer_HeadLen; // Version and header len
u08 nService; // Quality of IP service
u16 nLen; // Total len of IP datagram
u16 nIdent; // Identification value
u16 nFlags; // Flags & fragment offset
u08 nTTL; // Time to live
u08 nPCol; // Protocol used in data area
u16 nChk; // Header checksum
u32 nSrcIP; // IP source addr
u32 nDstIP; // IP dest addr
} IPHDR;
IP数据包的头结构中的校验值,是由包头数据累加得到的,不包含IP数据。这点与TCP和UDP不同。
IP数据包头的长度是可变的,最大24字节,最小20字节,真实长度通过nVer_HeadLen的最后面4位计算得到。(nVer_HeadLen | 0x0F) * 4 就是真正包头的长度。TCP包头也是可变长度,也是通过头结构中的某个值算出来实际长度,只是计算方法不太一样。
typedef struct _IPHDR{
u08 nVer_HeadLen; // Version and header len
u08 nService; // Quality of IP service
u16 nLen; // Total len of IP datagram
u16 nIdent; // Identification value
u16 nFlags; // Flags & fragment offset
u08 nTTL; // Time to live
u08 nPCol; // Protocol used in data area
u16 nChk; // Header checksum
u32 nSrcIP; // IP source addr
u32 nDstIP; // IP dest addr
} IPHDR;
IP数据包的头结构中的校验值,是由包头数据累加得到的,不包含IP数据。这点与TCP和UDP不同。
IP数据包头的长度是可变的,最大24字节,最小20字节,真实长度通过nVer_HeadLen的最后面4位计算得到。(nVer_HeadLen | 0x0F) * 4 就是真正包头的长度。TCP包头也是可变长度,也是通过头结构中的某个值算出来实际长度,只是计算方法不太一样。
/**//**//**////////////Ethernet II帧格式//////////////
01 00 5E 7F FF FA //目标MAC地址 厂商代码 设备编号
00 14 78 FF 0F 04 //源MAC地址 | | | |
00-14-18+FF-0F-04
08 00 //上层数据类型 0x0800:IP协议数据;0x809B:AppleTalk协议数据;
//0x8138:Novell类型协议数据
/**//**//**///////////IP侦头////////////////
4 //IP 封包的版本 Version
5 //IP头长度5*4字节 = 20个字节 IHL(Internet Header Length)长度的范围为 5~15
00 //PPPDTRUU PPP:表示此IP 封包的优先度 D:若为O表示一般延时(Delay),若为1表示为低延时
// T:0表示一般传输量(Throughput),1表示为高传输量
// R:0表示一般可靠度(Reliability),1表示高可靠度 UU:保留尚未使用
01 48 //IP封装包的总容量(Total Length:328 bytes),表头与内容(Data)部分,最大可达65535 Bytes
13 21 //标识(Identification),当总容量超过65535Bytes,IP被重组时,标识码告知接收端这些小IP其实来自同一个封包
00 00 //000(特殊标志Flags)0DM;其意义为:D:0表示可以分段,1表示不可分段;M:0表示此IP为最后分段,1表示非最后分段
//00000 00000000(分段偏移Fragment Offset) 表示这个IP分段在原始的IP封包所占的位置
01 //Time To Live (TTL存活时间)范围0-255,当IP包通过一个路由器时,TTL就会减一,当TTL为0时,此IP包将被直接丢弃。
11 //协议代码(Protocl Number)在表头告知接收端IP内含是什么协议的数据
//1:ICMP;2:IGMP;3:GGP;4:IP;6:TCP;8:EGP;17:UDP
DF D6 //Header CheckSum(表头检查码)检查IP表头的正确性
C0 A8 15 0B //Source Address
EF FF FF FA //Destination Address
/**//**//**////////UDP//////////////////////////////////////////////////
04 01 //源端口
07 6C //目的端口
01 34 //长度 308字节(包含UDP头长度)
01 00 5E 7F FF FA //目标MAC地址 厂商代码 设备编号
00 14 78 FF 0F 04 //源MAC地址 | | | |
00-14-18+FF-0F-04
08 00 //上层数据类型 0x0800:IP协议数据;0x809B:AppleTalk协议数据;
//0x8138:Novell类型协议数据
/**//**//**///////////IP侦头////////////////
4 //IP 封包的版本 Version
5 //IP头长度5*4字节 = 20个字节 IHL(Internet Header Length)长度的范围为 5~15
00 //PPPDTRUU PPP:表示此IP 封包的优先度 D:若为O表示一般延时(Delay),若为1表示为低延时
// T:0表示一般传输量(Throughput),1表示为高传输量
// R:0表示一般可靠度(Reliability),1表示高可靠度 UU:保留尚未使用
01 48 //IP封装包的总容量(Total Length:328 bytes),表头与内容(Data)部分,最大可达65535 Bytes
13 21 //标识(Identification),当总容量超过65535Bytes,IP被重组时,标识码告知接收端这些小IP其实来自同一个封包
00 00 //000(特殊标志Flags)0DM;其意义为:D:0表示可以分段,1表示不可分段;M:0表示此IP为最后分段,1表示非最后分段
//00000 00000000(分段偏移Fragment Offset) 表示这个IP分段在原始的IP封包所占的位置
01 //Time To Live (TTL存活时间)范围0-255,当IP包通过一个路由器时,TTL就会减一,当TTL为0时,此IP包将被直接丢弃。
11 //协议代码(Protocl Number)在表头告知接收端IP内含是什么协议的数据
//1:ICMP;2:IGMP;3:GGP;4:IP;6:TCP;8:EGP;17:UDP
DF D6 //Header CheckSum(表头检查码)检查IP表头的正确性
C0 A8 15 0B //Source Address
EF FF FF FA //Destination Address
/**//**//**////////UDP//////////////////////////////////////////////////
04 01 //源端口
07 6C //目的端口
01 34 //长度 308字节(包含UDP头长度)