TCP是百分百可靠的嗎?

我們知道,TCP是面向連接的,可靠的傳輸層協議,那麼TCP是100%可靠無缺陷的嗎?

不是的,TCP協議為了實現可靠傳輸,在三次握手的實現過程中設置了一些異常處理機制。比如說,在三次握手的第三步,如果服務器一直沒有收到客戶端的ACK報文,服務器一般會進行重試,也就是再次發送SYN+ACK報文給客戶端,並且一直處於SYN-RECV狀態,將客戶端加入等待列表(半連接隊列)。重發一般會進行3~5次,大概每隔30秒會輪詢一次半連接隊列,重試所有的客戶端。此外,服務器在發送SYN+ACK報文後,會預留一部分資源給即將建立的TCP連接,這個資源在等待重試期間會一直保留。

然而,服務器的資源是有限的,可維護的等待列表大小超過一定限度後,服務器就不在接受新的SYN報文了,也就是說服務器拒絕建立新的TCP連接了。

攻擊者可以偽造大量的IP地址給服務器發送SYN報文,由於偽造的IP地址幾乎不可能存在,服務器也就收不到從偽造的IP地址發來的任何回應,因此服務器將會維護一個很大的等待列表,並不斷地嘗試向等待列表中的IP地址發送SYN+ACK,這樣不僅會佔用很大的系統資源,而且由於服務器等待隊列已滿,服務器拒絕建立新的TCP連接,這樣正常的客戶端想要建立連接時,反而不能成功。

這樣的攻擊方式稱為SYN Flood攻擊,是DoS(Deny of Service 拒絕服務)攻擊的一種。


分享到:


相關文章: