1. 程式人生 > 其它 >計算機網路高頻面試題-TCP/UDP

計算機網路高頻面試題-TCP/UDP

一、TCP和UDP區別是什麼

答:TCP 和 UDP協議都是運輸層的

1、TCP面向連線的;UDP是無連線的,即傳送資料之前不需要建立連線。

2、TCP提供可靠的服務,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序列達到達; 而UDP盡最大努力交付,不保證可靠交付。

3、TCP面向位元組流,實際上是TCP吧資料看成一連串的無結構的位元組流;UDP是面向報文的;UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低。(對實時通話等)

4、每一條TCP連線只能是點到點的;UDP一對一,一堆多,多對一和多堆多的互動通訊。

5、TCP首部開銷20位元組,UDP首部開銷更小,只有8個位元組。

 

TCP頭部

 

 

TCP是如何保證可靠傳輸

1.應用資料被分割成TCP認為最適合的資料庫

2.TCP給傳送的每一個包進行編號,接受方對資料包進行排序,把有序資料傳送給應用層。

3.校驗和:TCP將保持它的首部和資料的校驗和。這是一個端到端的校驗和,目的是檢測資料在傳輸過程中傳送的任何變化。

如果收到端的校驗有差錯,TCP將丟棄這個報文段和不確認收到此報文段。

4.TCP的接受端會丟棄重複的資料

5.流量控制:TCP連線的每一方都有固定大小的緩衝空間,TCP的接收端只允許傳送端 傳送接收端緩衝區能接納的資料。

當接收方來不及處理髮送方的資料,能提示傳送方降低速率,防止包丟失。TCP使用流量控制協議是可變大小的滑動視窗協議(TCP利用滑動視窗實現流量控制)

6.擁塞控制:當網路擁塞時,減少資料的傳送

7.ARQ協議:為了實現可靠傳輸,它的基本原理就是每發完一個分組就停止傳送,等待對方確認。在收到確認後再發下一個分組。

8.超時重傳:當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到的這個報文段,如果不能及時收到一個確認,將重發這個報文段。

 

二、TCP的三次握手和四次揮手

三次握手

 

 

 

1、客戶端、服務端首先都處於CLOSED狀態。服務端開啟某個服務後會主動監聽某個埠,處於LISTEN狀態

2、客戶端   請求伺服器會隨機初始化序號,將此序號置於TCP首部的【序號】欄位中,同時把SYN標誌位置置為1

表示SYN報文。接著把一個SYN報文傳送給服務端,向服務端發起連線,該報文不包含應用層資料,之後客戶端處於SYN-SEND狀態

3、服務端收到客戶端的SYN報文後,首先服務端也隨機初始化自己的序號(server_isn),將此序號填入TCP首部的【序號中】其次把TCP首部的【確認應答號】欄位填入

client_isn+1,接著置SYN=1,ACK=1。最後把該報文傳送給客戶端,該報文也不包含應用層資料,之後服務端處於SYN-RECEIVED。

4、客戶端收到服務端報文後,還要向服務端迴應最後一個應答報文,首先硬蛋報文TCP首部ACK標誌位1,其次確認應答號server_isn+1,最後把報文傳送給服務端,這次報文可以

攜帶客戶到服務端的資料,之後處於ESTABLISHED狀態

5、服務端收到應答報文後,也進入了ESTABLISHED狀態。

 

四次握手

 

1、客戶端打算關閉連線,此時傳送一個TCP首部FIN標誌位被置為1的報文,也即FIN報文,之後客戶端進FIN_WAIT_1狀態

2、服務端收到該報文,就向客戶端傳送ACK應答報文,接著進入CLOSED_WAIT狀態。

3、客戶端收到服務端ACK應答報文後,之後進入FIN_WAIT_2狀態

4、等待服務端處理完資料後,也向客戶端傳送FIN報文,之後服務端進入LAST_ACK狀態。

5、客戶端收到服務端的FIN報文後,回一個ACK應答報文進入TIME_WAIT狀態

6、服務端收到ACK應答報文後,進入CLOSED狀態,至此關閉服務端

7、客戶端在經過2MSL一段時間後,自動進入CLOSED狀態,至此客戶端關閉連線。

 

 

追問:為什麼不能是兩次握手,或者四次握手的原因:

兩次:無法防止歷史連線的建立,會造成雙方自願的浪費,也無法可靠的同步雙方序列號。

四次:三次握手理論上可以建立更少的連線,四次握手更多會增大開銷,浪費計算機資源。

 

為什麼TIME_WAIT等待的時間是2MSL?

MSL:報文最大生存時間,它是任何報文在網路上的存在的最長時間,超過這個時間報文會被丟棄。

TIME_WAIT等待2MSL 網路中可能存在來自發送方的資料包,當這些傳送方的資料報備接收方處理後又會在向對方傳送響應,所以一來一回是2MSL。 2倍的MSL時間

 

2MSL的時間客戶端接受到FIN後傳送ACK開始計時,如果TIME-WAIT時間內,因為客戶端ACK沒有傳輸到服務端,服務端會又傳送FIN報文,客戶端接受到了重發的FIN報文,那麼2MSL時間重新計時。

LINUX中一般2MSL為60秒,一個MSL未30秒。

 

追問:為什麼需要TIME_WAIT

防止相同的【四元組】的【舊】資料被收到;

保證【被動關閉連線】的一方能被正確的關閉,即保證最後的ACK能被被動關閉放收到,從而幫助其遠端關閉。

 

追問:為什麼要四次揮手

因為當服務端收到客戶端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。

但是關閉連線時,當服務端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴客戶端,“你發的FIN報文我收到了”。

只有等到我服務端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送,故需要四次揮手。

 

追問:TIME_WAIT過多的危害

1、記憶體資源佔用過多 浪費

2、埠的佔用,一個TCP連線至少消耗一個埠。

 

擁塞控制的演算法:

1、慢啟動

2、擁塞避免

3、擁塞發生

4、快速恢復