gpt4 book ai didi

linux - 确定 IP header 的大小。为什么和别人不一样?

转载 作者:IT王子 更新时间:2023-10-29 01:10:38 25 4
gpt4 key购买 nike

看这段代码:

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

}

我感到困惑的是,在确定我们通常所做的其他 header 的大小时,sizeof(struct tcphdr)sizeof(struct ethhdr) 但对于 IP header 大小,我们不执行 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,依此类推。

关于linux - 确定 IP header 的大小。为什么和别人不一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8925885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com