2

我们目前正在测试基于 IP 的电信应用程序。我们打开一个原始套接字并从远程端接收消息(msgrate@750+msgs/秒,大小约为 180 字节,不包括 IP)。

在原始套接字之上有一个称为 SCTP(就像 TCP)的层,它时不时地指示它丢失了一些数据包。现在,我们在接收节点上运行 Wireshark,我们可以在 Wireshark 中看到该数据包。

在我看来,套接字的接收缓冲区很小,导致 IP(?) 丢弃消息。但是,IP Pegs(netstat -sv) 显示没有丢弃的数据包。我们尝试将套接字接收队列设置为 40000,但没有成功。

我将不胜感激任何关于我们应该配置 IP 层的选项(如果有的话)的指针,或者我们需要设置任何特定的套接字选项。

4

2 回答 2

2

感谢您的投入。但是,我们已经能够“解决”这个问题。之前,我描述了我们如何阅读消息。一旦 select 返回,我们就会运行一个循环(根据要读取的原始消息的数量,在我们的例子中是 >1)。1) 我们调用 ioctl(FIONREAD) 来查找要读取的字节数;2) 通过调用 recvfrom 读取那么多字节 3) 将字节发送给用户 4) 再次进入循环并调用 ioctl(FIONREAD) 然后重复这些步骤

但是,在第 4 点,ioctl(FIONREAD) 使用返回 0。我们的代码进行了防御性检查。预期,来自 ioctl(FIONREAD) 的 0 字节意味着发送者发送了一个有效负载为 0 的 IP 标头。因此,它使用调用 recvfrom(bytes to read=0) 来清除 IP 标头,以免 select 会再次对此进行设置。

在时间 t0,ioctl(FIONREAD) 返回 0 作为要读取的字节数 在时间 t1,调用 recvfrom(bytes to read=0)。有时,在 t0 和 t1 之间,实际数据用于在套接字接收队列中排队并用于在我们调用 recvFrom(bytes=0) 时被丢弃。

设置 rawMsgsToRead=1 的数量已经“解决”了这个问题。但是,我的猜测是它会影响我们的表现。他们是否有任何 ioctl 调用可以区分队列中的八位字节为 0 和有效负载为 0 的 IP 标头

于 2009-05-06T13:15:09.550 回答
1

我有几个问题和一些事情要考虑。1)您正在使用哪种 SCTP 实现以及在哪个操作系统上。一些 SCTP 实现比其他实现更健壮。2) SCTP 是否否定地确认丢弃的数据包?在wireshark 中搜索gapack。3)你在wireshark中看到丢弃的数据包你确定这些不是重传吗?4)wireshark监控系统在哪里?如果它与您的应用程序不在同一条线上,那么它可能会看到您的应用程序没有看到的消息。5) SCTP 给出的具体指示是什么?

如果您认为 IP 套接字 rx 缓冲区溢出,那么您可以考虑减小 SCTP RX 窗口的大小;这通常可以在 sctp 堆栈中进行配置。Rx 窗口限制了等待确认的未完成数据量,因此限制了 IP 缓冲区中的数据量。您还可以尝试提高 SCTP 任务的优先级,以便它更快地从 IP 缓冲区中读取消息(这可能是最容易尝试的事情,我认为这是一件好事)。

问候

于 2009-04-24T08:23:07.030 回答