TCP/IP協議及互聯網常見應用和協議的原理——面試題

TCP:TCP協議位於傳輸層,是一種可靠的傳輸控制層協議。

TCP/IP協議在分層中的位置:

TCP/IP協議通過“三次握手”建立連接,併發送數據,結束後以“四次揮手”的形式終止連接。

所謂三次握手(Three-Way Handshake)即建立TCP連接,就是指建立一個TCP連接時,需要客戶端和服務端總共發送3個包以確認連接。報文需要加標識以代表雙方何種接收方式以及表示傳輸的過程,涉及的英文表示:

SYN:同步

seq:序列號

ACK:確認位

ack:確認位的值

一、三次握手過程:

  1. 客戶端(左側)向服務器端發送數據,需要建立TCP連接;客戶端發送報文,並讓報文頭部包含SYN=1,seq=x(同步=1,序列號=x);
  2. 服務器端:服務器端LISTEN(監聽)到客戶端發來的數據,立即向客戶端發送確認報文,並讓報文頭部包含SYN=1,ACK=1(大寫的ACK表示確認位,=1表示已確認收到信息),seq=y, ack=x+1;(小寫的ack表示確認位的值,ack)
  3. 客戶端:客戶端收到服務器端發送的報文,然後同樣向服務器端發送一個確認報文,(表示,已收到你的消息),並讓報文頭部包含ACK=1,seq=x+1(seq=x+1表示客戶端兩次連續發送過程),ack=y+1;
  4. 連接建立成功。客戶端可以發送數據了。

整個過程中,始於客戶端要發送信息,終與服務器端接收信息,然後彼此都不信任對方是否準備好。

因此客戶端先打招呼,“我要發送數據給你,你OK嗎?"

服務器端:“I‘m OK,你可以發送”

客戶端:“好的,那我要發送數據,你準備接收”

服務器端:”進入接收狀態“。

建立連接成功。

二、爲什麼要三次握手而不是二次

答:主要爲了防止已失效的連接請求報文段突然又傳送到了接收端(服務器),因而產生錯誤。

舉例:如客戶端A發出連接請求,但因連接請求報文S1丟失而未收到確認,於是A在重傳一次連接請求S2

後來收到了服務器端B的確認,建立了連接。數據傳輸完畢後,連接釋放。

在這個過程中,A總共發出了兩個連接請求報文段,其中第一個丟失,第二個到達了B,但是第一個丟失的報文段只是在某些網絡節點長時間滯留了,延誤到連接釋放以後的某個時間纔到達B。

如果只有兩次握手,此時B誤以爲A又發出一次連接請求,於是就向A發出確認報文段,同意建立連接,不採用三次握手,只要B發出確認,就建立新的連接了,此時如果A不理睬B的確認且不發送數據,則B要一直等待A發送數據,浪費資源。

二、四次揮手過程

  1. Client端發起中斷連接請求,也就是發送FIN報文。意思是說"我Client端沒有數據要發給你了",但是如果你還有數據沒有發送完成,則不必急着關閉Socket,可以繼續發送數據。
  2. Server端接到FIN報文後,發送ACK,告訴Client端,“你的請求我收到了,但是我還沒準備好,請繼續你等我的消息"。
  3. 這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。
  4. 當Server端確定數據已發送完成,則向Client端發送FIN報文,告訴Client端,”好了,我這邊數據發完了,準備好關閉連接了"。
  5. Client端收到FIN報文後,就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳
  6. Server端收到ACK後,就知道可以斷開連接了。
  7. Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。Ok,TCP連接就這樣關閉了! 

 

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