TCP連接的建立(三次握手)

        

一、TCP報文段首部格式

l        序號:本報文段所發送的數據的第一個字節的序號。

l        確認號ack期待收到對方下一個報文段的第一個數據字節的序號

l        確認ACK佔1位,僅當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效

l       同步SYN連接建立時用於同步序號。當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。因此,SYN=1表示這是一個連接請求,或連接接受報文。

l        終止FIN用來釋放一個連接。FIN=1表示:此報文段的發送方的數據已經發送完畢,並要求釋放運輸連接

 

二、TCP三次握手

        所謂三次握手(Three-wayHandshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。

三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息.在socket編程中,客戶端執行connect()時。將觸發三次握手。


第一次握手:
        客戶端發送一個TCP的SYN標誌位置1的包指明客戶打算連接的服務器的端口,以及初始序號(X),保存在包頭的序列號(Sequence Number)字段裏。

第二次握手:
       服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均爲1,同時,將確認序號(AcknowledgementNumber)設置爲客戶的sequence加1,即X+1。那麼服務器也必須要確認客戶端確實可以收到我們的包纔行,所以也會發送一個sequence(Y)給客戶端,並且等待客戶端響應。


第三次握手.
        當客戶端收到來自服務端的ACK後,就能確認之前的那個包已經被正確接收。客戶端再次發送確認包(ACK), SYN標誌位爲0,ACK標誌位爲1.並且把服務器發來的Sequence序號字段+1,放在ACK字段中發送給對方.並且在數據段放寫ISN的+1


類比打電話的過程:

張三:李四你在不在?

李四:我在! 那張三你在不在?

張三:我也在!

 

SYN攻擊
        在三次握手過程中,服務器發送SYN-ACK之後,收到客戶端的ACK之前的TCP連接稱爲半連接(half-openconnect).此時服務器處於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攻擊。

 

這裏我們通過 wireshark 來演示三次握手的過程。

我們以CentOS 的一個FTP鏡像服務器作爲連接目標。IP爲: 116.193.170.18


在wireshark軟件中,設置 Capture Filter: TCP only


抓取TCP包如下:


第一次:


第二次:


第三次:

在學習網絡的過程中, 通過相關軟件可以更直觀的瞭解具體實現。

 

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