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

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

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

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

然后我试着用tcpdump命令findtcp 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 

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

任何人都可以告诉我两者之间的关系。

TCP窗口大小是networking上有多less数据可以“在线”。 TCP接收缓冲区是在接收方的末端可以缓冲多less数据。

通常情况下,如果在接收缓冲区中没有空间,TCP堆栈将不允许发送数据。 否则,如果在接收应用程序使用缓冲区中的某些数据之前接收到数据,则数据将不得不由接收TCP堆栈丢弃。

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

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

在rfc http://tools.ietf.org/html/draft-ietf-tcpm-initcwnd-00中build议tcp的发送者窗口应该是10个段,这也导致接收者的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及其评论以获取更多信息。