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

时间:2010-07-08 16:39:24

标签: linux sockets networking linux-kernel

我有一个Java阅读器应用程序,它从Linux 64位平台(2.6.18)上的多播套接字读取。套接字大小已设置为2 MB。当读取器无法快速读取时,套接字“溢出”,即从缓冲区中丢弃数据包。

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

感谢您的任何见解。

2 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:2)

只是JS Bangs答案的补充。

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