-
功能介紹(參考 LINUX MAN命令 大家可以自己去看一下 這裏只是列出常用的部分說明)
顯示網絡連接狀態(如:LISTEN、ESTABLISHED、TIME_WAIT),路由地址,應用使用協議(如:TCP、UDP),IP和端口使用情況等其他網絡信息。 -
常用參數
–route , -r:顯示內核路由表
–all , -a:顯示所有套接字
-l, --listening:只顯示正在偵聽的套接字
–numeric , -n:顯示數字形式地址而不是去解析主機、端口或用戶名(注意 如果不使用這個參數的話 netstat命令的輸出回很慢 因爲它會把數字形式的地址通過網絡去解析主機、端口或用戶名然後再展示)
–groups , -g:顯示IPv4 和 IPv6的IGMP組播組成員關係信息
–interface=iface , -i: 顯示所有網絡接口列表或者是指定的 iface
–statistics , -s: 顯示每種協議的統計信息
-c, --continuous:將使 netstat 不斷地每秒輸出所選的信息
-p, --program:顯示套接字所屬進程的PID和名稱
–protocol=family , -A:指定要顯示哪些連接的地址族(也許在底層協議中可以更好地描述)。 family 以逗號分隔的地址族列表,比如 inet, unix, ipx, ax25,netrom, 和 ddp。 這樣和使用 --inet, --unix (-x), --ipx, --ax25, --netrom, 和 --ddp 選項效果相同。地址族 inet 包括raw, udp 和tcp 協議套接字。
-e, --extend:顯示附加信息。使用這個選項兩次來獲得所有細節 -
舉例
netstat -anp | more 列出所有端口並展示PID 和應用名稱 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8008 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8104 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:808 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:9001 0.0.0.0:* LISTEN 7037/nginx: worker tcp 0 0 0.0.0.0:8041 0.0.0.0:* LISTEN 10258/nginx: master
netstat -ne | more 展示其他相關屬性 例如User Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State User Inode tcp 0 0 10.10.151.199:58218 10.9.106.44:6379 ESTABLISHED 0 247408949 tcp 0 0 10.10.151.199:44732 10.9.109.91:11211 ESTABLISHED 1001 254160642 tcp 0 0 10.10.151.199:55368 10.9.109.91:11211 ESTABLISHED 1001 254170734 tcp 0 0 10.10.151.199:51250 10.9.106.44:6379 ESTABLISHED 0 246984680 tcp 0 0 10.10.151.199:22 10.10.123.101:60782 ESTABLISHED 0 251455650 tcp 0 0 10.10.151.199:22 10.10.123.101:46285 ESTABLISHED 0 253605784
netstat -nu | more 展示UDP連接情況 t代表tcp Active Internet connections (w/o servers) Proto Recv-Q Send-Q Local Address Foreign Address State udp 0 0 10.10.170.211:38608 10.10.255.1:53 ESTABLISHED udp 0 0 10.10.170.211:55056 10.10.255.1:53 ESTABLISHED udp 0 0 10.10.170.211:39151 10.10.255.2:53 ESTABLISHED
netstat -r 顯示路由相關信息 Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface default gateway 0.0.0.0 UG 0 0 0 eth0 10.10.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
netstat -l | more 顯示監聽端口 Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:8008 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8104 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:omirr 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:8009 0.0.0.0:* LISTEN
netstat -s | grep TCP | more 顯示TCP協議的統計信息 105128896 TCP sockets finished time wait in fast timer 39460900 TCP sockets finished time wait in slow timer TCPLostRetransmit: 287 3358476 other TCP timeouts TCPLossProbes: 78189 TCPLossProbeRecovery: 34923
各列的含義
Proto: 套接字使用的協議
Recv-Q: 連接此套接字的用戶程序未拷貝的字節數
Send-Q:遠程主機未確認的字節數
Local Address: 套接字的本地地址(本地主機名)和端口號。除非給定-n 選項,否則套接字地址按標準主機名(FQDN)進行解析,而端口號則轉換到相應的服務名。
Foreign Address:套接字的遠程地址(遠程主機名)和端口號
State:套接字的狀態。因爲在RAW協議中沒有狀態,而且UDP也不用狀態信息,所以此行留空。通常它爲以下幾個值之一:ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSED、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN(就是TCP協議裏面的服務器的網絡狀態 後面有詳細講解TCP哈 )
User:套接字屬主的名稱或UID
PID/Program name: 以斜線分隔的處理套接字程序的PID及進程名。-p使此欄目被顯示。你需要sudo權限來查看不是你擁有的套接字的信息。對IPX套接字還無法獲得此信息。 -
TCP三次握手
過程如下:
服務器準備接收客戶端請求 此時服務器處於LISTEN(監聽)狀態
客戶端發出請求 此時客戶端進入SYN-SENT(同步已發送)狀態
服務器接收請求後確認建立連接 向客戶端發送確認 此時服務器處於SYN_RCVD(同步收到)
客戶端收到確認後還需要向服務器確認 此時進入ESTABLISHED(已建立連接)狀態
如圖所示:
syns queue: 半連接隊列用來存儲 SYN_RCVD狀態的未完成連接的信息 服務端第一次收到客戶端請求時將連接信息放在隊列中
accept queue: 全連接隊列用來存儲ESTABLISH狀態的已完成連接的信息 第三步服務器收到客戶端確認時會把半連接隊列中的信息放到全連接當中cat /proc/sys/net/ipv4/tcp_max_syn_backlog 查看系統設置半隊列長度 256 cat /proc/sys/net/core/somaxconn 查看系統設置全隊列長度 128 cat /proc/sys/net/ipv4/tcp_abort_on_overflow 查看全連接隊列溢出後OS如何處理 0 丟掉客戶端傳來的請求 1 返回客戶端reset 取消握手 0 cat /proc/sys/net/ipv4/tcp_synack_retries 全連接溢出後 服務器重新和客戶端連接嘗試次數 5
全連接隊列的大小取決於:min(backlog,somaxconn)。backlog 是在 Socket 創建的時候傳入的,Somaxconn 是一個 OS 級別的系統參數。
半連接隊列的大小取決於:max(64,/proc/sys/net/ipv4/tcp_max_syn_backlog),不同版本的 OS 會有些差異。netstat -s | grep SYNs 查看半連接溢出量 17484 SYNs to LISTEN sockets dropped netstat -s | grep TCPBacklogDrop 查看全連接溢出量 TCPBacklogDrop: 181071
ss -lnt |more 展示每一個端口對應的全連接隊列大小 Send-Q Recv-Q表示有多少等待連接數 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:8008 *:* LISTEN 0 128 *:8104 *:* LISTEN 0 128 *:808 *:* LISTEN 0 128 *:8009 *:* LISTEN 0 128 *:9001 *:*
在出現全連接和半連接溢出的情況是 會導致客戶端訪問時間(網絡時間+排隊時間+重試時間+服務時間)過長 而服務器真正服務的時候又很短 所以適當合理的控制一下全連接隊列的大小 可以幫助我們避免全連接隊列溢出的情況
參考文章:
https://mp.weixin.qq.com/s/eZU573-o-KVmVyU11esb4A
https://www.cnxct.com/something-about-phpfpm-s-backlog/
https://blog.csdn.net/feeltouch/article/details/83155607
http://www.orczhou.com/index.php/2011/10/tcpip-protocol-start-rto/