TCP協議三次握手與四次揮手

TCP協議是應用在傳輸層的協議。是一種面向連接的、可靠的協議。

TCP協議的特點:

1)面向字節流。

2)TCP是面向連接的運輸層協議

3) 每一條TCP鏈接只能有兩個端點

4)TCP提供可靠交付的服務

5)TCP提供全雙工通信

下面來談一下TCP運輸連接的建立和釋放

TCP連接的建立採用客戶服務器模式(CS模式)主動發起連接建立的應用進程叫做客戶(client),而被動等待連接建立的應用進程叫做服務器(server)。

TCP連接建立過程(三次握手wKiom1dn9gKR69dFAADx2GRi1fg588.jpg

第一次握手:客戶端主動發起連接請求,在此期間服務器一直處於監聽狀態,等待客戶端的連接請求。客戶端進程向服務器發出連接請求報文段,此時首部中的同步位SYN=1,同時選擇一個初始序號x.(TCP規定,SYN報文段不能攜帶數據,但要消耗一個序號)。這是,TCP客戶進程進入SYN-SENT(同步已發送)狀態。

第二次握手:服務器收到客戶端發送的連接請求後,如同意建立連接,則想客戶端發送確認。在確認報文段(此報文段也不能攜帶數據,但同樣要消耗一個序號)應將SYN位和ACK都置爲1,確認號是ack=x+1,同時也爲自已選擇一個初始序號seq=y.這時TCP服務器進程進入SYN-RECV狀態。

第三次握手:TCP客戶端收到服務器的確認後,還要向服務器發送確認報文。確認報文段的ACK置1,確認號ack=y+1,自己的序號seq=x+1.此時ACK報文段可以攜帶數據,但如果不攜帶數據則不消耗序號。這時TCP連接已經建立,客戶端進入ESTABLISHE(已建立連接)狀態。當服務器收到客戶端的確認後,也進入ESTABLISHE(已建立連接)狀態。

爲什麼是三次?

最後一次握手是爲了防止已失效的連接請求報文段突然又傳到了服務器,因而產生錯誤。所以不能是兩次,而多於三次是沒有必要的。


TCP連接釋放過程(四次揮手)

wKioL1dn9gLyJ_HFAAELJBKvIZM480.jpg


第一次:客戶端應用進程先向其TCP發出連接釋放報文段,並停止再發送數據,主動關閉TCP連接。客戶端把FIN置爲1,序號seq=u(等於前面已傳送過的數據的最後一個字節的序號加1)。這時客戶端進入FIN-WAIT-1(終止等待1)狀態,等待服務器的確認。(FIN報文段即使不攜帶數據,也消耗掉一個序號)

第二次:服務器收到連接釋放報文後發出確認,確認號是ack=u+1,seq=v(等於前面已傳送過的數據的最後一個字節的序號加1)。然後服務器進入CLOSE-WAIT(關閉等待)狀態。TCP服務器進程這時應通知高層應用進程,因而從客戶端到服務器的這個方向的連接就釋放了,此時TCP連接處於半關閉狀態,即客戶端已沒有數據要發送,但服務器若要發送數據,客戶端仍然要接收,即從服務器到客戶端這方的連接並未關閉。客戶端收到來自服務器的確認後,就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發出的連接釋放報文段。

第三次:若服務器已沒有要向客戶端發送的數據,其應用進程應通知TCP釋放連接。此時FIN=1。seq=w(假設在半關閉狀態下服務器又向客戶端發送了一些數據),ack=u+1.這時服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。

第四次:客戶端在收到服務器的的連接釋放報文段後,必須對此發出確認,在確認報文段中把ACK置爲1,ack=w+1,seq=u+1(前面發送的FIN報文段要消耗一個序號)然後進入TIME-WAIT狀態。現在TCP連接還沒有釋放掉。必須經過時間等待計時器設置的時間2MSL(MSL:最長報文段壽命)後,客戶端才進入CLOSED狀態。服務器在收到確認後,就進入CLOSED狀態。


爲什麼客戶端在TIME-WAIT狀態必須等待2MSL時間??

第一:爲了保證客戶端發送的最後一個ACK報文段能夠到達服務器。

第二:防止已失效的連接請求報文段出現在本連接中。客戶端在發送完最後一個ACK報文段後,再經過2MSL時間就可以使本連接內所產生的所有報文段都從網絡中消失。可以使下一個新的連接中不會出現這種舊的連接請求報文段。

爲什麼是四次??

爲了確保數據能夠完成傳輸。

關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章