加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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字段定义如下:

Internet Header Length is the length of the internet header in 32 bit
words
.

并且此大小不固定(因为有效但不鼓励的IP选项).因此,一个数据包可能有IHL = 5,下一个数据包可能有IHL = 6,依此类推.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读