【发布时间】:2011-08-25 12:59:38
【问题描述】:
在 ip_output 中有两行我看不懂的代码:
mhlen = sizeof(struct ip)
和
if (hlen > sizeof(struct ip)) { ...
为什么我们需要将原始 ip 数据包头的长度 hlen 与 sizeof(struct ip) 进行比较?
你能帮忙吗?
【问题讨论】:
-
你是面前有代码的人,而不是我们。
在 ip_output 中有两行我看不懂的代码:
mhlen = sizeof(struct ip)
和
if (hlen > sizeof(struct ip)) { ...
为什么我们需要将原始 ip 数据包头的长度 hlen 与 sizeof(struct ip) 进行比较?
你能帮忙吗?
【问题讨论】:
看起来这可能来自 BSD 的 ip_fragment 函数?其中一个变量是mhlen,一个是hlen,所以它们可能不同。 IP 标头是可变长度的。 struct ip 具有固定部分。 hlen 变量具有实际长度,包括末尾的可变长度选项。
【讨论】:
sizeof(struct ip) 始终为 20。有关标题布局的详细信息,请参阅 en.wikipedia.org/wiki/IPv4#Header,这应该有助于您解码代码。
IP 标头可以有其他选项(例如,源路由记录,用于跟踪路由)。 IP 标头的总大小在hlen 字段中编码为一个 32 位字的数量,因此如果没有 IP 选项,它将是 5(20 个字节),如果有 IP 选项,则更大。
【讨论】: