当我们使用Raw Socket的时候,可以完全自定义IP包,一切形式的包都可以"制造"出来。因此,本文事先必须对TCP/IP所涉及IP包结构进行必要的交待。
目前,IPv4的报头结构为:
版本号(4) |
包头长(4) |
服务类型(8) |
数据包长度(16)
|
标识(16)
|
偏移量(16)
|
生存时间(8)
|
传输协议(8)
|
校验和(16)
|
源地址(32)
|
|
目的地址(32)
|
|
选项(8)
|
.........
|
填充
|
对其进行数据结构封装:
typedef struct _iphdr //定义IP报头 { unsigned char h_lenver; //4位首部长度+4位IP版本号 unsigned char tos; //8位服务类型TOS unsigned short total_len; //16位总长度(字节) unsigned short ident; //16位标识 unsigned short frag_and_flags; //3位标志位 unsigned char ttl; //8位生存时间 TTL unsigned char proto; //8位协议 (TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和 unsigned int sourceIP; //32位源IP地址 unsigned int destIP; //32位目的IP地址 } IP_HEADER; |
或者将上述定义中的第一字节按位拆分:
typedef struct _iphdr //定义IP报头 { unsigned char h_len : 4; //4位首部长度 unsigned char ver : 4; //4位IP版本号 unsigned char tos; unsigned short total_len; unsigned short ident; unsigned short frag_and_flags; unsigned char ttl; unsigned char proto; unsigned short checksum; unsigned int sourceIP; unsigned int destIP; } IP_HEADER; |
更加严格地讲,上述定义中h_len、ver字段的内存存放顺序还与具体CPU的Endian有关,因此,更加严格的IP_HEADER可定义为:
typedef struct _iphdr //定义IP报头 { #if defined(__LITTLE_ENDIAN_BITFIELD) unsigned char h_len : 4; //4位首部长度 unsigned char ver : 4; //4位IP版本号 #elif defined (__BIG_ENDIAN_BITFIELD) unsigned char ver : 4; //4位IP版本号 unsigned char h_len : 4; //4位首部长度 #endif
|
共4页: 上一页 [1] 2 [3] [4] 下一页
|