簡介
第一次握手:建立連線時,
客戶端傳送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
第二次握手:伺服器收到syn包,必須確認客戶的syn(ack=j+1),同時自己也傳送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入
SYN_RECV狀態;
第
三次握手:
客戶端收到伺服器的SYN+ACK包,向伺服器傳送確認包ACK(ack=k+1),此包傳送完畢,
客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
完成
三次握手,客戶端與伺服器開始傳送數據,在上述過程中,還有一些重要的概念:
未連線佇列:在
三次握手協定中,伺服器維護一個未連線佇列,該佇列為每個
客戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的連線在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。
SYN-ACK 重傳次數:伺服器傳送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超過系統規定的最大重傳次數,系統將該連線信息從半連線佇列中刪除。注意,每次重傳等待的時間不一定相同。
半連線存活時間:是指半連線佇列的條目存活的最長時間,也即服務從收到SYN包到確認這個
報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連線存活時間為Timeout時間、SYN_RECV存活時間。
工作原理
由於TCP 需要時刻跟蹤,這需要額外開銷,使得TCP 的格式有些顯得複雜。TCP 的經典案例,這是後來被稱為MITNICK 攻擊中KEVIN 開創的兩種攻擊技術:
TCP 會話劫持和SYN FLOOD(同步洪流)
SYN FLOOD
當
客戶端和伺服器在網路中使用TCP協定發起會話時,在
伺服器記憶體中會開闢一小塊
緩衝區來處理會話過程中訊息的“握手”交換。會話建立數據包包含一個SYN片段,用於標識訊息交換中的
序列號。而SYN FLOOD試圖摧毀這一過程。攻擊者快速傳送一連串連線請求,之後並不回響伺服器傳送回來的應答,造成
三次握手無法完成,在伺服器上留下半打開的連線,分配給他們的快取也被保留下來,使其他程式不能使用伺服器。儘管
緩衝區中的數據包在沒有應答超過一段時間(通常3min)就會被丟棄,但大量虛假請求的後果是用於建立會話的合法請求難以建立。
TCP 會話劫持
假設A 為攻擊者,B 為中介跳板機器(受信任的伺服器),C 為目的
主機(多是伺服器)。
會話劫持的常用方法:使用
源路由(source Routed)IP數據包,使位於網路上的A 參與到B與C的連線中。
會話劫持的常見類型:
中間人攻擊。攻擊者A通過某種類型的數據包
嗅探程式偵聽B與C的數據傳輸,可以截獲他想要的任何信息而不打斷會話。
會話劫持的方法:攻擊者A向正在通話的B傳送大量請求使其無暇回響合法用戶C,此時A預測B的TCP序列號冒充B與C進行會話,騙取C的信任,從而達到攻擊的目的。
TCP連線建立過程
在TCP連線建立過程中要解決以下三個問題:
(1) 要使每一方能夠確知對方的存在。
(2) 要允許雙方協商一些參數(如最大視窗值、是否使用視窗擴大選項和時間戳選項以及服務質量等)。
(3) 能夠對運輸實體資源(如快取大小、連線表中的項目等)進行分配。