【協議森林】TCP三次握手和SYN***

在平常分析和定位生產環境的問題時,常常會碰到各類各樣的網絡問題,查看應用監聽端口上鍊接的數量、各類狀態的鏈接數量分佈成爲經常使用的手段之一。但一些同窗看不懂使用netstat過濾出來的各類狀態是什麼含義以及各類狀態的鏈接數量分佈可能存在什麼問題。面試

其實只要弄懂了TCP/IP創建鏈接(即三次握手)和關閉鏈接(即四次揮手),上面的問題迎刃而解。這也是爲何TCP三次握手四次揮手是面試中出現頻率最高的問題之一,見服務器後臺開發面試題總結(請戳我)。這篇文章主要就來總結下三次握手及其三次握手可能帶來的一個問題---SYN***。緩存

TCP三次握手過程

下面是TCP三次握手的示意圖,基本上講TCP三次握手的文章都會拿下面這幅圖來說解,這裏也不例外。
【協議森林】TCP三次握手和SYN***
第一次握手:client首先發送SYN(Synchronization)報文給server,此時,client進入SYN_SENT狀態,等待server端確認;注:SYN報文的特色:SYN標識位置1,隨機產生一個值seq=X,佔用一個序列號。服務器

第二次握手:server收到client發過來的SYN包後知道client請求創建鏈接,將產生一個SYN+ACK包發送給client以確認鏈接請求,此時server進入SYN_RCVD狀態;注:SYN+ACK包的特色:SYN和ACK標識位都爲1,ack=X+1,隨機產生的seq=Y。網絡

第三次握手:client收到server的SYN+ACK包,向server發送確認包ACK(ack=Y+1),此包發送完畢,client和server進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。分佈式

完成三次握手,客戶端與服務器開始傳送數據,其實在第三次握手的同時,client就能夠向sever發送數據了。ide

爲何是三次握手

關於三次握手的目的,謝希仁的《計算機網絡》中這麼說「爲了防止已失效的鏈接請求報文段忽然又傳送到了服務端,於是產生錯誤」。學習

「已失效的鏈接請求報文段」的產生在這樣一種狀況下:client發出的第一個鏈接請求報文段並無丟失,而是在某個網絡結點長時間的滯留了,以至延誤到鏈接釋放之後的某個時間纔到達server。原本這是一個早已失效的報文段。但server收到此失效的鏈接請求報文段後,就誤認爲是client再次發出的一個新的鏈接請求。因而就向client發出確認報文段,贊成創建鏈接。計算機網絡

假設不採用「三次握手」,那麼只要server發出確認,新的鏈接就創建了。因爲如今client並無發出創建鏈接的請求,所以不會理睬server的確認,也不會向server發送數據。但server卻覺得新的運輸鏈接已經創建,並一直等待client發來數據。這樣,server的不少資源就白白浪費掉了。採用「三次握手」的辦法能夠防止上述現象發生。例如剛纔那種狀況,client不會向server的確認發出確認。server因爲收不到確認,就知道client並無要求創建鏈接。」server

若是上面的解釋太學術化了,仍是有點蒙,不要緊,看點生動形象點的東西吧(來自知乎網友的一個回答)。
三次握手
A:「喂,你聽獲得嗎?」
B:「我聽獲得呀,你聽獲得我嗎?」
A:「我能聽到你」,今天blabla.....blog

三次握手正常創建鏈接

兩次握手
A:「喂,你聽獲得嗎?」
B:「我聽獲得呀」
A:「喂,你聽獲得嗎?」 ----問題:A有可能沒聽到B的回答
B:「草,我聽獲得呀!!!!」
A:「你TM能不能聽到我講話啊!!喂!」

兩次握手不能保證成功率

四次握手
A:「喂,你聽獲得嗎?」
B:「我聽獲得呀,你聽獲得我嗎?」
A:「我能聽到你
B:你能聽到我嗎? ----問題:此次徹底是不必的
A:「……不想跟傻逼說話」

四次握手純粹是浪費資源

SYN***

若是理解了TCP三次握手的原理,再來理解SYN***相信不是什麼難事了。下面來看看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***了
【協議森林】TCP三次握手和SYN***

推薦閱讀:

精心整理 | 2017下半年文章目錄
神經網絡淺講:從神經元到深度學習(一)
互聯網協議入門(一)
億級Web 系統的容錯性實踐【下】
分佈式緩存---Memcached

專一服務器後臺技術棧知識總結分享

歡迎關注交流共同進步

【協議森林】TCP三次握手和SYN***

碼農有道 coding

碼農有道,爲您提供通俗易懂的技術文章,讓技術變的更簡單!

相關文章
相關標籤/搜索