Я смотрю на это и не думаю, что 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
? Это мне неясно.