该命令tcp receive buffer
以字节为单位显示大小。
$ cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 4001344
其中三个值分别表示最小值、默认值和最大值。
然后我试图找到tcp window size
using 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
是 MSS 大小的 10 倍。
谁能告诉我两者之间的关系。
TCP 窗口大小是网络上可以“传输”多少数据。TCP 接收缓冲区是接收端可以缓冲多少数据。
通常,如果 TCP 堆栈在其接收缓冲区中没有空间,则不允许发送数据。否则,如果在接收应用程序消耗缓冲区中的某些数据之前接收到数据,则数据将不得不被接收 TCP 堆栈丢弃。
但是接收缓冲区可以比窗口大得多。
使用您显示的设置 (14,600 / 87,380),此端将允许另一端发送 14,600 个字节。当它接收数据时,它会更新窗口以允许另一端发送 14,600 字节或 87,380 字节中的较小者,减去其接收缓冲区中等待的字节数。
rfc https://datatracker.ietf.org/doc/html/draft-ietf-tcpm-initcwnd-00中建议tcp的sender window应该是10个segments,这也导致receiver的initrwnd为是 10*MSS 以容纳前十个数据包。如果你看得更远,你会看到数据包中的 recwnd 随着接收方收到新数据包而增加。
tcp_rmem 的数量分别代表最小默认最大缓冲区大小。由于在 Linux 中需要更多空间来存储 TCP scoket 结构,因此只有 3/4 或 1/2 的 num 响应广告窗口大小。
您可以查看博客http://sandilands.info/sgordon/impact-of-bandwidth-delay-product-on-tcp-throughput及其评论以获取更多信息。