三次握手
第一次握手:
客戶端傳送tcp包,置syn標誌位為1,將初始序號x,儲存在包頭的序列號(seq)裡
第二次握手:服務端回應確認包,置syn標誌位為1,置ack為x+1,將初始序列號y,儲存在包頭序列號裡
第三次握手:客戶端對服務端的確認包進行確認,置syn標誌位為0,置ack為y+1,置序列號為z
tcp建立連線為什麼是三次握手,而不是兩次或四次?
tcp,名為傳輸控制協議,是一種可靠的傳輸層協議,ip協議號為6。
順便說一句,原則上任何資料傳輸都無法確保絕對可靠,三次握手只是確保可靠的基本需要。
第一次握手服務端可以確認自己收報文與客戶端發報文功能都正常
第二次握手客戶端確認自己收發報文與服務端收發報文功能都正常,也就認為連線已建立
第三次,服務端確認雙方都能夠正常通訊
如果不進行第三次握手,服務端對客戶端的請求進行回應(第二次握手)後,就會理所當然的認為連線已建立,而如果c並沒有收到s的回應呢?此時,c仍認為連線未建立,s會對已建立的連線儲存必要的資源,如果大量的這種情況,s會崩潰。
因此第三次握手是必要的。
四次揮手
先由客戶端向伺服器端傳送乙個fin,請求關閉資料傳輸。
當伺服器接收到客戶端的fin時,向客戶端傳送乙個ack,其中ack的值等於fin+seq
然後伺服器向客戶端傳送乙個fin,告訴客戶端應用程式關閉。
當客戶端收到伺服器端的fin是,回覆乙個ack給伺服器端。其中ack的值等於fin+seq
確保資料能夠完整傳輸。
當被動方收到主動方的fin報文通知時,它僅僅表示主動方沒有資料再傳送給被動方了。
但未必被動方所有的資料都完整的傳送給了主動方,所以被動方不會馬上關閉socket,它可能還需要傳送一些資料給主動方後,
再傳送fin報文給主動方,告訴主動方同意關閉連線,所以這裡的ack報文和fin報文多數情況下都是分開傳送的。
tcp報文格式圖:
上圖中有幾個字段需要重點介紹下:
(1)序號:seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。
(2)確認序號:ack序號,佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack=seq+1。
(3)標誌位:共6個,即urg、ack、psh、rst、syn、fin等,具體含義如下:
(a)urg:緊急指標(urgent pointer)有效。
(b)ack:確認序號有效。
(c)psh:接收方應該盡快將這個報文交給應用層。
(d)rst:重置連線。
(e)syn:發起乙個新連線。
(f)fin:釋放乙個連線。
需要注意的是:
(a)不要將確認序號ack與標誌位中的ack搞混了。
(b)確認方ack=發起方req+1,兩端配對。
理解tcp/ip三次握手與四次揮手的正確姿勢
tcp建立連線為什麼是三次握手,為什麼不是兩次或四次?
TCP三次握手 四次揮手
tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...
TCP三次握手 四次揮手
服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...
TCP三次握手四次揮手
tcp transmission control protocol 傳輸控制協議 tcp是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立乙個連線。位碼即tcp標誌位,有6種標誌 urg urgent緊急 ack acknowledgement 確認 psh push傳送 rst...