
一。TCP 狀態值
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
CLOSED:無連接是活動的或正在進行
LISTEN:服務器在等待進入呼叫
SYN_RECV:一個連接請求已經到達,等待確認
SYN_SENT:應用已經開始,打開一個連接
ESTABLISHED:正常數據傳輸狀態
FIN_WAIT1:應用說它已經完成
FIN_WAIT2:另一邊已同意釋放
ITMED_WAIT:等待所有分組死掉
CLOSING:兩邊同時嘗試關閉
TIME_WAIT:另一邊已初始化一個釋放
LAST_ACK:等待所有分組死掉
二。怎么處理大量TIME_WAIT狀態的連接
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 = 30
/sbin/sysctl -p 生效
net.ipv4.tcp_syncookies = 1
表示開啟SYN cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防范少量SYN攻擊
net.ipv4.tcp_tw_reuse = 1
表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連接
net.ipv4.tcp_tw_recycle = 1
表示開啟TCP連接中TIME-WAIT sockets的快速回收
net.ipv4.tcp_fin_timeout
修改系統默認的 TIMEOUT 時間
三。什么時候進入TIME_WAIT
客戶端與服務器端建立TCP/IP連接后,關閉SOCKET,服務器端連接的端口狀態為TIME_WAIT,是不是所有執行主動關閉的socket都會
進入TIME_WAIT狀態呢? 主動關閉的一方在發送最后一個 ack 后就會進入 TIME_WAIT 狀態停留2MSL(max segment lifetime)時間
這個是TCP/IP必不可少的,主要有兩個原因:
1。防止上一次連接中的包,迷路后重新出現,影響新連接(經過2MSL,上一次連接中所有的重復包都會消失)
2。可靠的關閉TCP連接,在主動關閉方發送的最后一個 ack(fin) ,有可能丟失,這時被動方會重新發fin, 如果這時主動方處於 CLOSED 狀態 ,
就會響應 rst 而不是 ack。所以主動方要處於 TIME_WAIT 狀態,而不能是 CLOSED 。但是如果一方 send 或 recv 超時,就會直接進入
CLOSED 狀態
