设置套接字选项(IP_HDRINCL)对于ICMP请求的套接字非常重要,为什么?

6

我是socket编程的新手

我看到了一个ICMP请求程序,在其中使用setsockopt设置了一个socket

int on = 1;

setsockopt(s, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on))

但即使我不使用这个语句,程序也能正常运行。为什么要向内核提及包括IP结构的套接字如此重要呢?

1个回答

10
IP_HDRINCL选项的作用是(来自手册):
IPv4层在发送数据包时生成IP头,除非在套接字上启用IP_HDRINCL选项。当它被启用时,数据包必须包含一个IP头。对于接收,IP头总是包含在数据包中。
假设您的程序正在构建一个IP头。如果您删除此选项,它将使用内核的IP头。是否“工作”取决于程序的具体功能。也许在某些情况下,它想要自定义IP头,并且在移除此选项后将无法实现该功能。
如果您发布程序的其余部分或告诉我们一些有关它的信息,我们可能能够提供帮助。

这让我得到了一个404错误,但发出icmp回显请求的事情通常需要在IP头中设置“TTL”和“DF”,其中所有这些都需要手动编写头文件。 - abligh
但是当我在Wireshark中查看时,TTL和DF的值分别为255和0(因为也许默认的TTL和DF对我的情况有用),可以尝试在Google中输入该URL,或者只需将其最后的反斜杠删除。 - Siva Kannan
1
你发布的链接是关于Smurf攻击的。这种攻击方式是通过将源地址设置为受害者的IP地址(源地址欺骗)来实现的,因为回复者会向该地址发送数据包,从而放大攻击效果。移除相关的套接字选项将意味着源地址被设置为攻击者自己主机上出口接口的源地址(即停止源地址欺骗),这将使攻击者攻击自己而不是受害者 - 在许多情况下是一个好结果。 - abligh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接