tcp面試問題1

SYN攻擊

  • 什么是 SYN 攻擊(SYN Flood)?

    在三次握手過程中,服務(wù)器發(fā)送 SYN-ACK 之后,收到客戶端的 ACK 之前的 TCP 連接稱為半連接(half-open connect)。此時服務(wù)器處于 SYN_RCVD 狀態(tài)。當(dāng)收到 ACK 后,服務(wù)器才能轉(zhuǎn)入 ESTABLISHED 狀態(tài).

    SYN 攻擊指的是,攻擊客戶端在短時間內(nèi)偽造大量不存在的IP地址,向服務(wù)器不斷地發(fā)送SYN包,服務(wù)器回復(fù)確認包,并等待客戶的確認。由于源地址是不存在的,服務(wù)器需要不斷的重發(fā)直至超時,這些偽造的SYN包將長時間占用未連接隊列,正常的SYN請求被丟棄,導(dǎo)致目標(biāo)系統(tǒng)運行緩慢,嚴(yán)重者會引起網(wǎng)絡(luò)堵塞甚至系統(tǒng)癱瘓。

    SYN 攻擊是一種典型的 DoS/DDoS 攻擊。

  • 如何檢測 SYN 攻擊?

    檢測 SYN 攻擊非常的方便,當(dāng)你在服務(wù)器上看到大量的半連接狀態(tài)時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。在 Linux/Unix 上可以使用系統(tǒng)自帶的 netstats 命令來檢測 SYN 攻擊。

  • 如何防御 SYN 攻擊?

    SYN攻擊不能完全被阻止,除非將TCP協(xié)議重新設(shè)計。我們所做的是盡可能的減輕SYN攻擊的危害,常見的防御 SYN 攻擊的方法有如下幾種:

    • 縮短超時(SYN Timeout)時間
    • 增加最大半連接數(shù)
    • 過濾網(wǎng)關(guān)防護
    • SYN cookies技術(shù)

TCP KeepAlive

TCP 的連接,實際上是一種純軟件層面的概念,在物理層面并沒有“連接”這種概念。TCP 通信雙方建立交互的連接,但是并不是一直存在數(shù)據(jù)交互,有些連接會在數(shù)據(jù)交互完畢后,主動釋放連接,而有些不會。在長時間無數(shù)據(jù)交互的時間段內(nèi),交互雙方都有可能出現(xiàn)掉電、死機、異常重啟等各種意外,當(dāng)這些意外發(fā)生之后,這些 TCP 連接并未來得及正常釋放,在軟件層面上,連接的另一方并不知道對端的情況,它會一直維護這個連接,長時間的積累會導(dǎo)致非常多的半打開連接,造成端系統(tǒng)資源的消耗和浪費,為了解決這個問題,在傳輸層可以利用 TCP 的 KeepAlive 機制實現(xiàn)來實現(xiàn)。主流的操作系統(tǒng)基本都在內(nèi)核里支持了這個特性。

TCP KeepAlive 的基本原理是,隔一段時間給連接對端發(fā)送一個探測包,如果收到對方回應(yīng)的 ACK,則認為連接還是存活的,在超過一定重試次數(shù)之后還是沒有收到對方的回應(yīng),則丟棄該 TCP 連接。

TCP-Keepalive-HOWTO 有對 TCP KeepAlive 特性的詳細介紹,有興趣的同學(xué)可以參考。這里主要說一下,TCP KeepAlive 的局限。首先 TCP KeepAlive 監(jiān)測的方式是發(fā)送一個 probe 包,會給網(wǎng)絡(luò)帶來額外的流量,另外 TCP KeepAlive 只能在內(nèi)核層級監(jiān)測連接的存活與否,而連接的存活不一定代表服務(wù)的可用。例如當(dāng)一個服務(wù)器 CPU 進程服務(wù)器占用達到 100%,已經(jīng)卡死不能響應(yīng)請求了,此時 TCP KeepAlive 依然會認為連接是存活的。因此 TCP KeepAlive 對于應(yīng)用層程序的價值是相對較小的。需要做連接保活的應(yīng)用層程序,例如 QQ,往往會在應(yīng)用層實現(xiàn)自己的心跳功能。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容