重點重點重點
tcp狀態遷移
tcp在傳輸資料之前,需要建立連線,所有tcp都是乙個面向連線的、可靠的、安全的、有效的傳輸協議
三次握手
三次握手後變為establish狀態,可以傳輸資料
1、一開始,客戶端和服務端都處於closed狀態。先是伺服器端主動監聽某個埠,處於listening狀態
2、客戶端會初始化序號(client_isn),同時傳送syn報文給服務端,表示向服務端發起鏈結,之後客戶端處於syn-sent狀態(第一次握手)。
3、服務端收到客戶端syn報文後,首先服務端也會隨機初始化自己的序號(server_isn),之後將確認應答號ack填入(client+1),接著把syn和ack標誌位置為1.最後把該報文發給客戶端,該報文也不包含應用層資料,之後服務端處於syn-rcvd狀態(第二次握手)。
4、客戶端收到服務端報文後首先該應答報文tcp首部ack標誌位置為1,其次[確認應答號]字段填入server_isn+1,最後把報文傳送給服務端,這次報文可以攜帶客戶到伺服器的資料,之後客戶端處於established狀態。伺服器收到客戶端應答報文後,也進入established狀態(第三次握手)。
四次揮手
1、客戶端打算關閉鏈結,會向伺服器傳送乙個fin的報文,之後客戶端進入fin_wait狀態(第一次揮手);
2、伺服器收到報文後,向客戶端傳送ack應答報文,接著伺服器端進入closed_wait狀態,客戶端收到服務端的ack,進入fin_wait_2(第二次揮手);
3、等伺服器處理完資料後,也向客戶端傳送fin報文,服務端進入last_wait狀態(第三次揮手);
4、客戶端收到服務端的fin報文後,回乙個ack報文,之後進入time_wait狀態(第四次揮手);
伺服器收到了ack應答報文後,就進入了close狀態,至此服務端已經完成了鏈結的關閉
客戶端在結果2msl一段時間後,自動就進入了close狀態,至此客戶端也完成鏈結的關閉
三握四揮的問題
為什麼是三次握手
+三次握手可以阻止歷史重複連線的初始化
+如果是兩次握手鏈結就不能判斷當前連線是否是歷史鏈結,三次握手則可以再客戶端(傳送方)準備傳送第三次報文時,客戶端因有足夠的上下文來判斷當前連線是否是歷史連線
+三次握手才可以同步雙發的初始化序列號
+三次握手才可以避免資源浪費
+兩次握手會造成訊息滯留情況下,伺服器重複接受無用的連線請求syn報文,而造成重複分配資源
為什麼是四次揮手
+主動關閉連線才會有time_wait狀態
+關閉時,傳送fin時,只是表示不在傳送資料了,但是還接收資料,服務端通常需要等待完成資料的傳送和處理,所以服務端的ack和fin一般都會分開傳送,從而比三次握手導致多了一次
為什麼time_wait等待的時間是2msl
+msl:報文最大生存時間
+2msl的時間是從客戶端收到fin後傳送ack開始計時的等待時間2倍的msl,
+比較合理的解釋是:網路中可能存在來自傳送方的資料報,當這些傳送方的資料報被接收方處理後又會向物件傳送響應,所以一來一回需要等待2倍的時間。
tcp三握四揮
第一次握手 客戶端傳送syn包給伺服器,syn 1,序列號seq x,客戶端進入syn sent狀態 第二次握手 伺服器收到syn包以後返回報文,ack x 1,ack 1,syn 1,同時生成序列號seq y,進入syn rcvd狀態 第三次握手 客戶端收到伺服器的報文以後,返回給伺服器ack y...
深入理解TCP三握四揮
面試中被問到不少次tcp的三握四揮,今天特意來做乙個總結 一些資料是很久前找的,忘了參考的鏈結了 首先來看一張圖 最初,客戶機a與伺服器b的tcp程序都處於 closed 狀態。然後由伺服器b先建立tcb 傳輸控制塊 進入到listen 狀態,準備隨時響應客戶請求 下面開始三握 a的tcp程序建立t...
TCP的三握四揮,及與UDP的區別
1.osi模型七層結構 在osi分層 7層 物理層 資料鏈路層 網路層 傳輸層 會話層 表示層 應用層。每一層的協議如下 物理層 rj45 clock ieee802.3 中繼器,集線器,閘道器 資料鏈路 ppp fr hdlc vlan mac 網橋,交換機 網路層 ip icmp arp 位址解...