七層網絡模型
第一次握手:建立連接配接。用戶端發送連接配接請求封包段,将SYN位置為1,Sequence Number為x;然後用戶端進入SYN_SENT狀态,等待伺服器的确認;
第二次握手:伺服器收到SYN封包段。伺服器收到用戶端的SYN封包段,需要對這個SYN封包段進行确認,設定Acknowledgment Number為x+1(Sequence Number+1);
同時,自己自己還要發送SYN請求資訊,将SYN位置為1,Sequence Number為y;伺服器端将上述所有資訊放到一個封包段(即SYN+ACK封包段)中,一并發送給用戶端,此時伺服器進入SYN_RECV狀态;
第三次握手:用戶端收到伺服器的SYN+ACK封包段。然後将Acknowledgment Number設定為y+1,向伺服器發送ACK封包段,這個封包段發送完畢以後,用戶端和伺服器端都進入ESTABLISHED狀态,完成TCP三向交握。
第一次揮手: 主機A(可以使用戶端,可以是伺服器端),設定Sequence Number和Acknowledgment Number,向主機B發送一個FIN封包段;
此時,主機A進入FIN_WAIT_1狀态;這表示主機A沒有資料要發送給主機B;
第二次揮手:主機B收到了主機A發送的FIN封包段,向主機A回一個ACK封包段,Acknowledgment Number為Sequence Number加1;
主機A進入FIN_WAIT_2狀态;主機B告訴主機A,我“同意”你的關閉請求;
第三次揮手:主機B向主機A發送FIN封包段,請求關閉連接配接,同時主機B進入LAST_ACK狀态;
第四次揮手:主機A收到主機B發送的FIN封包段,向主機B發送ACK封包段,然後主機A進入TIME_WAIT狀态;
主機B收到主機A的ACK封包段以後,就關閉連接配接;此時,主機A等待2MSL後依然沒有收到回複,則證明Server端已正常關閉,那好,主機A也可以關閉連接配接。
Linux /proc/sys目錄下存放着多數核心的參數,并且可以在系統運作時進行更改,一般重新啟動機器就會失效。而/etc/sysctl.conf是一個允許改變正在運作中的Linux系統的接口,它包含一些TCP/IP堆棧和虛拟記憶體系統的進階選項,修改核心參數永久生效。
/proc/sys下核心檔案與配置檔案sysctl.conf中變量存在着對應關系,即修改sysct.conf配置檔案,其實是修改/proc/sys相關參數,是以對Linux核心優化隻需修改/etc/sysctl.conf檔案即可
完整的TCP連接配接的三次握手,假設一個使用者A向伺服器發送了SYN封包後突然當機或掉線,那麼伺服器在發出SYN+ACK應答封包後是無法收到用戶端的ACK封包的(第三次握手無法完成),這種情況下伺服器端一般會重試(再次發送SYN+ACK給用戶端)并等待一段時間後丢棄這個未完成的連接配接,這段時間的長度我們稱為SYN Timeout,一般來說這個時間是分鐘的數量級(大約為30秒-2分鐘)。
一個使用者出現異常導緻伺服器的一個線程等待1分鐘并不是什麼很大的問題,但如果有一個惡意的者大量模拟這種情況,伺服器端将為了維護一個非常大的半連接配接清單而消耗非常多的資源,數以萬計的半連接配接,即使是簡單的儲存并周遊也會消耗非常多的CPU時間和記憶體,何況還要不斷對這個清單中的IP進行SYN+ACK的重試。
實際上如果伺服器的TCP/IP棧不夠強大,最後的結果往往是堆棧溢出崩潰,即使伺服器端的系統足夠強大,伺服器端也将忙于處理者僞造的TCP連接配接請求而無暇理睬客戶的正常請求(畢竟用戶端的正常請求比率非常之小),此時從正常客戶的角度看來,伺服器失去響應,伺服器拒絕提供服務,伺服器受到了DDOS,這裡的手段為DDOS中SYN Flood(SYN洪水)。
如果處于SYN_RECV 狀态太多,就有可能是遭受syn洪水