面試問題之計算機網絡:TCP三次握手四次揮手


轉載於:https://www.cnblogs.com/Andya/p/7272462.html

TCP三次握手:

  起初A和B都處於CLOSED關閉狀態

  B創建TCB,處於LISTEN收聽狀態,等待A請求

  第一次握手:A創建TCB,發送連接請求,進入SYN-SENT同步已發送狀態

  第二次握手:B收到連接請求,向A發送確認和連接請求,進入SYN-RCVD同步收到狀態

  第三次握手:A收到B的確認和 連接請求后,向B發出確認,A進入ESTABIISHED已連接狀態。

  B收到A的確認收進入ESTABLISHED已連接狀態。

TCP四次揮手:

  起初A和B處於ESTABLISHED狀態

  第一次揮手:A發出連接釋放報文段並處於FIN-WAIT-1終止等待1狀態;

  第二次揮手:B發出確認報文段且進入CLOSE-WAIT關閉等待狀態;

  A收到B的確認后,進入FIN-WAIT-2終止等待2狀態,等待B的連接釋放報文段;

  第三次揮手:B沒有要向A發出的數據,B發出連接釋放報文段且進入LAST-ACK最后確認狀態;

  第四次揮手:A發出確認報文段且進入TIME-WAIT時間等待狀態;

  B收到確認報文段后進入CLOSED狀態

   A經過等待計時器時間2MSL后,進入CLOSED狀態。

 

相關問題:

(1)為什么A還要發送一次確認呢?可以二次握手嗎?

  答:主要為了防止已失效的連接請求報文段突然又傳送到了B,因而產生錯誤。如A發出連接請求,但因連接請求報文丟棄而未收到確認,於是A再重傳一次連接請求。后來收到了確認,建立連接。數據傳輸完畢后,就釋放了連接,A共發出了兩個連接請求報文段,其中第一個丟失,第二個到達了B,但是第一個丟失的報文段只是在某些網絡結點長時間滯留了,延誤到連接釋放以后的某個時間才到達B,此時B誤認為A又發出了一次新的連接請求,於是向A發出確認報文段,同意建立連接,不采用三次握手,只要B發出確認,就建立新的連接了,此時A不理睬B的確認且不發送數據,則B一直等待A發送數據,浪費資源。

(2)為什么Server端易受到SYN攻擊?

服務端的資源分配是在第二次握手時分配的,而客戶端的資源是在完成三次握手時分配的,所以服務器容易受到SYN洪范攻擊,SYN攻擊就是Client在短時間內偽造大量不存在的IP地址,並向Server不斷地發送SYN包,Server則回復確認包,並等待Client確認,由於源地址不存在,因此Server需要不斷重發直至超時,這些偽造的SYN包將長時間占用未連接隊列,導致正常的SYN請求因為隊列滿而被丟棄,從而引起網絡擁塞甚至系統癱瘓。

防范SYN攻擊措施:降低主機的等待時間使主機盡快的釋放連接的占用,短時間受到某IP的重復SYN則丟失后序請求。

(3)為什么A在TIME-WAIT狀態必須等待2MSL的時間?

MSL最長報文段壽命MAXinum segment Lifetime,MSL=2,超過這個時間報文會被丟棄

答:兩個理由

  1)保證A發送的最后一個ACK報文段能夠到達B。這個ACK報文段有可能丟失,使得處於LAT-ACK狀態的B收不到對已發送FIN+ACK報文段的確認,B超時重傳FIN+ACK報文段,而A能在2MSL時間內收到這個重傳的FIN+ACK報文段,接着A重傳一次確認,重新啟動2MSL計時器,最后A和B都進入到CLOSED狀態,若A在TIME-WAIT狀態不等待一段時間,而是發送完ACK報文段后立即釋放連接,則無法收到B重傳的FIN+ACK報文段,所以不會再發送一次確認報文段,則B無法正常進入到CLOSED狀態。

  2)防止“已失效的連接請求報文段”出現在本連接中。A在發送完最后一個ACK報文段后,再經過2MSL,就可以使本連接持續時間內所產生的所有報文段都從網絡中消失,使下一個新的連接中不會出現這種舊的連接請求報文段。

(4)為什么連接的時候是三次握手,關閉的時候卻是四次揮手

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

 

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM