感謝各位技術大佬的資料分享,這里我把我理解的內容做一個整理
一: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/,文件需要打開防火牆才會存在
- 文件所處目錄/proc/sys/net/core/
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