2010-11-23 7 views
21

Können Sie mir erklären, was genau SO_SNDBUF und SO_RECVBUF Optionen sind?Was sind SO_SNDBUF und SO_RECVBUF

OK, aus irgendeinem Grund puffert das OS die ausgehenden/eingehenden Daten, aber ich möchte dieses Thema klären.

Was ist ihre Rolle (allgemein)?

Sind sie per-Socket-Puffer?

Gibt es eine Verbindung zwischen den Puffern der Transportschicht (z. B. dem TCP-Puffer) und diesen Puffern?

Haben sie ein anderes Verhalten/Rolle bei der Verwendung von Stream-Sockets (TCP) und bei Verwendung von verbindungslosen Sockets (UDP)?

Ein guter Artikel wird auch gut.

Ich googelte es, aber fand keine nützliche Information.

Antwort

3

Suche auf Google nach "SO_RECVBUF Msdn" gab mir ...

http://msdn.microsoft.com/en-us/library/ms740476(VS.85).aspx

, die beantworten Ihre "sind sie pro Socket" mit diesen Zeilen aus der Option Tabelle:

SO_RCVBUF int Specifies the total per-socket buffer space reserved for receives. 
SO_SNDBUF int Specifies the total per-socket buffer space reserved for sends. 

Mit mehr Details später:

SO_RCVBUF and SO_SNDBUF 
When a Windows Sockets implementation supports the SO_RCVBUF and SO_SNDBUF options, an application can request different buffer sizes (larger or smaller). The call to setsockopt can succeed even when the implementation did not provide the whole amount requested. An application must call getsockopt with the same option to check the buffer size actually provided. 
49

Das Präfix "SO_" ist für " Socket-Option ", also ja, das sind pro-Socket-Einstellungen für die pro-Socket-Puffer. Es gibt in der Regel systemweite Standardwerte und Maximalwerte.

ist einfacher zu verstehen: Es ist die Größe des Puffers, den der Kernel zuweist, um die ankommenden Daten in dem gegebenen Socket während der Zeit zwischen dem Eintreffen über das Netzwerk und dem Lesen durch das Programm zu halten . Mit TCP, wenn Daten ankommen und Sie nicht lesen, wird der Puffer gefüllt, und der Absender wird aufgefordert, zu verlangsamen (mit TCP Fenster Anpassung). Sobald der Puffer voll ist, werden neue Pakete einfach verworfen.

SO_SNDBUF, denke ich, ist nur wichtig für TCP (in UDP, was auch immer Sie senden geht direkt an das Netzwerk). Bei TCP könnten Sie den Puffer entweder füllen, wenn die entfernte Seite nicht liest (so dass der entfernte Puffer voll wird, dann kommuniziert TCP diese Tatsache an Ihren Kernel, und Ihr Kernel hört auf, Daten zu senden, stattdessen sammelt er sie im lokalen Puffer Füllt auf). Oder es könnte sich füllen, wenn ein Netzwerkproblem vorliegt und der Kernel keine Bestätigungen für die von ihm gesendeten Daten erhält. Es verlangsamt dann das Senden von Daten im Netzwerk, bis schließlich der ausgehende Puffer voll ist. Wenn dies der Fall ist, werden zukünftige write() Aufrufe von der Anwendung an diesen Socket blockiert (oder geben EAGAIN zurück, wenn Sie die O_NONBLOCK Option festgelegt haben).

Dies alles ist am besten in der Unix Network Programming Buch beschrieben.

7

In Windows hat der Sendepuffer einen Effekt in UDP. Wenn Sie Pakete schneller als das Netzwerk übertragen, können Sie schließlich den Socket-Ausgabepuffer füllen, und SendTo schlägt mit "würde blockieren" fehl. Das Erhöhen von SO_SNDBUF wird dabei helfen. Ich musste sowohl die Sende- als auch die Empfangspuffer für einen Test erhöhen, den ich tat, um die maximale Paketrate zu finden, die ich zwischen einer Windows-Box und einer Linux-Box senden konnte.Ich könnte auch die Sendegröße behandelt haben, indem ich den Fehlercode "würde blockieren" entdeckt habe, ein wenig schlafen und es erneut versuchen würde. Das Aufpumpen der Sendepuffergröße war jedoch einfacher. Der Standard in Windows ist 8K, die in dieser Ära von PCs mit GBs RAM unnötig klein scheint!