2010-07-08 27 views
10

我有一個從Linux 64位平臺(2.6.18)上的多播套接字讀取的Java閱讀器應用程序。套接字大小已被設置爲2 MB。當閱讀器不能足夠快地讀取時,套接字「溢出」,即數據包從緩衝器中丟失。Linux套接字緩衝區如何溢出?

我想知道的是Linux內核如何從套接字緩衝區中丟棄數據包。我假設套接字緩衝區本身是一個FIFO緩衝區。但是,如果滿了會發生什麼?下一個數據包是否會被丟棄(並且緩衝區內容不會改變)?或者新的數據包會替換緩衝區中的舊數據包?如果是,哪個數據包(最老的?,最年輕的?,一個隨機選擇的數據包?)?

感謝您的任何見解。

回答

8

當緩衝區已滿時,傳入的數據包將被丟棄。已經在緩衝區中的數據包不會被修改或替換。

+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

2

除了JS Bangs的答案之外。

這不是網絡堆棧中可以丟棄數據包的唯一位置。套接字接收緩衝區在層次結構中很高,並且特定於用戶套接字。靠近硬件的另一個地方(至少在Linux中)是設備驅動程序和softirq之間的隊列(請參閱netif_rx())。這些下降將有助於在netstat -i輸出RX-DRP列。

+0

謝謝。我用'sar'建立起來,確實我丟失了應用程序讀取的套接字緩衝區上的數據包。由於應用程序讀取速度太慢,我可以看到數據包丟失時的計數器。 – AtomicJake 2010-07-09 08:27:07