TCP三次握手四次揮手過程梳理

1. 數據傳輸的大體示意圖

1.1 TCP鏈接的幾種狀態說明

  即命令 netstat 結果中的全部狀態:html

2. TCP鏈接創建的全過程 

2.1 TCP三次握手創建TCP鏈接服務器

  1)客戶端和服務端都處於CLOSED狀態。(發起TCP請求的稱爲客戶端,接受請求的稱爲服務端)
  2)服務端打開服務端口,處於listen狀態。
  3)客戶端發起鏈接請求。首先發送SYN(synchronous)報文給服務端,等待服務端給出ACK報文迴應。發送的SYN=1,ACK=0,表示只發送了SYN信號。此時客戶端處於SYN-SENT狀態(SYN信號已發送)。
  4)服務端收到SYN信號後,發出ACK報文迴應,並同時發出本身的SYN信號請求鏈接。此時服務端處於SYN-RECV狀態(syn recieved,在圖中顯示的是SYN-RCVD)。發送的SYN=1 ACK=1,表示發送了SYN+ACK。
  5)客戶端收到服務端的確認信號ACK後,再次發送ACK信號給服務端以回覆服務端發送的syn。此時客戶端進入ESTABLISHED狀態,發送的SYN=0,ACK=1表示只發送了ACK
  6)服務端收到ACK信號後,也進入ESTABLISHED狀態。此後進行數據的傳輸都經過此鏈接進行。其中第三、四、5步是三次握手的過程。這個過程通俗地說就是雙方請求並回應的過程:①A發送syn請求B並等待B迴應;②B迴應A,並同時請求A;③A迴應B網絡

                               

2.2 TCP釋放鏈接,四次揮手斷開TCP鏈接全過程

  1)客戶端發送FIN(finally)報文信號,請求斷開。此後客戶端進入FIN-WAIT-1狀態。
  2)服務端收到FIN信號,給出確認信號ACK=1,表示贊成斷開。此時服務端進入CLOSE-WAIT狀態。此過程結束後表示從客戶端到服務端方向的TCP鏈接已經關閉了,也就是說整個TCP鏈接處於半關閉狀態。
  3)客戶端收到服務端的ACK後進入FIN-WAIT-2狀態,以等待服務端發出斷開信號FIN。在客戶端的FIN-WAIT-2狀態的等待過程當中,服務端再發出本身的FIN信號給客戶端。此時服務端進入LAST-ACK狀態。
  4)客戶端收到服務端的FIN信號,給出迴應信號ACK,表示接受服務端的斷開請求,此時客戶端進入TIME-WAIT狀態,此時客戶端已脫離整個TCP,只需再等待一段時間(2*MSL)就自動進入CLOSED狀態。
  5)服務端收到客戶端的迴應ACK信號,知道客戶端贊成了服務端到客戶端方向的TCP斷開,直接進入CLOSED狀態。以上1.2.3.4是四次揮手的階段,握手和揮手的過程是相似的.區別是:握手時發送的SYN和ACK是放在同一個數據包發送的,而揮手時,是將服務端發送的ACK和FIN分卡發送的.併發

                               

  注意:若是是客戶端請求斷開,那麼服務端就是被動斷開端,可能會保留大量的CLOSE-WAIT狀態的鏈接,若是是服務端主動請求斷開,則可能會保留大量的TIME_WAIT狀態的鏈接。因爲每一個鏈接都須要佔用一個文件描述符,高併發狀況下可能會耗盡這些資源。所以,須要找出對應問題,作出對應的防治,通常來講,能夠修改內核配置文件 /etc/sysctl.conf 來解決一部分問題。tcp

3. Linux下查看和預防SYN洪水攻擊

  SYN洪水攻擊是一種常見的DDoS攻擊手段.攻擊者能夠經過工具在極短期內僞造大量隨機不存在的ip向服務器指定端口發送tcp鏈接請求,也就是發送了大量syn=1 ack=0的數據包,當服務器收到了該數據包後會回覆並一樣發送syn請求tcp鏈接,也就是發送ack=1 syn=1的數據包,此後服務器進入SYN-RECV狀態,正常狀況下,服務器期待收到客戶端的ACK回覆。但問題是服務器回覆的目標ip是不存在的,因此回覆的數據包總被丟棄,也一直沒法收到ACK回覆,因而不斷重發ack=1 syn=1的回覆包直至超時。在服務器被syn flood攻擊時,因爲不斷收到大量僞造的syn=1 ack=0請求包,它們將長時間佔用資源隊列,使得正常的SYN請求沒法獲得正確處理,並且服務器一直處於重傳響應包的狀態,使得cpu資源也被消耗。總之,syn flood攻擊會大量消耗網絡帶寬和cpu以及內存資源,使得服務器運行緩慢,嚴重時可能會引發網絡堵塞甚至系統癱瘓.高併發

  可以使用 netstat -lntap 命令判斷服務器是否遭受SYN洪水攻擊,結合 /etc/sysctl.conf 和防火牆iptables是進行優化/封堵.工具

[root@xuexi ~]# netstat -tnlpa | grep tcp | awk '{print $6}' | sort | uniq -c
      1 ESTABLISHED
      7 LISTEN
    256 SYN_RECV

  以上大部份內容參考好友報文博文 http://www.javashuo.com/article/p-duohunam-g.html優化

相關文章
相關標籤/搜索