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:MMSの受信について知りたい
- 広告主:?
- 適用制限:?
- 忙しい:?
- 再送:?
- dsack_dups:セグメントが重複していますか?
- minrtt:ソケットから最小RTTに達しましたか?
答え1
これらのフィールドのいくつかの意味は、ソースコードから推論することができます。
春夏シーズンそして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 <[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);
Linuxでは、include/uapi/linux/tcp.h
次のように言います。
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ブロックローカルホストに報告された冗長セグメントの数。
答え2
MSSは通常、最大セグメントサイズを表します。
rcvmss
:同僚に許可できる最大セグメントサイズを通知します。
advmss
:最大セグメントサイズを広告します。
app_limited
: 要求または応答のアプリケーション制限を介して TCP トラフィックを制限します。
busy
:TCP接続が使用されていますか? ?
retrans
:再送タイマー。タイマーが期限切れになる前にパケット送信者がackを受信しなかった場合は、パケットの再送信を試みます。
dsack_dups
: オプションの確認の繰り返し
minrtt
: 最小往復時間、データパケットが送信元から宛先まで移動する最短時間
内容に誤りがある場合はお知らせください。修正いたします。