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

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

一:TCP的三次握手

一、TCP簡述

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

二、鏈接的創建

解釋:

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

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

  • 第二次握手: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已關閉,鏈接正在或正要關閉。socket

  • FIN_WAIT2

    鏈接已關閉,而且socket正在等待遠端結束。tcp

  • 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

三、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/,文件須要打開防火牆纔會存在

 四、客戶端狀態變化描述

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

五、服務端狀態變化描述

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

相關文章
相關標籤/搜索