Настройка окна приема TCP в C и работа с tcpdump в Linux

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

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

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

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

любой вклад оцененный.

3 ответов


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


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


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

recv(носок, buf, rwnd, 0);

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