Настройка окна получения TCP в C и работа с tcpdump в Linux - PullRequest
10 голосов
/ 08 февраля 2010

Я использую Linux-систему 2.6.9-55.ELsmp, x86_64.

Я пытаюсь установить окно получения TCP с помощью функции setsockopt () с помощью 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, том 1»), раздел 20.4, я полагаю, что вы выполняете то, на что он ссылается, во второй цитате блока в разделе 20.4, используя вызываемый мной метод setsockopt () (см. Выше ).

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

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

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

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

Ответы [ 3 ]

8 голосов
/ 09 февраля 2010

Вам также нужно использовать 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 в два раза больше зажима, он может быть больше. Вы можете позволить ему автонастройки, зажим окна все еще будет работать. Это не портативно.

4 голосов
/ 08 февраля 2010

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

0 голосов
/ 08 февраля 2010

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

recv (sock, buf, rwnd, 0);

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

...