TCP端口連接狀態


TCP端口的幾種連接狀態
LISTEN:偵聽來自遠方的TCP端口的連接請求
SYN-SENT:再發送連接請求后等待匹配的連接請求(客戶端)
SYN-RECEIVED:再收到和發送一個連接請求后等待對方對連接請求的確認(服務器)
ESTABLISHED:代表一個打開的連接
FIN-WAIT-1:等待遠程TCP連接中斷請求,或先前的連接中斷請求的確認
FIN-WAIT-2:從遠程TCP等待連接中斷請求
CLOSE-WAIT:等待從本地用戶發來的連接中斷請求
CLOSING:等待遠程TCP對連接中斷的確認
LAST-ACK:等待原來的發向遠程TCP的連接中斷請求的確認
TIME-WAIT:等待足夠的時間以確保遠程TCP接收到連接中斷請求的確認
CLOSED:沒有任何連接狀態

更多詳細介紹請參考 tcp連接全過程各種狀態詳解

netstat命令
netstat(選項)
-a或--all:顯示所有連線中的Socket;
-A<網絡類型>或--<網絡類型>:列出該網絡類型連線中的相關地址;
-c或--continuous:持續列出網絡狀態;
-C或--cache:顯示路由器配置的快取信息;
-e或--extend:顯示網絡其他相關信息;
-F或--fib:顯示FIB;
-g或--groups:顯示多重廣播功能群組組員名單;
-h或--help:在線幫助;
-i或--interfaces:顯示網絡界面信息表單;
-l或--listening:顯示監控中的服務器的Socket;
-M或--masquerade:顯示偽裝的網絡連線;
-n或--numeric:直接使用ip地址,而不通過域名服務器;
-N或--netlink或--symbolic:顯示網絡硬件外圍設備的符號連接名稱;
-o或--timers:顯示計時器;
-p或--programs:顯示正在使用Socket的程序識別碼和程序名稱;
-r或--route:顯示Routing Table;
-s或--statistice:顯示網絡工作信息統計表;
-t或--tcp:顯示TCP傳輸協議的連線狀況;
-u或--udp:顯示UDP傳輸協議的連線狀況;
-v或--verbose:顯示指令執行過程;
-V或--version:顯示版本信息;
-w或--raw:顯示RAW傳輸協議的連線狀況;
-x或--unix:此參數的效果和指定"-A unix"參數相同;
--ip或--inet:此參數的效果和指定"-A inet"參數相同。

示例:

查看網絡連接總數
# netstat -an |wc -l

查看某個特定ip的連接數
# netstat -an |grep 8.8.8.8 |wc -l

查看連接數等待time_wait狀態連接數
# netstat -an |grep TIME_WAIT|wc -l

查看建立穩定連接數量
# netstat -an |grep ESTABLISHED |wc -l

查看不同狀態的連接數
# netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
LAST_ACK 21
LISTEN 11
SYN_RECV 15
CLOSE_WAIT 36099
ESTABLISHED 1735
FIN_WAIT1 1
FIN_WAIT2 2
SYN_SENT 3
TIME_WAIT 13356

查看每個ip跟服務器建立的連接數
# netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
  36477 192.168.25.209
    166 192.168.25.214
(PS:正則解析:顯示第5列,-F : 以:分割,顯示列,sort 排序,uniq -c統計排序過程中的重復行,sort -rn 按純數字進行逆序排序)

查看每個ip建立的ESTABLISHED/TIME_OUT狀態的連接數
# netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
    561 192.168.25.209
    228 192.168.25.214
    218 192.168.25.210
    215 192.168.25.247
    177 192.168.25.248
問題1:解決time_wait連接數大量問題

查詢到time_wait連接數過多情況下,調整內核參數:/etc/sysctl.conf

# vim /etc/sysctl.conf
添加以下配置文件:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 300

讓配置生效
# /sbin/sysctl -p

參數詳解:
1.net.ipv4.tcp_syncookies = 1 表示開啟 syn cookies 。當出現 syn 等待隊列溢出時,啟用 cookies 來處理,可防范少量 syn ***,默認為 0 ,表示關閉; 
2.net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將 time-wait sockets 重新用於新的 tcp 連接,默認為 0 ,表示關閉;
3.net.ipv4.tcp_tw_recycle = 1 表示開啟 tcp 連接中 time-wait sockets 的快速回收,默認為 0 ,表示關閉。
4.net.ipv4.tcp_fin_timeout 修改系靳默認的 timeout 時間

如果以上配置調優后性能還不理想,可繼續修改一下配置:

# vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 1200   #表示當keepalive起用的時候,TCP發送keepalive消息的頻度。缺省是2小時,改為20分鍾。
net.ipv4.ip_local_port_range = 1024 65000   #表示用於向外連接的端口范圍。缺省情況下很小:32768到61000,改為1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192   #表示SYN隊列的長度,默認為1024,加大隊列長度為8192,可以容納更多等待連接的網絡連接數。
net.ipv4.tcp_max_tw_buckets = 5000   #表示系統同時保持TIME_WAIT套接字的最大數量,如果超過這個數字,TIME_WAIT套接字將立刻被清除並打印警告信息。
默認為180000,改為5000。
對於Apache、Nginx等服務器,上幾行的參數可以很好地減少TIME_WAIT套接字數量,但是對於 Squid,效果卻不大。此項參數可以控制TIME_WAIT套接字的最大數量,避免Squid服務器被大量的TIME_WAIT套接字拖死。
問題2:ESTABLISHED連接數過大問題

怎么解決請求結束后依然存在大量ESTABLISHED沒有被釋放

初步推斷是tomcat服務器回收session時出了問題,這個一般都跟服務器的Timeout設置有聯系。

查看tomcat的配置文件 server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8" />
*****

檢查配置得出20000毫秒的時候acceptCount=”100” ,明顯不合理,最大連接數也太小了吧。

所以進一步優化:

connectionTimeout="20000" 改為 connectionTimeout="100"
acceptCount="100"改為acceptCount="5000"

更多詳細介紹請參考 netstat監控大量ESTABLISHED連接數和TIME_WAIT連接數題解決


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM