我正在尝试构建 ICMP 数据包并通过原始套接字发送它。查看示例,我看到 IP 数据包长度计算为:
iphdr.ip_hl = sizeof(struct ip) >> 2
您能解释一下为什么我们需要将 struct ip 右移 2 次而不是分配一个常量值吗?
IP(或 ICMP)数据包的“ip_hl”字段定义为 IP 标头的长度,以 32 位字为单位。
sizeof(struct ip) 产生 IP 标头的长度,以 8 位字节为单位。正如 ip_hl 字段中所预期的那样,将该值右移两次提供以 32 位字为单位的长度。
不为此使用常量的一个很好的理由是消除源代码中的幻数。(无论如何,编译器都会为“sizeof(struct ip) >> 2”生成一个常量值)。
因为 4-bit header length 字段是 header 中32-bit 字的数量,包括 options,所以它可能长于 20 个字节(字段值 5),所以它不应该是一个常量值。您的示例只是假设没有选项场景。