Вопрос

Я использую Linux с версией 2.6.9-55.ELsmp, x86_64.

Я пытаюсь установить окно приема TCP, используя функцию setockopt(), используя C.Я пробую следующее:

rwnd = 1024;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rwnd, sizeof(rwnd));

Приведенный выше сегмент кода находится в клиентской программе, которая получает данные с сервера.Когда я запускаю программу для получения и просмотра вывода tcpdump, я наблюдаю согласование окна следующим образом:

11:34:40.257755 IP clientReceiver.42464 > serverSender.8991: 
S 1742042788:1742042788(0) win 5840 
<mss 1460,sackOK,timestamp 1688222886 0,nop,wscale 2>

Мы видим, что клиентская программа на самом деле согласовывает окно, отличное от того, которое я установил в клиентской программе.Однако, судя по тому, как я могу интерпретировать текст Стивена («TCP/IP Illustrated, Volume 1»), раздел 20.4, я полагаю, что вы влияете на то, на что он ссылается во второй блочной цитате в разделе 20.4, используя используемый мной вызов setockopt() (см. выше). ).

Я хотел бы понять, где я ошибся.

Возможно, моя интерпретация того, что говорит Стивенс, неверна.В таком случае, не могли бы вы указать мне правильный способ установки размера буфера приема?В доказательство моего замешательства я ссылаюсь на справочную страницу TCP-сокетов Linux по адресу: http://linux.die.net/man/7/tcp (см. комментарий к SO_RCFBUF).

Чего мне не хватает в этой истории?Как мне контролировать размер буфера приема (и отображать его в выводе tcpdump)?Обратите внимание: здесь я имею в виду настройку параметра сокета SO_RCFBUF — я понимаю, что это то, что отображается при согласовании окна в SYN.

Любой вклад приветствуется.

Это было полезно?

Решение

Вам также необходимо использовать TCP_WINDOW_CLAMP

rcvbuf = 2048;
setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)& rcvbuf, sizeof(rcvbuf));
clamp = 1024;
setsockopt(sock, SOL_SOCKET, TCP_WINDOW_CLAMP, (char *)& clamp, sizeof(clamp));

Обратите внимание, что rcvbuf в два раза превышает ограничение, оно может быть больше.Вы можете позволить ему выполнить автонастройку, оконный зажим все равно будет работать.Это не портативно.

Другие советы

Размер приемного буфера можно уменьшить только до подключения сокета — увеличить его можно в любой момент.В каком порядке вы вызываете sockopt() относительно подключения()?

Для TCP значение rwnd должно передаваться во время приема.

Recv(sock, buf, rwnd, 0);

Это должно получить 1024 байта.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top