什麼是三次握手
三次握手(three-way handshake)是指在建立乙個tcp連線時,需要客戶端和伺服器總共傳送三個包。進行三次握手的主要作用是為了確認雙方的接受能力和傳送能力是否正常、指定自己的初始化序列號為後面可靠性傳輸做準備。
實質上其實就是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號,交換tcp視窗大小的資訊。滑動視窗本質上是描述接受方的tcp資料報緩衝區大小的資料,傳送方根據這個資料來計算自己最多能傳送多長的資料。如果傳送方收到接受方的視窗大小為0的tcp資料報,那麼傳送方將停止傳送資料,等到接受方傳送視窗大小不為0的資料報的到來。
過程描述:
剛開始客戶端處於closed狀態,服務端處於listen狀態。
第一次握手,客戶端給服務端傳送乙個syn報文,並指明客戶端的初始化序列號isn(c)此時客戶端處於syn_send狀態。首部的同步位syn=1,初始序號為seq=x,syn=1的報文段不能攜帶資料,但是需要消耗掉乙個序號。
第二次握手,伺服器接受到客戶端的syn報文之後,會以自己的syn報文進行應答,並且指定了自己的初始化序列號isn(s)同時會把客戶端的isn+1作為ack的值,表示自己已經收到了客戶端的syn,此時伺服器處於syn_revd狀態。在確認報文段中syn=1,ack=1,確認號ack=x+1,初始序號seq=y。
第三次握手,客戶端收到syn報文之後,會傳送乙個ack報文,一樣也會把伺服器的isn+1作為ack的值,表示已經收到了服務端的syn報文,此時客戶端處於established狀態。伺服器收到ack報文後也處於established狀態,此時雙方建立起連線。在確認報文段中ack=1,確認號ack=y+1,序號seq=x+1(初始seq=x,第二個報文段所以要+1),ack報文段可以攜帶資料,不攜帶資料則不消耗序號。
傳送第乙個syn的一端將執行主動開啟(active open),接收這個syn並發回下乙個syn的另一端執行被動開啟(passive open)。
isn是固定的嗎?
不是,isn隨著時間而變化,因此每個連線都會具有不同的isn,這樣選擇序號的目的在於防止在網路中被延遲的分組在以後又被傳送,而導致連線的一方對它做錯誤的解釋。
三次握手的意義:
第一次握手:客戶端傳送網路包,服務端收到。服務端可以確定:客戶端的傳送能力,服務端的接收能力正常。不可以攜帶資料
第二次握手:服務端發包,客戶端收到。客戶端可以確定:服務端的傳送與接收能力正常,客戶端的傳送接收能力正常。但是服務端無法確定客戶端的接收能力是否正常。不可以攜帶資料
第三次握手:客戶端發包,服務端接收到,這樣就確定了雙方的傳送接收能力都正常。可以攜帶資料
什麼是四次揮手
建立乙個連線需要進行三次握手,而終止乙個連線需要經過四次揮手。這是由tcp的半關閉(half-close)造成的。半關閉:tcp提供了連線的一端在結束它的傳送後還能接收來自另一端資料的能力。
tcp的連線的拆除需要傳送四個包,因此被稱為四次揮手(four-way handshake),客戶端伺服器均可以發起揮手的動作。
過程描述:
剛開始雙方都處於established狀態,假如是客戶端線發起關閉請求,過程如下:
第一次揮手:客戶端傳送乙個fin報文,報文中指定乙個序列號。此時客戶端處於fin_wait1狀態,發出連線釋放報文段,fin=1,序號seq=u,並且停止再傳送資料,主動關閉tcp連線,進入fin_wait1(終止等待1)狀態,等待服務端的確認。
第二次揮手:服務端收到fin後,會傳送ack報文,且把客戶端的序列號值+1作為ack報文的序列號值,表明已經收到客戶端的報文了,此時服務端處於close_wait狀態。服務端收到連線釋放報文段後即發出確認報文段(ack=1,確認號ack=u+1,序號seq=v),服務端進入close_wait(關閉等待)狀態,此時tcp處於半關閉狀態,客戶端到服務端的連線釋放。客戶端收到服務端的確認後,進入finwait2(終止等待2)狀態,等待服務端發出的連線釋放報文段。
第三次揮手:如果服務端也想斷開連線了,和客戶端的第一次揮手一樣,傳送乙個fin報文,且指定乙個序列號。此時服務端處於last_ack的狀態,服務端沒有向客戶端發出的資料,伺服器發出的連線釋放的報文段(fin=1,ack=1,序號seq=w,確認號ack=u+1),服務端進入last_ack(最後確認狀態),等待客戶端確認。
第四次揮手:客戶端收到fin後,一樣傳送乙個ack報文作為應答,且把服務端的序列號值+1作為自己的ack報文序列號值,此時客戶端處於time_wait狀態。需要過一陣子確保服務端收到自己的ack報文才進行關閉進入closed狀態,服務端收到ack報文後,關閉連線進入closed狀態。客戶端收到服務端的連線釋放報文段後,對此發出確認報文段(ack=1,seq=u+1,ack=w+1),客戶端進入time_wait(時間等待)狀態,此時tcp未釋放掉,需要經過時間等待計時器設定的事件後,客戶端才進入closed狀態。
揮手為什麼需要四次:
因為當服務端收到客戶端的syn連線請求報文後,可以直接傳送syn+ack報文,其中ack報文是用來應答的,syn報文是用來同步的。但是關閉連線時,當服務端收到fin報文時,很可能不會立即關閉socket,所以只能先回覆乙個ack報文,告訴「客戶端你發的fin報文我收到了」。只有在服務端的報文傳送完,客戶端才能傳送fin報文,因此不能一起傳送需要四次揮手。
三次握手與四次揮手
1 三次握手是怎麼個意思?三次握手的是為了是建立可靠的通訊通道,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。這個三次握手只能是客戶端去發起,伺服器端接收確認的。正常來說伺服器是一直在監聽的,客戶端上線後去請求伺服器端,然後通過tcp協議進行連線。沒...
三次握手與四次揮手
三次握手與四次揮手分別對應tcp連線建立過程與斷開過程,先上tcp報文格式 三次握手過程 問題1 為什麼要三次握手?答 三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。第一次握手 client什麼都不能確認...
三次握手與四次揮手
三次握手 1.定義 三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的資料量是怎樣跟蹤進行協商使資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。2.為什麼要三次...