淺談TCP的三次握手

上一篇文章《淺談TCP/IP協議棧模型》https://mp.csdn.net/postedit/95853735簡單介紹了標準TCP/IP協議棧的四層網絡結構,主要對每一層協議做了簡單的描述和網絡協議抓包,基於上篇文章的傳輸層,本篇文章主要對TCP協議的三次握手及四次揮手做一個簡單學習總結。

TCP的三次握手(Three-way Handshake)

三次握手顧名思義就是在TCP建立連接時,需要客戶端和服務器總共發送三個包,三次握手的目的就是連接服務器指定的端口,並同步連接雙方的序列號和確認號,並交換TCP窗口大小等信息

                    

第一次握手:

客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段裏,此時客戶端進入SYN_SEND狀態,等待服務器B確認。

                    

第二次握手:

服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1同時,將確認序號(Acknowledgement Number)設置爲客戶的I S N加1以.即X+1。並設置發送序號爲Y,此時服務端進入SYN_RECV狀態

                     

第三次握手.

客戶端再次發送確認包ACK爲1,此時的SYN標誌位爲0. 並且把服務器發來的序號字段+1,即Y+1,放在確定字段中發送給對方.並且將發送序號的ISN的+1,客戶端和服務端進入ESTABLISHED狀態,完成三次握手

                     

爲什麼需要三次握手?

答:三次握手完成了兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被髮送和確認。

    現在假設把三次握手改成僅需要兩次握手,計算機Client和Server之間的通信,Client給Server發送一個連接請求分組,Server收到了這個分組,併發 送了確認應答分組。按照兩次握手的協定,Server認爲連接已經成功地建立了,可以開始發送數據分組。可是,Client在Server的應答分組在傳輸中被丟失的情況下,將不知道Server是否已準備好,不知道Server建立什麼樣的序列號,Client甚至懷疑Server是否收到自己的連接請求分組。在這種情況下,Client認爲連接還未建立成功,將忽略Server發來的任何數據分 組,只等待連接確認應答分組。而Server在發出的分組超時後,重複發送同樣的分組。這樣就形成了死循環。

三次握手有什麼缺點?

答:在三次握手過程中,服務器發送SYN-ACK之後,收到客戶端的ACK之前的TCP連接稱爲半連接(half-open connect).此時服務器處於Syn_RECV狀態.當收到ACK後,服務器轉入ESTABLISHED狀態.

Syn攻擊就是 攻擊客戶端 在短時間內僞造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回覆確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直 至超時,這些僞造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊

netstat -n -p TCP | grep SYN_RECV

一般較新的TCP/IP協議棧都對這一過程進行修正來防範Syn攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等.

但是不能完全防範syn攻擊。

三次握手抓包入下:

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章