[英]How does a Linux socket buffer overflow?
我有一个Java阅读器应用程序,它从Linux 64位平台(2.6.18)上的多播套接字读取。 套接字大小已设置为2 MB。 当读取器无法快速读取时,套接字“溢出”,即从缓冲区中丢弃数据包。
我想知道的是Linux内核如何将数据包从套接字缓冲区中删除。 我假设套接字缓冲区本身是FIFO缓冲区。 但是,如果它已满,会发生什么? 是否会丢弃下一个数据包(缓冲区内容不会改变)? 或者新数据包会替换缓冲区中的旧数据包吗? 如果是,哪个数据包(最老的?,最年轻的?,一个随机选择的数据包?)?
感谢您的任何见解。
当缓冲区已满时,将丢弃传入的数据包。 不会修改或替换缓冲区中已有的数据包。
这只是JS Bangs答案的补充。
这不是网络堆栈中唯一可以丢弃数据包的地方。 套接字接收缓冲区在层次结构中很高,并且特定于用户套接字。 另一个靠近硬件的地方(至少在Linux中)是设备驱动程序和NET_RX
softirq之间的队列(请参阅netif_rx()
。)这些丢弃将导致netstat -i
输出中的RX-DRP
列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.