linux – 确定IP头的大小.为什么它与其他人不同?
发布时间:2020-12-14 00:51:54 所属栏目:Linux 来源:网络整理
导读:看看这段代码: if(ip_header-protocol == IPPROTO_TCP) { tcp_header = (struct tcphdr*)(packet + sizeof(struct ethhdr) + ip_header-ihl*4); /* Print the Dest and Src ports */ printf("Source Port: %dn",ntohs(tcp_header-source)); printf("Dest P
看看这段代码:
if(ip_header->protocol == IPPROTO_TCP) { tcp_header = (struct tcphdr*)(packet + sizeof(struct ethhdr) + ip_header->ihl*4); /* Print the Dest and Src ports */ printf("Source Port: %dn",ntohs(tcp_header->source)); printf("Dest Port: %dn",ntohs(tcp_header->dest)); } 我感到困惑的是,如果确定我们通常做的其他标头的大小,sizeof(struct tcphdr)或sizeof(struct ethhdr),但是对于IP标头大小,我们不做sizeof而是做ip_header-> ihl * 4.为什么会这样?这4个是什么? 以下是IP heder的结构声明: 00116 struct iphdr { 00117 #if defined(__LITTLE_ENDIAN_BITFIELD) 00118 __u8 ihl:4,00119 version:4; 00120 #elif defined (__BIG_ENDIAN_BITFIELD) 00121 __u8 version:4,00122 ihl:4; 00123 #else 00124 #error "Please fix <asm/byteorder.h>" 00125 #endif 00126 __u8 tos; 00127 __u16 tot_len; 00128 __u16 id; 00129 __u16 frag_off; 00130 __u8 ttl; 00131 __u8 protocol; 00132 __u16 check; 00133 __u32 saddr; 00134 __u32 daddr; 00135 /*The options start here. */ 00136 }; 解决方法
这是不同测量单位的问题. IP头中的IHL字段定义如下:
并且此大小不固定(因为有效但不鼓励的IP选项).因此,一个数据包可能有IHL = 5,下一个数据包可能有IHL = 6,依此类推. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |