tcp鏈接狀態以及netstat命令

wKioL1Yu6VvTnAZHAAG4aoSDtLY657.jpg

  tcp是可靠的數據傳輸協議,相對於udp來講,基於udp的通訊速度更快,可是沒有數據的完整性的保證,更重要的是udp不會保證數據是否到達了目的方。linux

  TCP協議創建的tcp鏈接是有狀態的,稱之爲tcp的有限狀態機web

SYN_SENT:主動創建鏈接的一方發起鏈接創建請求,也就是SYN=1,當發出同步位,狀態轉換位SYN_SENT服務器

SYN_RCVD:服務器端收到了客戶端發送的同步報文,按照tcp協議的規定,回覆ACK報文同時SYN位至1,此時服務器的狀態轉換爲SYN_RCVD網絡

ESTABLISHED:當客戶端收到服務器端發來的SYN確認報文,客戶端就由此轉入鏈接創建狀態(established),並向服務器端回送確認報文併發

狀態爲ESTABLISHED,雙方就能夠發送數據進行通訊了,可是TCP又有所謂的長鏈接和短鏈接,通常在應用程序沒有啓用keepalived的狀況下,TCP鏈接創建以後發送一個數據請求獲得結果後就斷開鏈接,而長鏈接就是在一個數據請求以後並不當即斷開,而等待應用程序定義的TIMEOUT等條件知足以後斷開(或者收到了對方的FIN)tcp


tcp創建鏈接的時候稱w爲三次握手,通常都是由客戶端先向服務器端發起鏈接請求ide

tcp斷開鏈接的時候稱爲四次揮手,在斷開鏈接的時候有多是客戶端發起的也有多是服務器端先發起的性能


在這裏選用如圖,客戶端先發起斷開鏈接請求(可是雙方都要發送FIN)spa

  FIN_WAIT1:主動方發起斷開鏈接請求等待對方確認,將自身的狀態轉入FIN-WAIT1blog

 CLOSE-WAIT:被動方收到FIN報文,回覆ACK,將狀態轉爲CLOSE_WAIT

在tcp的鏈接中,在本身發出FIN位以後就不能再發送數據,可是能夠讀取,因此在被動方回覆了主動放的FIN以後,只要本身尚未發送FIN位,就能夠發送尚未發送完的數據

 FIN_WAIT2:主動方接收到對方的ACK,將狀態轉入FIN_WAIT2

 LAST_ACK:被動方發送FIN,將自身tcp鏈接狀態轉爲LAST_ACK,意思就是等待最後一個確認報文以後就能夠關閉鏈接

 TIME_WAIT:主動方收到了被動方的FIN,將tcp鏈接狀態轉爲TIME_WAIT,在這裏主動方會等待2msl的時間以後轉入closed

 closed:被動方收到確認報文後,關閉鏈接


在linxu上,例如web服務的搭建維護調優過程當中,咱們就常常須要關注服務器的鏈接情況以最大化的發揮服務器的性能

 netstat命令是在linux中最經常使用的顯示網絡子系統的命令,能夠顯示路由表,某個地址上創建的鏈接,tcp鏈接的狀態等等

  netstat 

     --route ,-r顯示路由表

     --groups 顯示多播組相關信息

  -t:顯示tcp鏈接相關

 -u:顯示udp鏈接相關

  -p:顯示進程名稱

  -n:以數字方式替換顯示端口等信息

  -l:顯示處於監聽狀態的

  -a:顯示所有監聽和非監聽狀態的套接字信息

查看服務器上開啓的監聽服務:

   netstat -tunlp(以數字形式顯示哪些進程監聽在tcp或者udp的某些端口)

統計80端口鏈接數

  netstat -nat | grep -i "80" | wc -l

查看http併發鏈接請求及tcp狀態

  netstat -nat | grep -i "80"

查看已經創建的http鏈接數

 netstat -nat | grep ".*80.*ESTABLISHED"

查看httpd的相關進程數

  ps aux | grep httpd |wc -l或則是ps -ef | grep httpd | wc -l

相關文章
相關標籤/搜索