在ICMP套接字上接收数据

时间:2009-07-15 00:42:54

标签: icmp

在ICMP套接字上接收(SOCK_RAW与IPPROTO_ICMP),因为 在ICMP协议中没有“端口”的概念,怎么可以 应用程序确定收到的数据包不属于其他数据包 TCP / UDP /也发生在任何套接字传输 同一时间?

例如,假设您有一个包含2个线程的应用程序。线程1 设置TCP服务器套接字,并不断从a接收数据 连接客户端。线程2连续发送echo请求包 (ping)使用ICMP套接字到同一客户端,然后接收回显 回信。什么是阻止线程2接收其中一个TCP 包反而?

3 个答案:

答案 0 :(得分:7)

ICMP是与TCP和UDP不同的协议,由IP header中的协议字段确定。当您使用IPPROTO_ICMP打开套接字时,您告诉套接字仅发送和接收包含其协议字段设置为ICMP的IP头的数据包。

同样,使用IPPROTO_TCPIPPROTO_UDP打开的套接字仅响应IP头包含分别设置为TCP或UDP的协议字段的数据包。

答案 1 :(得分:1)

您可以检查该类型的ICMP标头,并查看其ICMP Echo Response(类型0)。同样在ICMP中,响应将包含您首先发送的请求。

答案 2 :(得分:1)

收到UDP& TCP数据包永远不会传递给原始套接字。如果进程想要读取包含UDP或TCP数据包的IP数据报,则必须在数据链路层读取数据包。查看此链接

http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch01s03.html

如果数据包未在第2层缓存,则由内核处理。 如果数据包是icmp协议并且它是echo请求或时间戳请求或地址掩码请求类型,则它完全由内核处理,否则它将传递给RAW SOCKETS。

另一个带有内核不理解的协议字段的所有数据报都传递给原始套接字,只对它们进行基本的ip处理

最后,如果数据报到达片段,那么在所有片段到达并重新组装之前,不会将任何内容传递给原始套接字。

如果您想了解更多信息,请阅读this book