tcp 接收缓冲区和 tcp 接收窗口大小之间的区别?

tcp 接收缓冲区和 tcp 接收窗口大小之间的区别?

该命令显示tcp receive buffer以字节为单位的大小。

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

其中三个值分别表示最小值、默认值和最大值。

然后我尝试使用 tcpdump 命令进行查找tcp window size

 $ 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

我得到的窗口大小是14600MSS 大小的 10 倍。

谁能告诉我这两者之间的关系?

答案1

TCP 窗口大小是指网络上可以“传输”的数据量。TCP 接收缓冲区是指接收方可以缓冲的数据量。

通常,如果 TCP 堆栈的接收缓冲区中没有空间,则不会允许发送数据。否则,如果在接收应用程序使用缓冲区中的部分数据之前接收到数据,则接收 TCP 堆栈必须丢弃该数据。

但接收缓冲区可能比窗口大得多。

使用您显示的设置 (14,600 / 87,380),此端将允许另一端发送 14,600 字节。当它接收数据时,它将更新窗口以允许另一端发送 14,600 字节或 87,380 字节中的较小者减去其接收缓冲区中等待的字节数。

答案2

rfc 中建议https://datatracker.ietf.org/doc/html/draft-ietf-tcpm-initcwnd-00tcp 的发送方窗口应该是 10 个段,这也导致接收方的 initrwnd 为 10*MSS,以容纳前 10 个数据包。如果进一步观察,您将看到随着接收方获得新数据包,数据包中的 recwnd 会增加。

tcp_rmem 的数量代表每个缓冲区的最小默认最大大小。由于 Linux 需要更多空间来存储 TCP scoket 结构,因此只有 3/4 或 1/2 的数量与公布的窗口大小相对应。

你可以去看看博客http://sandilands.info/sgordon/impact-of-bandwidth-delay-product-on-tcp-throughput及其评论以供进一步了解。

相关内容