Как SO_RCVBUF может быть меньше, чем окно приема TCP? (Windows XP) - PullRequest
2 голосов
/ 16 апреля 2010

У меня есть приложение, использующее TCP на Windows XP. Когда я вызываю getsockopt с параметром SO_RCVBUF, он сообщает 8192 байта. Тем не менее, Wireshark показывает приложение, рекламирующее приемный буфер 64K. Как это возможно? Чтобы иметь окно приема 64K, не нужно ли ему буфер 64K? Есть два разных буфера?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

Я смотрю на это и не думаю, что SO_RCVBUF и окно TCP - это одно и то же.

Если вы посмотрите на http://msdn.microsoft.com/en-us/magazine/cc302334.aspx раздел «Архитектура сокетов Windows NT и Windows 2000» , вы увидите, что драйвер сокета ядра Windows Afd.sys находится поверх транспортных протоколов. Он имеет собственные буферы socket SND / RCV, которые задаются в параметрах сокета SO_SNDBUF, SO_RCVBUF или с помощью ключей реестра Afd. Тогда у транспортного протокола TCP есть свой собственный буфер окна TCP, с которым все знакомы, и он задается либо в параметрах Tcpip реестра, либо определяется автоматически , учитывая, среди прочего, SO_RCVBUF , который, я думаю, находится там путаница исходит из. http://msdn.microsoft.com/en-us/library/ms819736.aspx

Таким образом, я считаю, что данные считываются из транспортного уровня в буфер сокета afd.sys SO_RCVBUF по мере необходимости, когда они ожидают, чтобы их считывало приложение. Вы бы хотели, чтобы SO_RCVBUF был по крайней мере таким же большим, как данные, которые вы надеетесь прочитать сразу.

Однако я не знаю, как будут взаимодействовать окна SO_RCVBUF и TCP. Будет ли TCP ожидать ACK-данных, пока они не будут считаны в SO_RCVBUF? Это мне неясно.

0 голосов
/ 16 апреля 2010

Вы сами устанавливаете размер окна? Убедитесь, что вы делаете это до connect(2) или accept(2). Но опять же окна могут быть особенными в этом отношении, проверьте msdn .

...