Wie funktioniert eine Linux-socket-buffer overflow?
Ich habe ein Java-reader-Anwendung, liest aus einem multicast-socket auf einem Linux-64-bit-Plattform (2.6.18). Die socket-Größe auf 2 MB festgelegt. Wenn der reader nicht Lesen kann, schnell genug die Buchse "überläuft", d.h. Pakete aus dem Puffer.
Was ich gerne wissen würde ist, wie der Linux-kernel-Tropfen-Pakete für die socket-buffer. Ich gehe davon aus, dass die socket-buffer selbst ist ein FIFO-Puffer. Allerdings, wenn es voll ist was passiert? Wird das nächste Paket werden verworfen (und der Puffer-Inhalt nicht ändern)? Oder wird das neue Paket ersetzt ein älteres Paket im Puffer? Wenn ja, welches Paket (das älteste?, der jüngste?, ein zufällig ausgewähltes Paket?)?
Vielen Dank für jede Einsicht.
InformationsquelleAutor AtomicJake | 2010-07-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn der Puffer voll ist, werden eingehende Pakete verworfen. Pakete, die bereits im Puffer sind werden Sie nicht geändert oder ersetzt.
dies ist eine gängige Praxis von Netzwerk-design. Oder: was kann OS zu tun? IIRC bei der socket-buffer voll ist TCP-stack setzt die Fenstergröße auf 0. Alle eingehende Pakete, die in dem Staat, wäre Sie einfach als ungültig angesehen (nicht der Einbau der Fenster) und somit verworfen. Lesen Sie die RFC793, Blick für das "receive window".
Sie sind das richtige für TCP, aber ich wurde konkret gefragt, für einen Multicast-UDP-socket Lesen. Soweit ich weiß, jedes eingehende Paket aus dem Netz kopiert wird in eine unabhängige socket-buffer (ein Puffer pro Leser). Der sockel ist so entleert von jedem Leser in einem anderen Tempo. Auf Linux, wenn ein Puffer voll ist, wird ein neues Paket einfach verworfen - oder (wie in einem ring-Puffer) überschreibt den ältesten Eintrag? Ich würde davon ausgehen, dass beide Implementierungen sind legal.
InformationsquelleAutor JSBձոգչ
Nur eine Ergänzung zu der Antwort von JS Pony.
Dies ist nicht der einzige Ort in den Netzwerk-stack, wo Pakete abgelegt werden können. Socket receive-buffer ist hoch in der Hierarchie und ist spezifisch für die Benutzer-Buchse. An einer anderen Stelle näher auf die hardware (zumindest in Linux) ist die Warteschlange zwischen die Treiber und die
NET_RX
softirq (siehenetif_rx()
.) Diese Tropfen werden dazu beitragenRX-DRP
Spalte innetstat -i
Ausgabe.InformationsquelleAutor Nikolai Fetissov