当在ICMP套接字上接收时(带有IPPROTO_ICMP的SOCK_RAW),由于ICMP协议中没有"端口"的概念,应用程序如何确定接收的数据包不是某些其他TCP/UDP /任何套接字传输的一部分也在同一时间发生?
例如,假设您有一个包含2个线程的应用程序.线程1设置TCP服务器套接字,并持续从连接的客户端接收数据.线程2使用ICMP套接字连续向同一客户端发送echo请求包(ping),然后接收echo reply.什么是阻止线程2接收其中一个TCP数据包?
ICMP是与TCP和UDP不同的协议,由IP报头中的协议字段确定.当您打开套接字时IPPROTO_ICMP
,您告诉套接字仅发送和接收具有其协议字段设置为ICMP的IP头的数据包.
类似地,套接字打开IPPROTO_TCP
或IPPROTO_UDP
仅响应其IP头包含分别设置为TCP或UDP的协议字段的数据包.