在 ICMP 套接字上接收时(SOCK_RAW 和 IPPROTO_ICMP),由于 ICMP 协议中没有“端口”的概念,应用程序如何确定接收到的数据包不是其他 TCP/UDP/任何套接字传输的一部分是否也在同时发生?
例如,假设您有一个具有 2 个线程的应用程序。线程 1 建立一个 TCP 服务器套接字,并不断地从连接的客户端接收数据。线程 2 使用 ICMP 套接字不断向同一个客户端发送回显请求数据包 (ping),然后接收回显回复。什么是阻止线程 2 接收 TCP 数据包之一呢?
在 ICMP 套接字上接收时(SOCK_RAW 和 IPPROTO_ICMP),由于 ICMP 协议中没有“端口”的概念,应用程序如何确定接收到的数据包不是其他 TCP/UDP/任何套接字传输的一部分是否也在同时发生?
例如,假设您有一个具有 2 个线程的应用程序。线程 1 建立一个 TCP 服务器套接字,并不断地从连接的客户端接收数据。线程 2 使用 ICMP 套接字不断向同一个客户端发送回显请求数据包 (ping),然后接收回显回复。什么是阻止线程 2 接收 TCP 数据包之一呢?
ICMP 是不同于 TCP 和 UDP 的协议,由IP 标头中的协议字段确定。当您打开一个带有 的套接字时IPPROTO_ICMP
,您是在告诉该套接字仅传输和接收带有协议字段设置为 ICMP 的 IP 标头的数据包。
类似地,套接字打开IPPROTO_TCP
或IPPROTO_UDP
仅响应其 IP 标头包含分别设置为 TCP 或 UDP 的协议字段的数据包。
收到的 UDP 和 TCP 数据包从未传递到原始套接字。如果一个进程想要读取包含 UDP 或 TCP 数据包的 IP 数据报,则必须在数据链路层读取数据包。检查这个链接
http://aschauf.landshut.org/fh/linux/udp_vs_raw/ch01s03.html
如果数据包未在第 2 层缓存,则由内核处理。如果数据包是 icmp 协议并且它是回显请求或时间戳请求或地址掩码请求类型,则它完全由内核处理,否则它将传递给 RAW SOCKETS。
另一种是所有带有内核不理解的协议字段的数据报都被传递到原始套接字,只对它们进行基本的ip处理
最后,如果数据报以片段的形式到达,那么在所有片段都到达并重新组装之前,什么都不会传递给原始套接字。
如果您想了解更多信息,请阅读本书。
您可以检查 ICMP 标头的类型并查看其 ICMP Echo Response (Type 0)。同样在 ICMP 中,响应将包含您最初发送的请求。