Linux套接字缓冲区如何溢出?

Linux套接字缓冲区如何溢出?

问题描述:

我有一个从Linux 64位平台(2.6.18)上的多播套接字读取的Java阅读器应用程序。套接字大小已被设置为2 MB。当阅读器不能足够快地读取时,套接字“溢出”,即数据包从缓冲器中丢失。Linux套接字缓冲区如何溢出?

我想知道的是Linux内核如何从套接字缓冲区中丢弃数据包。我假设套接字缓冲区本身是一个FIFO缓冲区。但是,如果满了会发生什么?下一个数据包是否会被丢弃(并且缓冲区内容不会改变)?或者新的数据包会替换缓冲区中的旧数据包?如果是,哪个数据包(最老的?,最年轻的?,一个随机选择的数据包?)?

感谢您的任何见解。

当缓冲区已满时,传入的数据包将被丢弃。已经在缓冲区中的数据包不会被修改或替换。

+0

谢谢。你有链接/来源支持这种说法吗? – AtomicJake 2010-07-08 16:45:56

+0

@AtomicJake:这是网络设计的标准做法。或者:操作系统还能做什么? IIRC当套接字缓冲区已满TCP堆栈将窗口大小设置为0.所有处于该状态的传入数据包将被视为无效(不适合该窗口)并因此被丢弃。阅读RFC793,寻找“接收窗口”。 – Dummy00001 2010-07-08 22:49:13

+0

你对TCP适合,但我特别要求一个Multicast UDP读取套接字。据我所知,每个来自网络的传入数据包都被复制到一个独立的套接字缓冲区中(每个阅读器一个缓冲区)。插座因此被每个读者以不同的速度清空。 在Linux上,当缓冲区已满时,是否丢弃了新的数据包 - 或(如在环形缓冲区中)覆盖最旧的条目?我会假设这两个实现都是合法的。 – AtomicJake 2010-07-09 08:22:08

除了JS Bangs的答案之外。

这不是网络堆栈中可以丢弃数据包的唯一位置。套接字接收缓冲区在层次结构中很高,并且特定于用户套接字。靠近硬件的另一个地方(至少在Linux中)是设备驱动程序和softirq之间的队列(请参阅netif_rx())。这些下降将有助于在netstat -i输出RX-DRP列。

+0

谢谢。我用'sar'建立起来,确实我丢失了应用程序读取的套接字缓冲区上的数据包。由于应用程序读取速度太慢,我可以看到数据包丢失时的计数器。 – AtomicJake 2010-07-09 08:27:07