第一次握手:客戶端向服務端傳送連線請求報文段,tcp報文段首部同步位syn=1,初始序號seq=x。客戶端程序進入同步傳送狀態。
第二次握手:服務端收到連線請求報文段後,向客戶端傳送確認報文段。把tcp報文段首部syn位和ack位置為1,初始序號seq=y,確認號ack=x+1。服務端進入同步接收狀態。
第三次握手:客戶端接收到確認報文段後,向服務端傳送ack報文段,ack位置為1,初始序號seq=x+1,確認號ack=y+1。tcp連線建立。
為什麼是三次握手而不是兩次?
為了防止已失效的連線請求報文段又傳送到服務端導致產生錯誤。例如:
有一種情況,客戶端傳送的連線請求報文段丟失了,進行超時重傳,建立tcp連線,資料傳輸,然後tcp連線釋放。但如果第一次傳送的請求報文段沒有丟失。只是在網路中滯留,延誤到上次連線釋放了才到達服務端。若是只有兩次握手,服務端接受到連線請求報文段,返回確認報文段,由於現在客戶端並沒有傳送連線請求報文段,所以不理睬確認報文段。服務端以為連線建立,一直等待客戶端傳送資料,服務端的資源被白白浪費。三次握手時,只有服務端接收到客戶端的ack報文段才會認為tcp連線建立了。
第一次揮手:客戶端向服務端傳送連線釋放報文段,報文段首部fin位設為1,序號seq=u,等於已經上傳資料的最後乙個位元組序號加1.
第二次揮手:服務端收到連線釋放報文段後,發出確認報文段,報文段首部ack位設為1,序號seq=v,位服務端最後傳送資料的最後乙個位元組序號加1,確認號ack=u+1.這是tcp連線處於半關閉狀態,客戶端不能傳送資料,服務端還可以傳送資料給客戶端。
第三次揮手:服務端沒有資料需要傳送給客戶端時,服務端傳送鏈結釋放報文段,報文段首部fin位設為1,ack位設為1,序號seq=w,確認號ack=u+1。服務端進入最後確認狀態,等待客戶端的確認。
第四次揮手,客戶端收到連線釋放報文段後,傳送確認報文段,ack位設為1,序號seq=u+1,確認號ack=w+1。
客戶端經過設定的一段時間才釋放tcp連線。服務段收到確認報文後立即釋放tcp連線。
tcp如何保證資料的可靠傳輸:
tcp是面向位元組流的,將tcp報文段看成一連串無結構的位元組流。要保證資料傳輸的可靠性無非就是從兩個角度保護資料:
TCP三次握手(建立連線) 四次揮手(關閉連線)
順序號 32位 用來標識從tcp源端向tcp目的端傳送的資料字節流,它表示在這個報文段中的第乙個資料位元組的順序號。如果將位元組流看作在兩個應用程式間的單向流動,則tcp用順序號對每個位元組進行計數。序號是32bit的無符號數,序號到達2 32 1後又從0開始。當建立乙個新的連線時,syn標誌為1 ...
TCP三次握手 四次揮手
tcp 三次握手 tcp 連線是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。以下步驟概述了通常情況下客戶端計算機聯絡伺服器計算機的過程 1.客戶端向伺服器傳送乙個syn置位的tcp報文,其中包含連線的初始序列號x和乙個視窗大小 表示客戶端上用來...
TCP三次握手 四次揮手
服務端的tcp程序先建立傳輸控制塊tcb,準備接受客戶端程序的連線請求,然後服務端程序處於listen狀態,等待客戶端的連線請求,如有,則作出響應。1 客戶端的tcp程序也首先建立傳輸控制模組tcb,然後向服務端發出連線請求報文段,該報文段首部中的syn 1,ack 0,同時選擇乙個初始序號seq ...