【計算機基礎】【計算機網絡】TCP三次握手和四次揮手等經典問題總結

1、TCP三次握手

1.1TCP首部解析圖和TCP三次連接首部內容變化圖

首部內容說明:重要的內容加粗

(1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。

(2)確認序號:Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1。

(3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

(A)URG:緊急指針(urgent pointer)有效。

(B)ACK:確認序號有效。

(C)PSH:接收方應該儘快將這個報文交給應用層。

(D)RST:重置連接。

(E)SYN:發起一個新連接。

(F)FIN:釋放一個連接。

注意:

(A)不要將確認序號Ack(代表確認號序號下面那個內容,圖一中的201和501)與標誌位中的ACK搞混了。

(B)確認方Ack=發起方Req+1,兩端配對。

1.2 三次握手對應首部變化

  • 第一次握手:序號:X;SYN標誌位:1;
  • 第二次握手:序號:Y;確認號:X+1;SYN標誌位:1;ACK標誌位:1;
  • 第三次握手:序號:Z;確認號:Y+1;ACK標誌位:1;

1.3 爲什麼是三次握手而不是兩次?知其然更要知其所以然

  • 傳統意義上解釋:防止已失效的連接請求又傳送到服務器端,因而產生錯誤

       根本性探究:爲了實現可靠數據傳輸, TCP 協議的通信雙方, 都必須維護一個序列號, 以標識發送出去的數據包中, 哪些是已經被對方收到的。 三次握手的過程即是通信雙方相互告知序列號起始值, 並確認對方已經收到了序列號起始值的必經步驟。如果只是兩次握手, 至多隻有連接發起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認。我們可以通過圖一看出ACK代表着確認,如果兩次的話很清晰的能夠看出:客戶端能夠ACK服務端的信息,但是服務端無法確認客戶端是否已經收到了信息,從而導致了問題1⃣️的答案。原文博客:https://blog.csdn.net/lengxiao1993/article/details/82771768

2、TCP四次揮手過程

2.1 TCP四次揮手流程圖

流程解析:

1)假設Client端發起中斷請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說“我client端要發給你了”,但是如果你還沒有數據要發送完成,則不必急着關閉Socket,可以繼續發送數據。所以所以你先發送ACK,"告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。

2)當Server端確定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉連接了"。

3)Client端收到FIN報文後,"就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,

4)Server端收到ACK後,"就知道可以斷開連接了"。Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了!

注意:在TIME_WAIT狀態中,如果TCP client端最後一次發送的ACK丟失了,它將重新發送。TIME_WAIT狀態中所需要的時間是依賴於實現方法的。典型的值爲30秒、1分鐘和2分鐘。等待之後連接正式關閉,並且所有的資源(包括端口號)都被釋放

2.2爲什麼連接是三次握手,關閉是四次握手

      因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

2.3爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

原因一:保證TCP全雙工連接的可靠釋放

假設場景爲客戶端主動向服務器發起斷開連接,假如在主動方(客戶端)最後一次發送的ACK在網絡中丟失,根據TCP的超時重傳機制,被動方(服務器)需要重新向客戶端發送FIN+ACK,在FIN未達到之前,必須維護這條連接;並且要接收到客戶端發出的ACK確認後才能終止連接;如果直接在重傳的FIN到達之前而關閉連接,當FIN到達後會促使客戶端TCP傳輸層發送RST重新建立連接,而本質上這是一個正常斷開連接的過程。

4次握手的最後一個ACK是是由主動關閉方發送出去的,若這個ACK丟失,被動關閉方會再次發一個FIN過來;若主動關閉方能夠保持一個2MSL的TIME_WAIT狀態,則有更大的機會讓丟失的ACK被再次發送出去。

原因二:爲了使就得數據包在網絡中因過期而失效

    爲什麼是兩個2MSL的原因:如果不到2MSL就斷開連接,新連接又以舊連接相同的端口和ip連接服務器,就連接的重複數據報到達又會干擾第二個連接;2MSL(報文在網絡最大生存時間)在發送完最後一個ACK報文段後,再經過實踐2MSL,就可以使本連接持續的時間內所產生的所有報文段,都從網絡中消失。這樣就可以使下一個新的連接中不會出現這種就得連接請求報文段。

3、SYN攻擊

Syn攻擊就是客戶端 在短時間內僞造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回覆確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直至超時,這些僞造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

Syn攻擊是一個典型的DDOS攻擊。檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊.在Linux下可以如下命令檢測是否被Syn攻擊

netstat -n -p TCP | grep SYN_RECV

一般較新的TCP/IP協議棧都對這一過程進行修正來防範Syn攻擊,修改tcp協議實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等.但是不能完全防範syn攻擊。

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章