`ss -D`的格式规范是什么?

est*_*est 5 kernel tcp iproute

问题背景:我试图总结总带宽,但ss -i巧妙地将数字转换为更易读的格式,如 Kbps/s 或 Mbps/s,这是不准确的。所以确实ss -o有定时器。我查看了源代码,发现转换是硬编码的。所以我需要来自某个地方的原始数字。

从 man ss

-D FILE
Do not display anything, just dump raw information about TCP sockets to FILE after applying filters. If FILE is - stdout is used.
Run Code Online (Sandbox Code Playgroud)

我没有看到任何地方记录的格式。此外,这个原始转储在很大程度上取决于我认为的内核。

cns*_*nst 1

根据 Linux 系统上的手册页,ss(8)它是“另一个调查套接字的实用程序”;它是 Linux 特定的,是 的一部分iproute,但在概念上似乎与更主流的netstat.

这是以下示例的输出ss -i:

# ss -i | head
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
ESTAB      0      0         173.xxx.xxx.xxx:46780         72.21.203.xx:www
         cubic wscale:6,7 rto:276 rtt:76/38 cwnd:10 send 1.5Mbps rcv_space:14600
ESTAB      0      0         173.xxx.xxx.xxx:35674        208.71.121.xx:www
         cubic rto:272 rtt:72/36 cwnd:10 send 1.6Mbps rcv_space:14600
ESTAB      0      0         173.xxx.xxx.xxx:33496       198.252.206.xx:https
         cubic wscale:9,7 rto:274 rtt:74.875/2.25 ato:40 cwnd:10 send 1.5Mbps rcv_rtt:524913 rcv_space:29456
ESTAB      0      0         173.xxx.xxx.xxx:49605       205.251.242.xx:www
         cubic wscale:6,7 rto:282 rtt:82.625/37.5 cwnd:10 send 1.4Mbps rcv_space:14600
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,有关接收和发送队列的信息是可用的,就像 一样netstat,但ss更进一步,还提供了附加信息,所有这些似乎都围绕TCP 窗口缩放和套接字缓冲区大小的概念,并围绕带宽延迟积的概念。

因此,您所说的带宽很可能是通过发送缓冲区大小除以 rtt(往返时间)来计算的。任何这样的计算必然是非常粗略、不精确和可变的,因此,当您看到像 之类的值时1.6Mbps,知道更多的小数点没有多大意义,因为整个数字首先只是一个移动目标。