Назад | Перейти на главную страницу

Разница между tcp recv-буфером и размером окна tcp-приема?

Команда показывает tcp receive buffer размер в байтах.

$ cat /proc/sys/net/ipv4/tcp_rmem 
4096    87380   4001344

где три значения означают минимальное, значение по умолчанию и максимальное значения соответственно.

Затем я попытался найти tcp window size с помощью команды tcpdump.

 $ sudo tcpdump -n -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn and port 80 and host google.com' 
 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
 listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
 16:15:41.465037 IP 172.16.31.141.51614 > 74.125.236.73.80: Flags [S], seq 3661804272,  win  14600, options [mss 1460,sackOK,TS val 4452053 ecr 0,nop,wscale 6], length 0

У меня размер окна должен быть 14600 что в 10 раз превышает размер MSS.

Кто-нибудь может рассказать мне об отношениях между ними.

Размер окна TCP - это объем данных, который может «лететь» в сети. Буфер приема TCP определяет, сколько данных может быть помещено в буфер на стороне получателя.

Обычно стек TCP не разрешает отправку данных, если для них нет места в приемном буфере. В противном случае, если данные получены до того, как принимающее приложение потребляет часть данных в буфере, данные должны быть отброшены принимающим стеком TCP.

Но буфер приема может быть намного больше окна.

При показанных вами настройках (14 600/87 380) этот конец позволит другому концу отправить 14 600 байт. По мере получения данных он обновляет окно, чтобы позволить другому концу отправить меньшее из 14 600 байтов или 87 380 байтов минус количество байтов, ожидающих в его приемном буфере.

Рекомендуется в рфк http://tools.ietf.org/html/draft-ietf-tcpm-initcwnd-00 что окно отправителя tcp должно быть 10 сегментов, что также приводит к тому, что initrwnd получателя будет 10 * MSS для размещения этих первых десяти пакетов. Если вы посмотрите дальше, вы увидите, что recwnd в пакете увеличивается по мере того, как получатель получает новые пакеты.

Количество tcp_rmem представляет минимальный максимальный размер буфера по умолчанию для каждого. Поскольку в Linux требуется больше места для хранения структуры TCP scoket, только 3/4 или 1/2 числа отвечают объявленному размеру окна.

Вы можете пойти и посмотреть блог http://sandilands.info/sgordon/impact-of-bandwidth-delay-product-on-tcp-throughput и его комментарии для получения дополнительной информации.