Что такое SO_SNDBUF и SO_RECVBUF - PullRequest
       27

Что такое SO_SNDBUF и SO_RECVBUF

24 голосов
/ 23 ноября 2010

Можете ли вы объяснить мне, что именно варианты SO_SNDBUF и SO_RECVBUF?

ОК, по какой-то причине ОС буферизирует исходящие / поступающие данные, но я бы хотел уточнить эту тему.

Какова их роль (вообще)?

Это буферы для сокетов?

Есть ли связь между буферами транспортного уровня (например, буфером TCP) и этими буферами?

Имеют ли они другое поведение / роль при использовании потоковых сокетов (TCP) и при использовании сокетов без установления соединения (UDP)?

Хорошая статья тоже будет отличной.

Я гуглил, но не нашел никакой полезной информации.

Ответы [ 3 ]

57 голосов
/ 18 декабря 2010

Префикс «SO_» предназначен для «опции сокета», так что да, это настройки для каждого сокета для буферов для каждого сокета. Обычно существуют общесистемные значения по умолчанию и максимальные значения.

SO_RCVBUF проще для понимания: это размер буфера, который ядро ​​выделяет для хранения данных, поступающих в данный сокет в течение времени между тем, когда они поступают по сети и когда они читаются программой, которая владеет этим разъем. В случае TCP, если данные поступают, а вы их не читаете, буфер заполнится, и отправителю будет приказано замедлить работу (используя механизм настройки окна TCP). Для UDP, когда буфер заполнен, новые пакеты просто отбрасываются.

SO_SNDBUF, я думаю, имеет значение только для TCP (в UDP все, что вы отправляете, отправляется напрямую в сеть). Для TCP вы можете заполнить буфер либо, если удаленная сторона не читает (так что удаленный буфер переполняется, тогда TCP сообщает об этом факте вашему ядру, и ваше ядро ​​прекращает отправку данных, вместо этого накапливая их в локальном буфере до тех пор, пока заполняет). Или он может заполниться, если возникнет проблема с сетью, и ядро ​​не получит подтверждения для отправляемых данных. Затем он будет замедлять отправку данных по сети, пока, в конце концов, исходящий буфер не заполнится. Если это так, будущие write() вызовы этого сокета приложением будут блокироваться (или возвращать EAGAIN, если вы установили опцию O_NONBLOCK).

Все это лучше всего описано в Сетевом программировании Unix .

8 голосов
/ 16 июля 2013

В Windows буфер отправки оказывает влияние на UDP. Если вы отправляете пакеты быстрее, чем сеть может их передать, в конечном итоге вы заполните буфер вывода сокета, и SendTo завершится с ошибкой «будет блокироваться». Увеличение SO_SNDBUF поможет в этом. Мне пришлось увеличить буферы отправки и получения для теста, который я проводил, чтобы найти максимальную скорость передачи пакетов между коробкой Windows и Linux. Я мог бы также обработать размер отправки, обнаружив код ошибки «будет блокировать», немного поспав и повторив попытку. Но накачать размер буфера отправки было проще. В Windows по умолчанию установлено значение 8 КБ, что кажется слишком малым в эпоху компьютеров с ГБ ОЗУ!

4 голосов
/ 23 ноября 2010

Поиск в Google по запросу "SO_RECVBUF msdn" дал мне ...

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

, который отвечает на ваши "они на сокет" с этими строками из таблицы параметров:

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.

Более подробно позже:

SO_RCVBUF и SO_SNDBUF

Когда реализация Windows Sockets поддерживает SO_RCVBUF и Опции SO_SNDBUF, приложение может запрашивать буферы разных размеров (больше или меньше). Вызов setsockopt может быть успешным, даже если реализация не предоставила всю запрашиваемую сумму. приложение должно вызвать getsockopt с той же опцией, чтобы проверить размер буфера фактически предоставлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...