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

pra*_*tri 9 linux tcp

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

$ cat /proc/sys/net/ipv4/tcp_rmem 
4096    87380   4001344
Run Code Online (Sandbox Code Playgroud)

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

然后我试图找到tcp window sizeusing 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
Run Code Online (Sandbox Code Playgroud)

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

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

Dav*_*rtz 9

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

通常,如果 TCP 堆栈在其接收缓冲区中没有空间容纳数据,则它不允许发送数据。否则,如果在接收应用程序使用缓冲区中的一些数据之前接收到数据,则数据将不得不被接收 TCP 堆栈丢弃。

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

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

  • @David 飞行中数据的目的不是避免缓冲区溢出,而是处理通信通道引入的延迟。适应通信通道的带宽和延迟是一个问题,适应应用程序的读取行为是另一个问题。 (2认同)