本文目的:熟悉tcp三次握手及四次揮手的整體過程及一些設計思想
tcp建立連線需要進行三次握手;斷開連線需要四次揮手,下面說說握手及揮手的過程
整個過程如下:
1、tcp連線建立------ 三次握手建立連線舉個簡單的例子,方便理解:a : 你好我是a,你聽得到我在說話嗎?
b : 聽到了,我是b,你聽到我在說話嗎?
a : 嗯,聽到了,開始說吧。
連線建立,開始聊天!
最初兩端的tcp程序都處於closed關閉狀態,a先建立傳輸控制塊tcb開啟連線,b被動開啟連線,listen(監聽)狀態
第一次握手:客戶端向服務端發出連線請求報文段(同步位syn=1,初始序號seq=x),並進入syn_send狀態等待服務端確認,服務端由syn=1知道客戶端要建立連線
第二次握手:服務端接收到syn包,如果同意連線,必須確認客戶端syn(ack=x+1),同時自己也傳送乙個syn包(syn=1,ack=1,初始序列號seq=y),及syn+ack包,同時服務端進入syn_recv狀態
第三次握手:客戶端收到服務端syn+ack包,檢查ack是否正確,正確向服務端傳送確認包ack(ack=1,seq=x+1,
ack=y+1),此包傳送完畢,客戶端和服務端進入established狀態,完成三次握手。
為什麼不兩次握手,而要三次握手呢?
。客戶端傳送了第乙個請求連線並且沒有丟失,
只是因為在網路結點中滯留的時間太長了
,由於tcp的客戶端遲遲沒有收到確認報文,以為伺服器沒有收到,此時重新向伺服器傳送這條報文,此後客戶端和伺服器經過兩次握手完成連線,傳輸資料,然後關閉連線。此時此前滯留的那一次請求連線,網路通暢了到達了伺服器,這個報文本該是失效的,但是,兩次握手的機制將會讓客戶端和伺服器再次建立連線,這將導致不必要的錯誤和資源的浪費。
建立連線舉個簡單的例子,方便理解:a:「喂,我不說了。」a->fin_wait1b:「我知道了。等下,上一句還沒說完。balabala…..」b->close_wait | a->fin_wait2
b:」好了,說完了,我也不說了。」b->last_ack
a:」我知道了。」a->time_wait | b->closed
a等待2msl,保證b收到了訊息,否則重說一次」我知道了」,a->closed
四次揮手過程:
1、客戶端發出連線釋放報文,並且停止傳送資料。fin=1,序列號seq=u(前面已經傳過來的資料的最後乙個位元組的序號+1),此時,客戶端進入fin-wait1狀態。
2、服務端接收到釋放報文,發出確認報文,ack=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了close-wait狀態,如果此時服務端要傳送資料,客戶端依然要接收,所以這個狀態需要持續一段時間,也就是整個close-wait狀態持續的時間;客戶端接收到服務端的確認請求後,此時,客戶端進入fin-wait2狀態,等到服務端傳送連線釋放報文(在這之前還需要接收服務端傳送的最後的資料)
4、time-wait
狀態,∗
為什麼建立連線是三次握手,關閉連線確是四次揮手呢?
建立連線的時候, 伺服器在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端。
而關閉連線時,伺服器收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料,而自己也未必全部資料都傳送給對方了,所以己方可以立即關閉,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送,從而導致多了一次。
為什麼客戶端最後還要等待2msl?
msl(maximum segment lifetime),tcp允許不同的實現可以設定不同的msl值。
第一,保證客戶端傳送的最後乙個ack報文能夠到達伺服器,因為這個ack報文可能丟失,站在伺服器的角度看來,我已經傳送了fin+ack報文請求斷開了,客戶端還沒有給我回應,應該是我傳送的請求斷開報文它沒有收到,於是伺服器又會重新傳送一次,而客戶端就能在這個2msl時間段內收到這個重傳的報文,接著給出回應報文,並且會重啟2msl計時器。
第二,防止類似與「三次握手」中提到了的「已經失效的連線請求報文段」出現在本連線中。客戶端傳送完最後乙個確認報文後,在這個2msl時間中,就可以使本連線持續的時間內所產生的所有報文段都從網路中消失。這樣新的連線中不會出現舊連線的請求報文。
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...