Подтвердить что ты не робот

Что такое SO_SNDBUF и SO_RECVBUF

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

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

Какова их роль (обычно)?

Являются ли они для буферов сокетов?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Все это лучше всего описано в Unix Network Programming.

Ответ 2

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

Ответ 3

Поиск 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 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.