【问题标题】:Determining size of IP header. Why is it different from others?确定 IP 标头的大小。为什么和别人不一样?
【发布时间】:2012-02-14 02:27:01
【问题描述】:

看看这段代码:

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: %d\n", ntohs(tcp_header->source));
   printf("Dest Port: %d\n", ntohs(tcp_header->dest));

  }

我感到困惑的是,在确定我们通常执行的其他标头的大小时,sizeof(struct tcphdr) 或 sizeof(struct ethhdr) 但对于 IP 标头大小,我们不执行 sizeof,而是执行 ip_header->ihl*4。为什么会这样?还有这个 4 是干什么用的?

IP heder的struct声明如下:

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 };

【问题讨论】:

    标签: linux header network-programming ip ipv4


    【解决方案1】:

    这是不同计量单位的问题。 IP头中的IHL字段定义如下:

    Internet Header Length 是 Internet 标头的长度 32 位 单词。

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

    【讨论】:

    • @kingsmasher1 我扩展了我的答案 :-) 标题的大小不固定。
    • 好的,所以您的意思是仅在 IP 标头的情况下它会变化,但对于其他人来说它是固定的。让我再检查一下结构声明并进行比较。
    • 看到我已经在上面的问题中放置了 IP 标头结构,哪个字段会改变以便 IP 标头长度发生变化?为什么这不是其他情况?我知道我的问题可能很乏味,但如果你能澄清的话。提前致谢。
    • @kingsmasher1 你的问题并不乏味。你只是懒惰,没有阅读 RFC 791(你甚至没有仔细阅读我的答案)。回到您的问题:由于提到的 ip 选项,标头的大小会有所不同。
    • 你是对的。我现在正在检查这个:ietf.org/rfc/rfc791.txt 但我仔细阅读了你的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多