ss
命令作為 iproute2
軟件包的一部分,是Socket Statistics的縮寫,也稱為IPC(Inter-process Communication)套接字統計
ss命令用于顯示sockets(套接字)的狀態。與netstat類似,但它通常提供更詳細的統計信息和更快的性能。但ss更高效因為它直接利用了內核的TCP連接跟蹤狀態信息(通過tcp_diag)模塊,并且提供了更豐富和詳細的網絡連接狀態視圖。ss
?命令的輸出可以與?grep
,?awk
,?sort
?等命令結合使用,進行更復雜的數據處理和過濾。
ss:基本語法
ss [選項] [過濾器]
常見命令選項?
用法:ss [OPTIONS]
ss? ? ? ? [選項]? ? ? ?[過濾器]
-h、? ?--幫助此消息
-V、? --版本輸出版本信息
-n、或?--numeric
: --數字不解析服務名稱,(不進行 DNS 解析,直接顯示 IP 地址和端口號。)
-r、或?--resolve
: --解析主機名。嘗試解析 IP 地址到主機名和端口號到服務名。
-a、? --所有顯示所有插座
-l、? ?--監聽顯示監聽插座
-o、?或?--options
:??顯示計時器和套接字選項。
-e、 ?--extended
: --擴展顯示詳細的套接字信息 ,(顯示更多詳細信息,如套接字的標記、隊列長度等。)
-m、? --內存顯示套接字內存使用情況
-p、?或 ?--processes
:? ?--進程顯示使用套接字的進程。(顯示與套接字關聯的進程 ID 和名稱。)
-i、? ? --info顯示內部TCP信息
-s、? ?--summary顯示套接字使用情況摘要
-b、? ?--bpf顯示bpf篩選器套接字信息
-E、? --事件在套接字被破壞時不斷顯示套接字
-Z、??--上下文顯示進程SELinux安全上下文
-z、??--上下文顯示進程和套接字SELinux安全上下文
-N、 --net切換到指定的網絡命名空間名稱
-4,? --ipv4僅顯示IP版本4套接字
-6,? --ipv6僅顯示IP版本6套接字
-0, --數據包顯示packet套接字
-t、? --tcp僅顯示tcp套接字
-S、?--sctp僅顯示sctp套接字
-u、?--udp僅顯示udp套接字
-d、 --dccp僅顯示dccp套接字
-w、 --僅原始顯示raw套接字
-x、? --unix僅顯示unix域套接字
--vsock? 僅顯示vsock套接字
-f、 --family=family類型的family顯示插座
系列:={inet|inet6|link|unix|netlink|vsock|help}
-K、 --kill強制關閉套接字,顯示關閉的內容
-H、 --無標題取消標題行
?-A, --query=QUERY, --socket=QUERY
? ? ? ?QUERY := {all|inet|tcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|
-D、 --diag=FILE將有關TCP套接字的原始信息轉儲到FILE
-F、 --filter=FILE從FILE讀取篩選器信息
? ? ? ? FILTER:=[state state-FILTER][EXPRESSION]
? ? ? ? STATE-FILTER:={all|connected|synchronized|bucket|big|TCP-STATES}
? ? ? ? TCP-STATES:={已建立|已發送同步|已同步recv|fin-wait-{1,2}|時間等待|關閉|關閉等待|最后一次確認|偵聽|關閉}
? ? ? ? connected:={已建立|同步發送|同步recv | fin wait-{1,2}|時間等待|關閉等待|最后一次確認|關閉}
? ? ? ? synchronized:={已建立|syn-recv|fin-wait-{1,2}|時間等待|關閉等待|最后一次確認|關閉}
? ? ? ? bucket:={syn-recv | time wait}
??? ? ? big:={已建立|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listen|closed}
顯示所有套接字
ss
?或?ss -a
:顯示所有類型的套接字,包括監聽(Listening)和非監聽狀態的。
ss -a
?僅顯示監聽套接字
ss -l
:列出所有監聽狀態的套接字。
ss -l
?TCP 和 UDP 連接
ss -t
:顯示所有 TCP 連接。
ss -u
:顯示所有 UDP 連接。
ss -t
ss -u
結合選項?
ss -at
:顯示所有 TCP 連接(包括監聽和非監聽)。
ss -au
:顯示所有 UDP 連接。
ss -at
ss -au
?過濾與排序
- 可以通過?
-f
?或?--filter
?加上表達式來過濾輸出,比如?state established
?只顯示已建立的連接。 - 使用?
-o
?后可以加上列名對輸出進行排序,例如,-o state
?按照狀態排序。
要查看所有正在監聽的 TCP 連接
ss -lt
要查看所有 TCP 連接,并解析主機名和端口號
ss -ane
要查看所有連接,并顯示進程信息
ss -ap
輸出排序與限制
- 排序:使用?
-o
?或?--sort
?選項可以對輸出進行排序,例如按接收或發送的數據量排序。 - 限制輸出數量:使用?
-n
?(與?-t
,?-u
,?-x
?等結合) 限制輸出的條目數,如?ss -nt 10
?只顯示前10個TCP連接。
目標篩選
- 指定目標IP或端口:通過?
dst
?或?sport
、dport
?參數篩選特定目標或端口的連接,例如?ss dst 192.168.1.1
?或?ss sport = :80
。
統計與分析
- 統計信息:
-s
?或?--summary
?提供了關于各種協議(TCP, UDP, RAW, UNIX等)的統計信息,包括連接數、接收/發送字節數等。 - 計時器信息:使用?
-o
?選項可以顯示每個套接字的計時器信息,這有助于分析網絡延遲問題。
高級應用
- 與其它命令結合:
ss
?的輸出可以方便地與?grep
,?awk
,?sed
,?sort
?等命令結合使用,進行更復雜的過濾和數據分析。 - 實時監控:配合?
watch
?命令,如?watch -n 1 'ss -ant'
,可以實時查看網絡連接的變化情況,其中?-n 1
?表示每秒更新一次。
替代傳統命令
ss
?命令因其高效性和詳細信息,常被推薦作為?netstat
,?ifconfig
,?route
?等傳統網絡管理命令的替代品。它不僅提供更詳盡的TCP連接狀態,還支持現代協議如DCCP和SCTP。
?連接狀態篩選
狀態篩選:你可以根據連接的狀態來篩選輸出。例如,ss state ESTABLISHED
?會顯示所有已建立的連接。
ss state established
常見的狀態包括:SYN-SENT
,?SYN-RECV
,?ESTABLISHED
,?FIN-WAIT-1
,?FIN-WAIT-2
,?TIME-WAIT
,?CLOSED
,?CLOSE-WAIT
,?LAST-ACK
,?LISTEN
,?CLOSING
。
-
CLOSED:
- 這是TCP連接的初始狀態,表示沒有連接活動。
-
LISTEN:
- 服務器端socket處于此狀態,表示它正在監聽來自客戶端的連接請求。
-
SYN_SENT:
- 客戶端發起連接請求,發送SYN報文后進入此狀態,等待服務器響應。
-
SYN_RECEIVED:
- 服務器接收到客戶端的SYN報文后,會以SYN+ACK響應,并進入此狀態,等待客戶端的確認。
-
ESTABLISHED:
- 客戶端收到服務器的SYN+ACK后,回復ACK,連接建立成功,雙方進入此狀態,開始數據傳輸。
-
FIN_WAIT_1:
- 連接終止的第一步,主動關閉方發送FIN報文后進入此狀態,等待對方的FIN報文或ACK。
-
FIN_WAIT_2:
- 主動關閉方收到對方對FIN的ACK后,進入此狀態,等待對方的FIN報文。
-
CLOSE_WAIT:
- 被動關閉方收到FIN后,回應ACK并進入此狀態,此時連接還未完全關閉,等待應用程序關閉連接。
-
CLOSING:
- 雙方幾乎同時嘗試關閉連接,即雙方都發送了FIN且至少一端收到了ACK,但還沒收到對方的FIN。
-
LAST_ACK:
- 被動關閉方在發送完自己的FIN后,等待最后一個ACK到來的狀態。
-
TIME_WAIT:
- 主動關閉方在接收到對方的FIN并發送ACK后進入此狀態,等待足夠長的時間以確保所有分組在網絡中消失,防止延遲的數據包引起混淆。
-
CLOSED:
- 連接徹底關閉,回到初始狀態。
這些狀態反映了TCP連接建立(三次握手)和拆除(四次揮手)的整個過程,以及連接期間可能出現的其他情況,如一方請求關閉連接而另一方繼續處理數據等。
連接狀態篩選案例
1. 查看所有已建立的連接(ESTABLISHED)
1ss state established
這個命令會顯示所有TCP連接中狀態為“ESTABLISHED”的連接,即數據傳輸正在進行中的連接。
2. 查看監聽狀態的套接字(LISTEN)
1ss state listening
此命令會列出所有正在監聽并等待連接請求的套接字,這對于了解哪些服務正在運行并監聽端口非常有用。
3. 查找處于SYN_SENT狀態的連接
1ss state syn-sent
此命令顯示那些已發送SYN包但尚未收到SYN+ACK確認的連接,這可能意味著連接建立過程中出現了延遲或問題。
4. 查看TIME_WAIT狀態的連接
1ss state time-wait
TIME_WAIT狀態表示連接已經關閉,但是為了確保所有數據包都被正確接收,套接字在一段時間內保持打開。過多的TIME_WAIT狀態可能表明之前有很多連接被快速打開和關閉。
5. 查找CLOSE_WAIT狀態的連接
1ss state close-wait
CLOSE_WAIT狀態意味著本地端已經接收到對方的關閉連接請求,但還沒有完成關閉操作。長時間處于此狀態可能意味著程序未正確關閉連接。
6. 顯示所有狀態的連接,包括不常見狀態
1ss state all
此命令將顯示所有狀態的網絡連接,包括但不限于上述提到的狀態,有助于全面了解系統的網絡連接狀況。
7. 結合其他條件進行篩選
例如,查找特定IP的ESTABLISHED連接:
1ss state established dst 10.0.0.1
這會顯示所有與IP地址10.0.0.1之間已建立的TCP連接。