Tcp
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?
其中一些欄位的含義可以從 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.h
Linux中沒有記錄那個:struct tcp_info { (...) __u8 tcpi_delivery_rate_app_limited:1;
但令人驚訝的是,我們可以在介紹它的送出中找到一些資訊:
commit eb8329e0a04db0061f714f033b4454326ba147f4 Author: Yuchung Cheng <ycheng@google.com> 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.h
Linux中它說: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.h
Linux 中:struct tcp_info { (...) __u32 tcpi_dsack_dups; /* RFC4898 tcpEStatsStackDSACKDups */
在https://www.ietf.org/rfc/rfc4898.txt:
D-SACK 塊向本地主機報告的重複段數。