我似乎遇到了IP队列的问题。
我有一台linux机器用于运行一些实验。 Linux机器配置为路由器,具有两个NIC,连接另外两台计算机,并管理其网络流量。 使用iptables捕获所有传入的包,并通过C应用程序进行分析。
分析数据包的应用程序具有内置延迟,作为实验的一部分。
所以我有一台非常快的计算机通过我的linux路由器和一个(相对)慢的linux路由器发送数据包,它逐个分析和处理数据包。
这种情况导致我在连接到linux路由器的其中一台计算机上启动发送方应用程序时,linux路由器上的IP队列(几乎)立即被填满。
IP队列的最大长度当前设置为1024,如果溢出,则丢弃数据包。这是预期的,我很好。
但是,(这就是它变得有趣的地方),偶尔会出现以下错误:
“无法接收netlink消息:没有可用的缓冲区空间”
一开始,我认为这是由于IP队列溢出,但经过一些分析后发现,即使IP队列缓冲区没有溢出,有时我也会收到错误,有时我甚至不会收到消息缓冲区DID溢出。
当我运行> cat /proc/net/ip_queue
时,我得到下表(也用于监视IP队列溢出):
Peer PID : 27389
Copy mode : 2
Copy range : 65535
Queue length : 0
Queue max. length : 1024
Queue dropped : 1166875
Netlink dropped : 2916
查看最后两个值,Queue dropped
似乎是指由于缓冲区已满而无法进入IP队列的数据包。当我轰炸linux-router时,我可以看到这个值上升。 Netlink dropped
(顾名思义:))似乎与我得到的错误有关。
我尽力搜索有关此错误的材料,但无法找到任何似乎指向我所需方向的内容。
底线:为什么我会收到此错误,我该怎么办才能避免此错误?
答案 0 :(得分:0)
尝试使用setsockopt增加netlink接收套接字上的接收缓冲区空间..这应该删除错误!