我最近遇到了一个场景,我发现 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”实用程序。有没有更好的方法来处理这个?
我应该如何调查接口和应用程序之间丢失的数据包?根据您的经验,哪些工具/实用程序/技术将是有效的选择?
我错过了什么吗?感谢您的时间和投入。我很感激。