TCP三次握手與Linux的TCP內核參數優化


感謝各位技術大佬的資料分享,這里我把我理解的內容做一個整理

一:TCP的三次握手

1、TCP簡述

  TCP是一個面向連接的協議,在連接雙方發送數據之前,首先需要建立一條連接。TCP建立連接可以簡單稱為:三次握手(說白了就是建立一個TCP連接的時候,客戶端和服務端總共要發3個包,socket編程里面執行connect()的時候,將觸發三次握手),斷開TCP連接可以叫做四次握手(socket編程里面任何一方執行close()操作即可產生揮手動作)。

2、連接的建立

解釋:

  最初兩端的TCP進程都處於CLOSED關閉狀態,A主動打開連接,而B被動打開連接。(A、B關閉狀態CLOSED——B收聽狀態LISTEN——A同步已發送狀態SYN-SENT——B同步收到狀態SYN-RCVD——A、B連接已建立狀態ESTABLISHED

  • B的TCP服務器進程先創建傳輸控制塊TCB,准備接受客戶進程的連接請求。然后服務器進程就處於LISTEN(收聽)狀態,等待客戶的連接請求。若有,則作出響應。
  • 第一次握手:A的TCP客戶進程也是首先創建傳輸控制塊TCB,然后向B發出連接請求報文段,(首部的同步位SYN=1,初始序號seq=x),(SYN=1的報文段不能攜帶數據)但要消耗掉一個序號,此時TCP客戶進程進入SYN-SENT(同步已發送)

  • 第二次握手:B收到連接請求報文段后,如同意建立連接,則向A發送確認,在確認報文段中(SYN=1,ACK=1,確認號ack=x+1,初始序號seq=y),測試TCP服務器進程進入SYN-RCVD(同步收到)狀態;

 

  • 第三次握手:TCP客戶進程收到B的確認后,要向B給出確認報文段(ACK=1,確認號ack=y+1,序號seq=x+1)(初始為seq=x,第二個報文段所以要+1),ACK報文段可以攜帶數據,不攜帶數據則不消耗序號。TCP連接已經建立,A進入ESTABLISHED(已建立連接)。

  • 當B收到A的確認后,也進入ESTABLISHED狀態。

TCP header:

詳細內容解釋:

TCP的狀態總結:

  • 第六列為socket的狀態,通常僅僅有tcp的狀態,狀態值可能有ESTABLISHED,SYN_SENT,SYN_RECV FIN_WAIT1,FIN_WAIT2,TIME_WAIT等,詳見下文。其中,最重要的是第六列。
  • ESTABLISHED

    socket已經建立連接,表示處於連接的狀態,一般認為有一個ESTABLISHED認為是一個服務的並發連接。這個連接狀態在生產場景很重要,要重點關注。

  • SYN_SENT

    socket正在積極嘗試建立一個連接,即處於發送后連接前的一個等待但未匹配進入連接的狀態。

  • SYN_RECV

    已經從網絡上收到一個連接請求。

  • FIN_WAIT1

    socket已關閉,連接正在或正要關閉。

  • FIN_WAIT2

    連接已關閉,並且socket正在等待遠端結束。

  • TIME_WAIT

    socket正在等待關閉處理仍在網絡上的數據包,這個連接狀態在生產場景很重要,要重點關注。

  • CLOSE_WAIT

    遠端已經結束,等待socket關閉。

  • LAST_ACK

    遠端已經結束,並且socket也已關閉,等待acknowl-edgement。

  • LISTEN

    socket正在監聽連接請求。

  • CLOSING

    sockets關閉,但是我們仍舊沒有發送數據。

  • UNKNOWN

    未知的狀態。

SYN攻擊

  在三次握手過程中,服務器發送SYN,ACK之后,收到客戶端的ACK之前的TCP連接稱為半連接(half-open connect)。此時服務器處於Syn_RECV狀態。當收到ACK后,服務器轉入ESTABLISHED狀態。
  Syn攻擊就是 攻擊客戶端 在短時間內偽造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直 至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。
Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。在LINUX下可以如下命令檢測是否被Syn攻擊:

[root@rsync_test ~]# netstat -n | awk '/^tcp/ {++sam[$NF]} END {for(num in sam)print num,sam[num]}'
TIME_WAIT 30
FIN_WAIT1 1
ESTABLISHED 615
SYN_RECV 2

3、Linux系統TCP內核參數優化

  • 兩種修改內核參數的方法:

    1.使用echo value方式直接追加到文件里如echo "1" >/proc/sys/net/ipv4/tcp_syn_retries,但這種方法設備重啟后又會恢復為默認值

    2.把參數添加到/etc/sysctl.conf中,然后執行sysctl -p使參數生效,永久生效

  • 下列文件所在目錄:/proc/sys/net/ipv4/

 

  • 所處目錄/proc/sys/net/ipv4/netfilter/,文件需要打開防火牆才會存在

 4、客戶端狀態變化描述

CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED

5、服務端狀態變化描述

CLOSED->LISTEN->SYN_RECVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

 


免責聲明!

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



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