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

sd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);

有一个重要的问题我在文档中找不到答案。据我所知,ICMP协议已经实现了
在内核级(由%SystemRoot%\System32\Drivers\Tcpip.sys driver windows提供)。
那么,这个内核逻辑如何与愿意发送和接收如上面示例中定义的ICMP包的原始用户空间套接字交互?
由于原始套接字打开并且操作系统给予应用程序对ICMP的完全控制,ICMP逻辑是否被取消?或者他们在并行工作(不可避免地在网络上造成混乱)。我能告诉操作系统我想处理哪些ICMP包吗?
欢迎回答linux和windows的问题。

最佳答案

通过将原始套接字与IPPROTO_ICMP一起使用,您只能获得到达主机的ICMP数据包的副本(请参见How to receive ICMP request in C with raw sockets)。网络堆栈中的ICMP逻辑仍处于活动状态,将处理ICMP消息。
因此,您只需要在收到感兴趣的ICMP数据包后选择它们(例如,ICMP头中有相应的ID)。在接收缓冲区中,通过调用recv()也可以得到完整的IP报头。
在Linux下甚至还有一个socket选项(ICMP_FILTER),您可以使用它为不同的ICMP数据包设置一个接收过滤器。

关于linux - 与内部堆栈Windows/Linux的原始ICMP套接字交互,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48635930/

10-12 00:52