我有一个Java阅读器应用程序,它从Linux 64位平台(2.6.18)上的多播套接字读取。套接字大小已设置为2 MB。当读取器无法快速读取时,套接字“溢出”,即从缓冲区中丢弃数据包。
我想知道的是Linux内核如何将数据包从套接字缓冲区中删除。我假设套接字缓冲区本身是FIFO缓冲区。但是,如果它已满,会发生什么?是否会丢弃下一个数据包(缓冲区内容不会改变)?或者新数据包会替换缓冲区中的旧数据包吗?如果是,哪个数据包(最老的?,最年轻的?,一个随机选择的数据包?)?
感谢您的任何见解。
答案 0 :(得分:8)
当缓冲区已满时,将丢弃传入的数据包。已经在缓冲区中的数据包不会被修改或替换。
答案 1 :(得分:2)
只是JS Bangs答案的补充。
这不是网络堆栈中唯一可以丢弃数据包的地方。套接字接收缓冲区在层次结构中很高,并且特定于用户套接字。另一个靠近硬件的地方(至少在Linux中)是设备驱动程序和NET_RX
softirq之间的队列(请参阅netif_rx()
。)这些丢弃将导致RX-DRP
列netstat -i
1}}输出。