TCP面試詳解(連接處理)

核心概念:

無論是三次握手還是四次揮手,TCP都分爲兩個方向:client向server建立/斷開連接 && server向client建立/斷開連接

1、TCP三次握手
在這裏插入圖片描述

A <------> B
/* 1、2兩步建立client_to_server的連接 */
(1)A發送同步包(SYN+seq);
(2)B確認收到A的同步包,並返回確認包(ACK+ack+seq);

/* 3、4兩步建立server_to_client的連接 */
(3)B發送同步包(SYN+seq);
(4)A確認收到B的同步包,並返回確認包(ACK+ack+seq);

很顯然(2)和(3) 這兩個步驟可以合併,只需要三次握手,可以提高連接的速度與效率。

2、TCP四次揮手
在這裏插入圖片描述

(1) A向B發送結束包(FIN+seq);
(2) B確認收到A的結束包,向A發送確認包(ACK+ack+seq);

此時A到B的連接斷開,A不能發數據兩,但是還能接收B的數據,所以要等待B發完數據之後,B再發送結束包;

(3)B發送結束包(FIN+seq)以及確認包(ACK+ack);
(4)A接受B的結束包,發送確認包(ACK+ack+seq);

A發送完確認包後,後等待2MSL(Maximum Segment Lifetime):
第一,保證A發送的確認包到達B;
第二,保證本次連接持續時間內所產生的所有報文段,都從網絡中消失,這樣新的連接中不會出現舊連接的請求報文。

3、問題

(1)爲什麼要第三次握手?

一句話,主要防止已經失效的連接請求報文突然又傳送到了服務器,從而產生錯誤。
如果使用的是兩次握手建立連接,假設有這樣一種場景,客戶端發送了第一個請求連接並且沒有丟失,只是因爲在網絡結點中滯留的時間太長了,由於TCP的客戶端遲遲沒有收到確認報文,以爲服務器沒有收到,此時重新向服務器發送這條報文,此後客戶端和服務器經過兩次握手完成連接,傳輸數據,然後關閉連接。此時此前滯留的那一次請求連接,網絡通暢了到達了服務器,這個報文本該是失效的,但是,兩次握手的機制將會讓客戶端和服務器再次建立連接,這將導致不必要的錯誤和資源的浪費。
如果採用的是三次握手,就算是那一次失效的報文傳送過來了,服務端接受到了那條失效報文並且回覆了確認報文,但是客戶端不會再次發出確認。由於服務器收不到確認,就知道客戶端並沒有請求連接。

(2)爲什麼要2MSL?

答案在上面

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