如何查看 tcp 发送和接收缓冲区的实际大小?

如何查看 tcp 发送和接收缓冲区的实际大小?

我们在 Debian 系统上,并尝试根据我们的需求调整 tcp/ip 堆栈。我们都知道,你可以使用一些内核参数设置最大 tcp 缓冲区大小,如下所示:

  net.ipv4.tcp_wmem = 4096  16384   4194304
  net.ipv4.udp_wmem_min = 4096
  net.core.wmem_max = 261071

要计算您需要的最大缓冲区大小,您“只”需要计算它。(参见http://fasterdata.es.net/TCP-tuning/

但由于我们不知道用户的往返时间,因此很难确定。假设在 20 到 60 毫秒之间是可以的。但对于移动网络,这个时间大约是 100-300 毫秒(用我的手机测试过)。因此很难知道有多少数据可能“在线”。

我们希望看到实际的缓冲区大小及其利用率。

有人知道如何潜入实际的 TCP 写入和接收缓冲区吗?

答案1

直接回答这个问题:运行ss -im dst destination.ipv4.address.here并检查skmem rb值(完整接收缓冲区大小)和rcv_space值(接收窗口)。应用程序缓冲区大小为skmem rb - rcv_space

现在更深入地讲:

接收或发送 TCP 套接字缓冲区由 TCP 窗口的数据和“应用程序”数据缓冲区组成。默认情况下,两者都可以自动缩放,并受tcp_wmem/中的最新值限制tcp_rmem

应用程序缓冲区默认占用整个缓冲区的 ¼,其余 ¾ 用于窗口数据。此分割由值控制tcp_adv_win_scale,默认为 2。如果将其设置为 1,则缓冲区将占用整个缓冲区的一半。

答案2

但由于我们不知道用户的往返时间

那么尝试测量等式的另一部分有什么意义呢?

(阅读 lsof(-T 标志)和 netstat 的手册页)。

但相信我,TCP 系统非常智能 - 编写它的人比你和我都聪明 - 并且对这些东西了解很多。唯一需要担心的是窗口缩放(这些天应该默认禁用)但除非您通过非常高速的 WAN 传输非常大的文件,否则您可能不需要它 - 如果文件不是很大,或者带宽很低,那么使用默认比例没有任何好处。

答案3

正如他们所说,做这样的事情是没有用的。也许有用如果你有一个有线与网络交通繁忙,但即使这样也不建议。你可以做的是定义另一个 tcp 实现(Vegas、Tahoe、Reno 等都是一些实施案例)。

他们每个人都专注于改进 TCP 的某些方面。例如,一个试图改善延迟,另一个试图引入抖动等。

相关内容