TCP
是
連線導向的,所謂連線導向,就是當電腦雙方通訊時必需先建立串連,然後資料傳送,最後拆除串連三個過程
並且TCP
在
建立串連時又分三步走:
第一步是請求端(用戶端)發送一個包含SYN即同步(Synchronize)標誌的TCP
報文,SYN同步報文會指明用戶端使用的連接埠
以及TCP
連
接的初始序號;
第二步,伺服器在收到用戶端的SYN報文後,將返回一個SYN+ACK的報文,表示用戶端的請求被接受,同時TCP
序
號被加一,ACK即確認(Acknowledgement)。
第三步,用戶端也返回一個確認報文ACK給伺服器端,同樣TCP
序號被加一,到此一個TCP
連
接完成。然後才開始通訊的第二步:資料處理。
這就是所說的TCP
三向交握
(Three-way Handshake)。
簡單的說就是:(C:用戶端,S:服務端)
C:SYN到S
S:如成功--返回給C(SYN+ACK)
C:如成功---返回給S(ACK)
以上是正常的建立串連方式,但如下:
假設一個C向S發送了SYN後無故消失了,那麼S在發出SYN+ACK應答報文後是無法收到C的ACK報文的(第三向交握
無
法完成),這種情況下S一般會重試(再次發送SYN+ACK給用戶端)並等待一段時間後丟棄這個未完成的串連,這段時間的長度我們稱為SYN
Timeout,一般來說這個時間是分鐘的數量級(大約為30秒-2分鐘);一個C出現異常導致S的一個線程等待1分鐘並不是什麼很大的問題,但如果有一
個惡意的攻擊者大量類比這種情況,S將為了維護一個非常大的半串連列表而消耗非常多的資源----數以萬計的半串連,即使是簡單的儲存並遍曆也會消耗非常
多的CPU時間和記憶體,何況還要不斷對這個列表中的IP進行SYN+ACK的重試。實際上如果S的TCP
/IP棧不夠強大,最後的結果
往往是堆疊溢位崩潰---即使S的系統足夠強大,S也將忙於處理攻擊者偽造的TCP
串連請求而無暇理睬客戶的正常請求(畢竟C的
正常請求比率非常之小),此時從正常客戶的角度看來,S失去響應,這種情況我們稱作:伺服器端受到了SYN Flood攻擊(SYN洪水攻擊)。
原文地址:http://blog.myspace.cn/e/405701766.htm