【问题标题】:Raw ICMP socket interaction with internal stack windows/linux原始 ICMP 套接字与内部堆栈 windows/linux 的交互
【发布时间】:2018-02-06 05:17:12
【问题描述】:

关于在这个例子中使用 ICMP 原始套接字

sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

有一些重要的问题我在文档中的任何地方都找不到答案。据我了解,ICMP协议已实现 在内核级别((通过 %SystemRoot%\System32\Drivers\Tcpip.sys 驱动程序窗口)。

那么这个内核逻辑如何与愿意发送和接收如上例中定义的 ICMP 数据包的原始用户空间套接字交互?

由于 RAW 套接字打开并且操作系统让应用程序完全控制 ICMP,是否取消了 ICMP 逻辑?或者他们正在并行工作(不可避免地在网络上造成混乱)。我可以告诉操作系统我想准确处理哪些 ICMP 数据包吗?

欢迎解答linux和windows。

【问题讨论】:

    标签: linux windows network-programming icmp raw-sockets


    【解决方案1】:

    通过使用带有IPPROTO_ICMP 的原始套接字,您只能获得到达您主机的ICMP 数据包的副本(请参阅How to receive ICMP request in C with raw sockets)。网络堆栈中的 ICMP 逻辑仍然存在,并将处理 ICMP 消息。

    因此,您只需在收到感兴趣的 ICMP 数据包后挑选它们(例如,在 ICMP 标头中具有相应的 ID)。在接收缓冲区中,您通过调用recv() 得到填充,您还可以获得完整的 IP 标头。

    在 Linux 下,甚至还有一个套接字选项 (ICMP_FILTER),您可以使用它为不同的 ICMP 数据包设置接收过滤器。

    【讨论】:

    • 谢谢!有什么方法可以通知内核不处理特定的数据包并将它们传递给原始套接字?
    • 假设您只关心 ICMP 回显,那么您可以通过将 sysctl.conf 修改为 net.ipv4.icmp_echo_ignore_all=1 来禁用来自内核的所有响应。了解其他 ICMP 选项here
    猜你喜欢
    • 2012-01-19
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-13
    • 2016-07-10
    • 1970-01-01
    • 2018-12-02
    • 2012-11-12
    相关资源
    最近更新 更多