当前位置: 首页 > 知识库问答 >
问题:

在接收“目标不可达”数据包时不发送ICMP回送请求

潘安邦
2023-03-14

现在,我意识到,在不知道主机是否存在或响应(即它发送了ICMP回声回复)的主机上执行“发现”没有多大意义,但对于这个问题来说,这是至关重要的。我们还假设这里所讨论的主机实际上是可访问的,并且确实响应ICMP ping,例如通过命令行ping

“发现”最终导致一些ICMP“目的地不可达:端口不可达”数据包被发回管理服务器,例如,当目标主机上没有运行SNMP代理并且端口161实际上不可达时。

这是完全可以的,但出于某种原因,这似乎阻碍了ICMP套接字向该主机发送ICMP回送请求,这是ICMP ping所需的。由于该请求从未被发送,我的应用程序不会得到任何答复,主机将在一段时间后被视为“无法访问”(超时)。

事实上,负责发送请求的sendto函数已经执行(通过调试确保了这一点),甚至返回成功(发送的字节数),但实际上并没有发送数据包。我可以在Windows和Linux系统上复制这个,所以我不认为这是任何类型的操作系统问题。

禁用“发现”会导致那些无法到达目的地的消息被发回,这使得一切都恢复正常,所以我相当肯定是那些消息阻碍了ICMP回送请求的发送。我找不到答案的一个大问题是:为什么会这样?

如果需要,我可以提供更多的信息,但是,恐怕我不允许在这里发布任何代码,因为这是一个商业产品。不过,代码并不特别,只是使用原始ICMP套接字发送和接收TOS=0TTL=64的ICMP(IPv4)数据包。

共有1个答案

百里芷阳
2023-03-14

Dest unreachable是由路由器生成的,或者如果您在localnet内ping,它将由LocalHost生成。

我想你的观察是因为你在本地网络中ping。正在生成ICMP-3的事实意味着ARP查找失败,如果没有ARP查找,您实际上无法发送数据包,因为您不知道目标MAC地址。解释了一切。

因此,无论如何,您应该像等待一秒钟一样等待一个固定的时间,并声明主机不在那里,是否发送数据包并不重要。

 类似资料:
  • 根据Stevens(图示为TCP/IP),traceroute程序用增量TTL(1、2、3等)向目的主机发送UDP数据包,以从ICMP TTL过期消息中获取中间跳信息。 “到达目的地”条件是ICMP端口无法到达的消息,因为traceroute寻址的随机端口数量很高(也就是说,不太可能有人在那里监听) 所以我的问题是:是否有技术原因(缺点、RFCs等)使用UDP数据包而不使用例如ICMP回送请求消息

  • 已移动:https://superuser.com/questions/782549/udp-client-sending-icmp-port-unreachable-when-receiveing-messages-from-the-ser 我有一个使用luasocket的udp客户端,基本上是这样做的(有几个抽象层,但这是正在发生的事情): 虽然在服务器的调试输出(到远程主机的ssh)中看到一

  • 我正在尝试使用WCF代码中的TCP套接字连接到远程外部服务器我的WCF服务是一个客户端,它的代码使用套接字连接到外部服务器。此代码向外部服务器发送请求并接收服务器响应 如果我使用相同的客户端代码创建一个windows应用程序以连接到远程服务器,则成功。我能够连接、发送和接收此错误仅在我将WCF带入图片时发生。代码在if(m_socket失败。连接)。因此无法成功连接。 非常感谢。

  • 因此,我正在用Java编写一个程序,在DatagramSocket和DataGramPacket的帮助下发送和接收数据。问题是,当我发送数据/接收数据时,数据在我发送的程序中也会有所不同,但只是在某些情况下,比如: 但有时会起作用,比如:

  • 实现蓝牙发送和接收数据的demo。文件包含两个工程,一个接收,一个发送。 [Code4App.com]