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鏈接已創建狀態ESTABLISHED)centos
第一次握手:A的TCP客戶進程也是首先建立傳輸控制塊TCB,而後向B發出鏈接請求報文段,(首部的同步位SYN=1,初始序號seq=x),(SYN=1的報文段不能攜帶數據)但要消耗掉一個序號,此時TCP客戶進程進入SYN-SENT(同步已發送)bash
socket已經創建鏈接,表示處於鏈接的狀態,通常認爲有一個ESTABLISHED認爲是一個服務的併發鏈接。這個鏈接狀態在生產場景很重要,要重點關注。服務器
socket正在積極嘗試創建一個鏈接,即處於發送後鏈接前的一個等待但未匹配進入鏈接的狀態。網絡
已經從網絡上收到一個鏈接請求。併發
socket已關閉,鏈接正在或正要關閉。socket
鏈接已關閉,而且socket正在等待遠端結束。tcp
socket正在等待關閉處理仍在網絡上的數據包,這個鏈接狀態在生產場景很重要,要重點關注。測試
遠端已經結束,等待socket關閉。優化
遠端已經結束,而且socket也已關閉,等待acknowl-edgement。
socket正在監聽鏈接請求。
sockets關閉,可是咱們仍舊沒有發送數據。
未知的狀態。
在三次握手過程當中,服務器發送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
1.使用echo value方式直接追加到文件裏如echo "1" >/proc/sys/net/ipv4/tcp_syn_retries,但這種方法設備重啓後又會恢復爲默認值
2.把參數添加到/etc/sysctl.conf中,而後執行sysctl -p使參數生效,永久生效
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
CLOSED->LISTEN->SYN_RECVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED