ss命令的详细输出

ss命令的详细输出

我想知道 ss 命令输出中某些项目的含义。例如:

# sudo   ss -iepn '( dport = :3443 )'

Netid      State      Recv-Q      Send-Q             Local Address:Port              Peer Address:Port      
tcp        ESTAB      0           0                  192.168.43.39:45486              190.0.2.1:443       users:(("rocketchat-desk",pid=28697,fd=80)) timer:(keepalive,11sec,0) uid:1000 ino:210510085 sk:16f1 <->
         ts sack cubic wscale:7,7 rto:573 rtt:126.827/104.434 ato:40 mss:1388 pmtu:1500 rcvmss:1388 advmss:1448 cwnd:10 bytes_sent:12904 bytes_retrans:385 bytes_acked:12520 bytes_received:13322 segs_out:433 segs_in:444 data_segs_out:215 data_segs_in:253 send 875.5Kbps lastsnd:18722 lastrcv:18723 lastack:18662 pacing_rate 1.8Mbps delivery_rate 298.1Kbps delivered:216 busy:16182ms retrans:0/10 dsack_dups:10 rcv_rtt:305 rcv_space:14480 rcv_ssthresh:6
CLOSE-WAIT      1           0                [2800:810:54a:7f0::1000]:37844                                     [2800:3f0:4002:803::200a]:443                    users:(("plasma-browser-",pid=16020,fd=175)) uid:1000 ino:90761 sk:1d -->
         ts sack cubic wscale:8,7 rto:222 rtt:21.504/5.045 ato:40 mss:1348 pmtu:1500 rcvmss:1208 advmss:1428 cwnd:10 bytes_sent:1470 bytes_acked:1471 bytes_received:11214 segs_out:20 segs_in:20 data_segs_out:8 data_segs_in:13 send 5014881bps lastsnd:96094169 lastrcv:96137280 lastack:96094142 pacing_rate 10029464bps delivery_rate 1363968bps delivered:9 app_limited busy:91ms rcv_space:14280 rcv_ssthresh:64108 minrtt:17.458

主要是 ss 手册页中缺少的项目,我做了一些猜测,如果我错了,请纠正我:

  • rcvmss:我想知道彩信接收
  • 广告主:?
  • 应用程序限制:?
  • 忙碌的: ?
  • 重传:?
  • dsack_dups:重复的段?
  • minrtt:套接字中达到的最小 RTT?

答案1

其中一些字段的含义可以从源代码中推断出来 SS和Linux内核。您看到的信息是由tcp_show_info() 中的函数打印的iproute2/misc/ss.c

广告管理系统:

ss.c

s.advmss     = info->tcpi_advmss;
(...)
    if (s->advmss)
        out(" advmss:%d", s->advmss);

linux/include/linux/tcp.h

u16 advmss;     /* Advertised MSS           */

应用程序限制:

ss.c

s.app_limited = info->tcpi_delivery_rate_app_limited;
(..)
if (s->app_limited)
   out(" app_limited");

linux/include/uapi/linux/tcp.hLinux 中没有记录这一点:

struct tcp_info {
(...)
    __u8    tcpi_delivery_rate_app_limited:1;

但令人惊讶的是我们可以在引入它的提交中找到一些信息:

commit eb8329e0a04db0061f714f033b4454326ba147f4
Author: Yuchung Cheng <[email protected]>
Date:   Mon Sep 19 23:39:16 2016 -0400

    tcp: export data delivery rate

    This commit export two new fields in struct tcp_info:

      tcpi_delivery_rate: The most recent goodput, as measured by
        tcp_rate_gen(). If the socket is limited by the sending
        application (e.g., no data to send), it reports the highest
        measurement instead of the most recent. The unit is bytes per
        second (like other rate fields in tcp_info).

      tcpi_delivery_rate_app_limited: A boolean indicating if the goodput
        was measured when the socket's throughput was limited by the
        sending application.

    This delivery rate information can be useful for applications that
    want to know the current throughput the TCP connection is seeing,
    e.g. adaptive bitrate video streaming. It can also be very useful for
    debugging or troubleshooting.

快速git blame确认ss.c是在添加到内核app_limited后添加的。tcpi_delivery_rate_app_limited

忙碌的:

ss.c

s.busy_time = info->tcpi_busy_time;
(..)
    if (s->busy_time) {
        out(" busy:%llums", s->busy_time / 1000);

include/uapi/linux/tcp.hLinux 中它说:

struct tcp_info {
(...)
    __u64   tcpi_busy_time;      /* Time (usec) busy sending data */

重传:

ss.c

s.retrans    = info->tcpi_retrans;
s.retrans_total  = info->tcpi_total_retrans;
(...)
    if (s->retrans || s->retrans_total)
        out(" retrans:%u/%u", s->retrans, s->retrans_total);

tcpi_total_retrans中没有描述linux/include/uapi/linux/tcp.h

struct tcp_info {
(...)
    __u32   tcpi_total_retrans;

但它用于tcp_get_info()

void tcp_get_info(struct sock *sk, struct tcp_info *info)
{
    const struct tcp_sock *tp = tcp_sk(sk); /* iff sk_type == SOCK_STREAM */
(...)
    info->tcpi_total_retrans = tp->total_retrans;

其中linux/include/linux/tcp.h写道:

struct tcp_sock {
(...)
    u32 total_retrans;  /* Total retransmits for entire connection */

tcpi_retrans也没有描述,但tcp_get_info() 再次阅读我们看到:

info->tcpi_retrans = tp->retrans_out;

并在linux/include/linux/tcp.h

struct tcp_sock {
(...)
    u32 retrans_out;    /* Retransmitted packets out        */

dsack_dups:

ss.c

s.dsack_dups = info->tcpi_dsack_dups;
(...)
    if (s->dsack_dups)
        out(" dsack_dups:%u", s->dsack_dups);

include/uapi/linux/tcp.hLinux中:

struct tcp_info {
(...)
__u32   tcpi_dsack_dups;     /* RFC4898 tcpEStatsStackDSACKDups */

并且在https://www.ietf.org/rfc/rfc4898.txt:

D-SACK 块向本地主​​机报告的重复段的数量。

答案2

MSS 通常代表最大段大小。

rcvmss:您让同行知道您可以接受的最大分段大小

advmss:通告最大段大小

app_limited:通过请求或响应中的应用程序限制来限制 TCP 流量

busy: TCP 连接正忙??

retrans:重传定时器。如果数据包的发送方在定时器超时之前没有收到ack,它将尝试重传数据包

dsack_dups:重复选择性确认

minrtt:最小往返时间,数据包从源到目的地的最短时间

如果其中有任何错误,请告诉我,我会纠正。

相关内容