1. 程式人生 > >TCP 建立連線的三次握手 和釋放連線的四次揮手 圖解

TCP 建立連線的三次握手 和釋放連線的四次揮手 圖解

   相對於SOCKET開發者,TCP建立過程和連結折除過程是由TCP/IP協議棧自動建立的.因此開發者並不需要控制這個過程.但是對於理解TCP底層運作機制,相當有幫助.

     而且對於有網路協議工程師之類筆試,幾乎是必考的內容.企業對這個問題熱情之高,出乎我的意料:-)。有時上午面試前強調這個問題,並重復講一次,下午幾乎每一個人都被問到這個問題。   因此在這裡詳細解釋一下這兩個過程。   TCP三次握手   所謂三次握手(Three-way Handshake),是指建立一個TCP連線時,需要客戶端和伺服器總共傳送3個包。
  三次握手的目的是連線伺服器指定埠,建立TCP連線,並同步連線雙方的序列號和確認號並交換 TCP 視窗大小資訊.在socket程式設計中,客戶端執行connect()時。將觸發三次握手。        
  • 第一次握手:
    客戶端傳送一個TCP的SYN標誌位置1的包指明客戶打算連線的伺服器的埠,以及初始序號X,儲存在包頭的序列號(Sequence Number)欄位裡。
  • 第二次握手:
    伺服器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1同時,將確認序號(Acknowledgement Number)設定為客戶的I S N加1以.即X+1。

 

  • 第三次握手.
    客戶端再次傳送確認包(ACK) SYN標誌位為0,ACK標誌位為1.並且把伺服器發來ACK的序號欄位+1,放在確定欄位中傳送給對方.並且在資料段放寫ISN的+1

SYN攻擊

   在三次握手過程中,伺服器傳送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攻擊。

TCP 四次揮手

TCP的連線的拆除需要傳送四個包,因此稱為四次揮手(four-way handshake)。客戶端或伺服器均可主動發起揮手動作,在socket程式設計中,任何一方執行close()操作即可產生揮手操作。

 

 

 

參見wireshark抓包,實測的抓包結果並沒有嚴格按揮手時序。我估計是時間間隔太短造成。


原網址:http://www.cnblogs.com/hnrainll/archive/2011/10/14/2212415.html