我們都知道tcp是一種面向有連線的協議,只有確認通訊對端存在時才會傳送資料。而三次握手與四次揮手指的是tcp連線的建立與終止。
1、三次握手
tcp通過三次握手建立連線,所謂的三次握手其實就是客戶端與伺服器之間傳送了3個報文。進行3次握手的主要作用就是為了確認雙方的接受能力和傳送能力是否正常、指定自己的初始化序列號為後面的可靠性傳輸做準備。實質上就是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號與確認號。交換tcp視窗大小資訊。
建立連線過程中的一些名詞解釋:
初始時,客戶端與伺服器都處於closed
狀態,之後開始建立連線,具體如下:
第一次握手:客戶端傳送給伺服器連線請求,並指明客戶端的初始化序列號,此時客戶端處於syn-send
狀態。
首部的同步位syn=1
,初始序列號seq=x,syn=1
的報文段不能攜帶資料,但要消耗掉乙個序號。
第二次握手:伺服器收到客戶端的syn報文之後,會返回乙個自己的syn報文作為應答。在該返回的報文中,指定了自己的初始化序列號,同時會把客戶端的序列號+1作為確認號(ack)返回,表示自己已經接收到了客戶端傳送的請求。此時伺服器的狀態為syn-rcvd
。
確認報文段中,syn=1,ack=1,
確認號ack=x+1,
初始序列號seq=y
;
第三次握手:客戶端收到syn報文之後,會針對該syn返回乙個ack報文。當然還是會把伺服器的初始序列號+1作為ack的值,表示已經收到了伺服器的syn報文。此時客戶端處於established
狀態,伺服器收到客戶端的ack報文之後也屬於established
狀態,此時雙方建立起了連線。
確認報文段ack=1
,表示收到客戶端的報文,確認號ack=y+1
,序號seq=x+1
。此時ack報文段可以攜帶資料,攜帶資料時返回的報文中序列號為x+資料長度,不攜帶資料時,不消耗序列號。
2、為什麼需要3次握手,不能是2次或4次嗎?
首先我們要知道的是,三次握手中不僅是建立了連線,三次握手的過程中還包括確定「最大訊息長度」(mss:maximum segment size
)的功能。客戶端與服務端在建立連線的時候,會在tcp首部中寫入mss中選項,告訴對方自己的介面能夠適應的mss的大小,然後會在兩者之間選擇乙個較小的值投入使用。這就是為什麼需要三次握手,具體解釋如下:
第一次握手時,客戶端告訴服務端自己的介面能夠適應的mss大小為x,第二次握手服務端告訴客戶端自己的介面能夠適應的mss大小為y,第三次握手時協商找出較小的mss。也就是說,至少3次握手才能協商好這樣乙個過程。另外,我們也知道協議不是100%可靠的,也就是說你的第四次握手第五次握手還是不能有100%的可靠性,那麼你的第四次握手是沒有任何意義的。
這裡可以看一下《**tcp/ip》的乙個例子:
1、四次揮手
tcp連線的斷開需要傳送4個包,因此稱為四次揮手。
初始時,雙方都屬於established
狀態,以客戶端先發起連線釋放請求為例,四次揮手的過程如下:
第一次揮手:客戶端傳送乙個fin報文(fin=1,seq=u
),請求斷開連線,此時客戶端處於fin-wait-1
狀態.
第二次揮手:服務端收到fin報文以後,會返回ack報文(ack=1,seq=v,ack=u+1
),此時服務端處於close-wait
狀態。此時的客戶端處於半關閉狀態,即客戶端到服務端的連線釋放,客戶端進入fin-wait-2
狀態,等待服務端發出連線釋放報文段。
第三次揮手:服務端傳送斷開連線請求,傳送乙個fin(fin=1,ack=1,seq=w,ack=u+1
)報文,此時服務端處於last-ack
狀態。
第四次揮手:客戶端收到fin之後,一樣傳送乙個ack報文應答,即確認斷開連線。此時客戶端處於time-wait狀態,需要過一陣子以確保服務端收到自己的ack報文之後才會進入closed
狀態。服務端收到ack報文之後,就處於關閉連線了,處於closed
狀態。
2、為什麼是4次揮手?
為什麼是4次揮手,這是由tcp的半關閉造成的。即當客戶端結束了他的傳送之後,還能接受服務端傳送的資料。具體解釋:客戶端傳送斷開連線請求,服務端返回確認應答,但此時服務端可能訊息還沒有傳送完,得等到服務端訊息傳送完之後,他才會給客戶端傳送斷開連線請求,客戶端確認應答。因此需要4次揮手。
三次握手與四次揮手
1 三次握手是怎麼個意思?三次握手的是為了是建立可靠的通訊通道,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。這個三次握手只能是客戶端去發起,伺服器端接收確認的。正常來說伺服器是一直在監聽的,客戶端上線後去請求伺服器端,然後通過tcp協議進行連線。沒...
三次握手與四次揮手
三次握手與四次揮手分別對應tcp連線建立過程與斷開過程,先上tcp報文格式 三次握手過程 問題1 為什麼要三次握手?答 三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收機能正常。第一次握手 client什麼都不能確認...
三次握手與四次揮手
三次握手 1.定義 三次握手 three times handshake three way handshake 所謂的 三次握手 即對每次傳送的資料量是怎樣跟蹤進行協商使資料段的傳送和接收同步,根據所接收到的資料量而確定的資料確認數及資料傳送 接收完畢後何時撤消聯絡,並建立虛連線。2.為什麼要三次...