原始套接字接收缓冲区

时间:2009-04-24 06:32:39

标签: sockets queue

我们目前正在通过IP测试电信应用。我们打开一个Raw Socket并从远程端接收消息(msgrate @ 750 + msgs / second大约180字节,不包括IP)。

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

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

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

2 个答案:

答案 0 :(得分: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(字节到读取= 0)。 有时,在t0和t1之间,实际数据用于在套接字接收队列中排队,并在我们调用recvFrom(bytes = 0)时用于丢弃。

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

答案 1 :(得分:1)

我有几个问题需要考虑。 1)您正在使用哪种SCTP实现以及哪种操作系统。一些SCTP实现比其他实现更强大。 2)SCTP是否对丢包有负面肯定?在wireshark中搜索间隙。 3)如果你看到wireshark中丢弃的数据包,你确定这些不是重传吗? 4)系统中的哪些地方是wireshark监控?如果它与您的应用程序不在同一条线路上,那么它可能会看到您的应用程序没有的消息。 5)SCTP给出的指示究竟是什么?

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

此致