網路狀態檢測的利器 - ss命令
ss命令,它是 socket statistic的縮寫,用於統計Linux系統中socket連線相關的資訊,和其他的工具相比,ss命令可以顯示更多關於 TCP和狀態相關的資訊
語法
ss [ OPTIONS ]
在Linux系統中,預設已經安裝了 ss 命令,下面介紹該命令常用的一些功能
ss 和 netstat 命令
netstat 命令和 ss 命令比較類似,主要功能也是統計系統中socket相關資訊,和 netstat相比,ss 命令在跟蹤TCP連線和套接字方面速度更快,功能更強大,下面是 ss 和 netstat 統計速度的對比
[cgyx@cghost35 ~]$ time ss -a | wc -l
439
real 0m0.014s
user 0m0.004s
sys 0m0.010s
[cgyx@cghost35 ~]$ time netstat -a | wc -l
366
real 0m0.029s
user 0m0.005s
sys 0m0.008s
從上面例子可以看出,ss 統計439條socket資訊花費了0.014s, netstat 統計366條socket資訊花費了0.029s,ss 統計資訊的速度更快,所以實際使用中一般都是用 ss 替代 netstat
顯示套接字摘要
列出當前已經連線、關閉、等待的TCP連線,當系統中已經存在大量的套接字連線的時候,通過檢視套接字摘要資訊可以快速瞭解系統中套接字的總體情況
[root@ecs-centos-7 ~]# ss -s
Total: 185 (kernel 264)
TCP: 7 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0
Transport Total IP IPv6
* 264 - -
RAW 0 0 0
UDP 7 4 3
TCP 7 4 3
INET 14 8 6
FRAG 0 0 0
顯示網路連線
當不使用任何選項時,ss將顯示已建立連線的處於非監聽狀態的套接字列表,由於原始結果太長,下面的例子只擷取了一部分
[root@ecs-centos-7 ~]# ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
u_str ESTAB 0 0 /run/dbus/system_bus_socket 12050 * 11962
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:ssm-cssps
tcp ESTAB 0 4200 192.168.0.9:ssh 27.38.240.56:rsmtp
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.56:pearldoc-xact
上面例子中列說明:
- Netid
socket型別,在上面的例子中,有 TCP、u_str(unix流)等套接字
- State
套接字處於什麼狀態,下面是TCP套接字的所有狀態及說明, 實際上就是TCP的三次握手和四次揮手的所有狀態
LISTEN: 服務端偵聽套接字等待客戶端的連線
SYN-SENT: 客戶端已傳送套接字連線請求報文,等待連線被伺服器接收
SYN-RECEIVED: 伺服器端接收連線請求報文後,等待客戶端的確認連線的回覆報文
ESTABLISHED: 服務端和客戶端之間成功建立了一條有效的連線,可以互相傳輸資料
FIN-WAIT-1: 伺服器或客戶端呼叫close函式主動向對方發出終止連線的請求報文,同時等待對方確認終止連線的回覆報文
FIN-WAIT-2: 主動關閉連線端收到對方確認終止連線的回覆報文,同時等待對方連線終止的請求報文,這時的狀態是TCP連線的半關閉狀態,可以接受資料,但是不能傳送資料
CLOSE-WAIT: 被動關閉端收到主動關閉端終止連線的請求報文後,向主動關閉端傳送確認終止連線的回覆報文,同時被動關閉端等待本地使用者終止連線,這時被動關閉端的狀態是TCP連線的半關閉狀態,可以傳送資料,但是不能接收資料
CLOSING: 伺服器和客戶端同時向對方傳送終止連線(呼叫close函式)請求報文,並且雙方都是在收到對方傳送的終止連線回復報文之前收到了對方的傳送的終止連線請求報文,這個時候雙方都進入了CLOSING狀態,進入CLOSING狀態之後,只要收到了對方對自己終止連線的回覆報文,就會進入TIME-WAIT狀態,所以CLOSING狀態的持續時間會特別短,一般很難捕獲到
LAST-ACK: 被動關閉端傳送完全部資料之後,向主動關閉端傳送終止連線的請求報文,等待主動關閉端傳送終止連線的回覆報文
TIME-WAIT: 主動關閉端收到被動關閉端終止連線的請求報文後,給被動關閉端傳送終止連線的回覆報文,等待足夠時間以確保被動關閉端收到了主動關閉段傳送的終止連線的回覆報文
CLOSED: 完全沒有連線,套接字連線已經終止了
- Recv-Q
在 ESTAB 狀態下,表示核心中還有多少位元組的資料沒有被上層應用讀取,如果這裡數值很大,應用程式可能發生了阻塞
- Send-Q
在 ESTAB 狀態下,表示核心傳送佇列中還有多少位元組的資料沒有收到確認的ACK,如果這個數值很大,表明接收端的接收以及處理需要加強
- Local Address:Port
本地地址和埠
- Peer Address:Port
遠端地址和埠
顯示偵聽狀態的套接字
使用 -l
選項可以列出所有處於偵聽(LISTEN)狀態的套接字
[root@ecs-centos-7 ~]# ss -l
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 100 127.0.0.1:smtp *:*
tcp LISTEN 0 128 *:ssh *:*
tcp LISTEN 0 100 [::1]:smtp [::]:*
tcp LISTEN 0 254 [::]:mysql [::]:*
tcp LISTEN 0 128 [::]:ssh [::]:*
顯示所有的套接字
使用 -a
選項可以列出所有的狀態的套接字,由於所有的套接字列表太多,下面的例子中只列出了少許的資料
[root@ecs-centos-7 ~]# ss -a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 100 127.0.0.1:smtp *:*
tcp LISTEN 0 128 *:ssh *:*
tcp ESTAB 0 16644 192.168.0.9:ssh 27.38.240.99:21669
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdev
tcp LISTEN 0 100 [::1]:smtp [::]:*
tcp LISTEN 0 254 [::]:mysql [::]:*
tcp LISTEN 0 128 [::]:ssh [::]:*
根據協議型別顯示
可以通過 TCP、UDP、Unix、Raw、IPV4、IPV6 這些協議型別顯示套接字,下面以常用的TCP/UDP/IPV4協議舉例說明
ss -ua : 顯示Unix套接字
ss -wa : 顯示Raw套接字
ss -6a : 顯示IPV6套接字
- TCP套接字
使用 -t
選項(TCP), 讓結果只列出TCP套接字
[root@ecs-centos-7 ~]# ss -a -t
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 100 127.0.0.1:smtp *:*
LISTEN 0 128 *:ssh *:*
ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21787
ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21669
ESTAB 0 0 192.168.0.9:ssh 27.38.240.103:kyoceranetdev
LISTEN 0 100 [::1]:smtp [::]:*
LISTEN 0 254 [::]:mysql [::]:*
LISTEN 0 128 [::]:ssh [::]:*
- UDP套接字
使用 -u
選項(UCP), 讓結果只列出UCP套接字
[root@ecs-centos-7 ~]# ss -a -u
State Recv-Q Send-Q Local Address:Port Peer Address:Port
UNCONN 0 0 *:bootpc *:*
UNCONN 0 0 192.168.0.9:ntp *:*
UNCONN 0 0 127.0.0.1:ntp *:*
UNCONN 0 0 *:ntp *:*
UNCONN 0 0 [fe80::f816:3eff:fee0:4fb8]%eth0:ntp [::]:*
UNCONN 0 0 [::1]:ntp [::]:*
UNCONN 0 0 [::]:ntp [::]:*
- ipv4 套接字
使用 -4
選項(IPV4), 讓結果只列出IPV4的套接字
[root@ecs-centos-7 ~]# ss -4a
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 *:bootpc *:*
udp UNCONN 0 0 192.168.0.9:ntp *:*
udp UNCONN 0 0 127.0.0.1:ntp *:*
udp UNCONN 0 0 *:ntp *:*
tcp LISTEN 0 100 127.0.0.1:smtp *:*
tcp LISTEN 0 128 *:ssh *:*
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787
識別程式名字
有時我們查詢到指定的套接字了,但是無法知道套接字是哪個應用程式在使用,這時可以使用 -p
選項
[root@ecs-centos-7 ~]# ss -a -t -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 254 [::]:mysql [::]:*
上面的例子中,從Local Address:Port
列可以知道,這個套接字時mysql在使用,如果沒有加 -p
選項的話,這裡顯示的時mysql的埠號3306
通過埠和程式名篩選
有時候我們啟動應用程式的時候,發現埠已經被佔用了,此時先要查詢出佔用目標埠的應用程式,然後關閉它,再啟動我們自己的應用程式
- 通過埠篩選
[root@ecs-centos-7 ~]# ss -ap sport eq 3306
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 254 [::]:mysql [::]:*
上面的例子中,sport 表示源,對應的 dport 表示目標,命令查詢埠3306是被哪個程式使用了,最終發現3306是mysql在使用
通過埠篩選還支援小於、大於、小於等於、大於等於、不等於,具體的說明如下:
ss -ap sport le 3306 : 篩選出源埠小於等於3306的套接字
ss -ap sport lt 3306 :篩選出源埠小於3306的套接字
ss -ap sport ge 3306 : 篩選出源埠大於等於3306的套接字
ss -ap sport gt 3306 : 篩選出源埠大於3306的套接字
ss -ap sport ne 3306 : 篩選出源埠不等於3306的套接字
- 通過程式名篩選
[root@ecs-centos-7 ~]# ss -an sport eq mysql
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp LISTEN 0 254 [::]:3306 [::]:*
上面的例子中篩選出程式名為mysql
的套接字, 執行的命令中 -n
選項是不解析服務名字,加了此選項就顯示成埠了,不會解析成服務名稱了
通過IP地址篩選
- 通過目標地址篩選
下面例子是篩選出目標IP地址為27.38.240.99的套接字,dst 是目標地址
[root@ecs-centos-7 ~]# ss -a dst 27.38.240.99
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:22810
- 通過源地址篩選
下面例子是篩選出源IP地址為192.168.0.99的套接字,src 是源地址
[root@ecs-centos-7 ~]# ss -a src 192.168.0.9
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
udp UNCONN 0 0 192.168.0.9:ntp *:*
tcp ESTAB 0 52 192.168.0.9:ssh 27.38.240.99:21907
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:21787
tcp ESTAB 0 0 192.168.0.9:ssh 27.38.240.99:23260
相關文章
- 檢測網路狀態
- 檢測網路狀態 - flutterFlutter
- iOS 檢測網路狀態iOS
- ss命令檢視網路狀態引數選項有哪些?linux運維Linux運維
- 模擬網路狀態的利器TC
- Android檢測網路狀態,判斷當前網路是否可用Android
- 使用常見的網路命令檢視當前網路狀態——Mac OS X篇Mac
- 2.檢查網路狀態
- Linux中系統狀態檢測命令Linux
- 網路狀態的檢查和MJRefresh
- SCNetworkReachabilityRef監測網路狀態
- Linux下用netstat檢視網路狀態、埠狀態Linux
- Linux 檢視網路連線狀態Linux
- ss:檢視網路連線的另一種方法
- 檢測mysql狀態的指令碼MySql指令碼
- Linux網路檢測相關工具用法(ping/netstat/ss/ethtool)Linux
- Vuex——Vue的狀態管理利器Vue
- RAC常見命令檢查狀態
- linux檢查埠狀態命令Linux
- 使用AFNetworking進行網路狀態的監測
- 網路連線狀態檢視工具:Internet Status for MacMac
- Internet Status Mac網路連線狀態檢視工具Mac
- 在Linux中,如何檢視網路介面的狀態?Linux
- 查詢網路狀態
- Android 檢查網路連線狀態的程式碼實現Android
- Linux基礎命令---netstat顯示網路狀態Linux
- Android之監測手機網路狀態的廣播Android
- Goalng使用ping命令檢測網路是否連通,分析網路故障Go
- Mac網路連線狀態檢視工具:Internet Status for MacMac
- Win10如何使用ipconfig檢視網路狀態Win10
- iOS判斷網路狀態iOS
- 使用sestatus命令來檢視SELinux的當前狀態Linux
- 網路安全netstat監聽網路狀態。
- java檢測當前CPU負載狀態的方法Java負載
- python requests檢測響應狀態碼Python
- haproxy狀態檢測指令碼(完成高可用)指令碼
- 時延檢測利器-uftrace
- 研究者通過社交網路狀態更新預測自殺