三次握手
四次揮手
正常情況下
同時揮手
SYN攻擊:
在三次握手過程中,Server發送SYN-ACK之后,收到Client的ACK之前的TCP連接稱為半連接(half-open connect),此時Server處于SYN_RCVD狀態,當收到ACK后,Server轉入ESTABLISHED狀態。SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,并向Server不斷地發送SYN包,Server回復確認包,并等待Client的確認,由于源地址是不存在的,因此,Server需要不斷重發直至超時,這些偽造的SYN包將產時間占用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡堵塞甚至系統癱瘓。SYN攻擊時一種典型的DDOS攻擊,檢測SYN攻擊的方式非常簡單,即當Server上有大量半連接狀態且源IP地址是隨機的,則可以斷定遭到SYN攻擊了,使用如下命令可以讓之現行: #netstat -nap | grep SYN_RECV
TIME_WAIT狀態是什么?
下文轉載自 TIME_WAIT是什么?
在TCP斷開的過程中會有四個狀態變化過程,如下圖所示:
在連接撤銷過程中,有如下過程:
- HOST1上的應用程序關閉己方的連接導致TCP發送一個FIN消息給HOST2。
- HOST2發送一個確認消息給HOST1,并且HOST2把FIN作為EOF遞交給HOST2上的應用程序。
- 一段時間過后,HOST2上的應用程序關閉它那邊的連接,引發一個FIN消息給HOST1。
- HOST1給HOST2發送一個確認消息,然后HOST2關閉連接并釋放資源,然而,HOST1卻沒有關閉連接,而是進入了TIME_WAIT狀態,并為兩個最大段生存時間(2MSL)保留在此狀態.
為什么需要TIME_WAIT?
因為在第四步的時候,HOST1發送的ACK可能丟失并導致HOST2重新發送FIN消息,TIME_WAIT維護連接狀態.
如果執行主動關閉的一方HOST1 不進入到TIME_WAIT狀態就關閉連接那會發生什么呢?當重傳的FIN消息到達時,因為TCP已經不再有連接的信息了,所以就用RST(重新啟動)消息應答,導致HOST2進入錯誤的狀態而不是有序終止狀態,如果發送最后ACK消息的一方處于TIME_WAIT狀態并仍然記錄著連接的信息,它就可以正確的響應對等方HOST2的FIN消息了.TIME_WAIT為連接中”離群的段”提供從網絡中消失的時間。
考慮一下,如果延遲或者重傳段在連接關閉后到達時會發生什么呢?通常情況下,因為TCP僅僅丟棄該數據并響應RST消息,所以這不會造成任何問題。當RST消息到達發出延時段的主機時,因為該主機也沒有記錄連接的任何信息,所以它也丟棄該段。然而,如果兩個相同主機之間又建立了一個具有相同端口號的新連接,那么離群的段就可能被看成是新連接的,如果離群的段中數據的任何序列號恰恰在新連接的當前接收窗口中,數據就會被重新接收,其結果就是破壞新連接。