0

我最近遇到了一个场景,我发现 ICMP 网络不可达 [type-1, code-3- 表示目的地不可达,这是正确的 wrt 跟踪路由工作,请参阅下面的 rfc 链接] 数据包仅在发送的字节数超过'X时才会被丢弃' [某些] 字节

** 检查此 RFC,第 3.1 节 - https://www.rfc-editor.org/rfc/rfc4443#section-3.1 **

例如[来源:基于 FreeBSD 的跟踪路由代码],

i = sendto(sndsock, (char *)outpacket,outpacketlength, 0,
           (struct sockaddr *)&Dst, Dst.sin6_len); // to send packet of length "outpacketlength", from source buffer "outpacket" and to destination "Dst".
...
retval = recvmsg(rcvsock, mhdr, 0); // use recvmsg for receiving reply. 

问题

  • 当我 malloc 并发送“X”字节的数据时,我会在接收缓冲区中收到回复。但是,不大于该限制。即,当“outpacketlen”大于“X”字节时,retval 始终为 0,即使您 malloc 并将缓冲区重置为“X”字节。但是,通过数据包捕获,我看到在我的主机中收到了数据包。意思是,我收到数据包但不在接收缓冲区中。这如何/何时可能[任何格式错误的数据包信息?]?

  • 我该如何调试这个问题?

  • 有没有可以用来调试这种场景的工具?我在 BSD 中使用了“truss”实用程序。有没有更好的方法来处理这个?

  • 我应该如何调查接口和应用程序之间丢失的数据包?根据您的经验,哪些工具/实用程序/技术将是有效的选择?

我错过了什么吗?感谢您的时间和投入。我很感激。

4

2 回答 2

1

您需要使用Wireshark并调查您是否正确发送数据包。在 the 之前放置一个断点sendto,看看会发生什么。

于 2013-12-13T21:49:02.817 回答
0

您所说的“在接口和应用程序之间被丢弃”的数据包是否是目标无法到达的 ICMP 错误消息?ICMP 错误通常不会传递给发送触发错误的数据包的应用程序。我猜这里的逻辑是,不能假定使用 UDP 或 TCP 的“常规”应用程序准备好在其应用程序协议流中突然接收各种 ICMP 错误。

你没有提到你的具体平台,但我假设(我的帽子)FreeBSD。在那个平台上,如果你想接收 ICMP 错误,我认为你必须使用原始 IP 套接字。我可能是错的,或者您可能在另一个 BSD 变体上,因此请检查您的 IP 协议手册页以获取合适的套接字选项。

在 Linux 中,您可以通过设置IP_RECVERRsocket 选项然后recvmsg()使用 flag调用来接收此数据包MSG_ERRQUEUE。参见例如从带有 MSG_ERRQUEUE 标志的 recvmsg 中读取 ICMP 有效负载

于 2013-12-14T17:33:56.537 回答