|   当我们使用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] 下一页 |