面試有關TCP常問的幾個問題

在面試中網絡問題是一定會考察的,而TCP協議則是考察網絡知識的重點。經常會被問道的問題如下:

  1. 請講一下TCP協議建立連接的過程
  2. 請介紹TCP協議中的三次握手和四次揮手是怎麼樣的
  3. 爲什麼TCP協議要三次握手來確立連接,而不是兩次,也不是4次
  4. TCP連接發起是的syn序號爲什麼不能從同一個序號開始,比如說1

三次握手過程

首先需要服務器監聽特定的端口,等待客戶端來請求連接。當客戶端需要建立連接時,客戶端會先向服務器發送syn報文,將報文中syn置爲隨機生成的序號n(這裏假設序號爲1000)。服務器收到同步報文後,會回覆一個ack報文,把ACK位置位n+1(這裏的序號應該爲1001),同時設置syn爲y(這裏假設爲2000)。客戶端收到服務器發送的ack報文後,會回覆一個ACK報文給服務器,其中ACK位置爲y+1(這裏即爲2001)。當服務器收到ACK消息後,即認爲連接進入穩定狀態。

四次揮手過程

當client從app接收到關閉指令後,client會給server發送FIN消息(表明client不會再給server發送數據),client進入finish-wait-1狀態。server收到finish消息後,回覆確認消息ack給client,自身進入close-wait狀態。client接收到ack消息後,進入到FIN-WAIT-2狀態。並且在此狀態等待服務器發送finish消息。當server接收到app的關閉指令後,server給client發送FIN消息。服務器進入到LAST-ACK狀態。客戶端收到FIN消息後,會回覆ACK消息,同時進入到TIME-WAIT狀態,來等待server收到ack消息,客戶端會在接下來的2MSL(maximum segment lifetime)的時間內保持TIME-WAIT狀態。爲什麼是2MSL時間呢,一是爲了server有足夠的時間收到ACK消息,並在消息丟失時重發。二是爲了在此連接結束後的後續連接提供緩衝期。如果不是2倍MSL的話,就可能混合來自不同連接的數據包,造成消息混亂。

爲什麼TCP協議要三次握手來確立連接,而不是兩次,也不是4次

首先呢,根本不存在可靠的連接,tcp只是提供相對可靠的連接。三次握手的主要目的是交換通信需要的參數,主要是server與client的syn序號,這個序號是用於收發數據的。如果只有兩次握手的話,當服務器發送ack+syn消息後,就會認爲建立了穩定連接,這個時候如果ack+syn丟失了,client並沒有收到這個消息,那麼客戶端就會認爲連接建立不成功,而直接進入close狀態。這樣就會造成,server一直在哪傻等,永遠不會有client來發送數據,這就會造成服務器資源的浪費。至於爲什麼不是四次握手,是因爲握手三次成功以後,就可以認定當前連接是可靠的了,不然的話還需要client與server互相之間發送ack消息,這樣就無休無止了。

TCP連接發起是的syn序號爲什麼不能從同一個序號開始,比如說1

因爲現實中的網絡狀況不可預知,比如說客戶端在第一次連接時,使用序號爲1爲初始序號進行數據發送,發送了1到30的數據片段,這個時候因爲網絡問題斷開了連接。然後客戶端是syn爲1重新建立了新的連接,這個時候服務器收到了之前發送的30個字節的數據,服務器就會以爲這30個字節的數據是新發的,這就會導致數據混亂。

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