三次握手和四次挥手图解_图解TCP三次握手和四次挥手
三次揮手
為什么建立連接需要三次握手?
三次握手的目的:為了防止已經(jīng)失效的連接請求報文段突然又傳到服務(wù)端,因而產(chǎn)生錯誤,保證在信道上傳輸可靠的數(shù)據(jù)
第一次握手:客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進入SYN_SEND狀態(tài),等待服務(wù)器確認;
第二次握手:服務(wù)器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發(fā)送一個SYN包(syn=k),即SYN+ACK包,此時服務(wù)器進入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進入ESTABLISHED(建立)狀態(tài),完成三次握手。握手過程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶端與服務(wù)器才正式開始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動關(guān)閉連接之前,TCP 連接都將被一直保持下去。
假設(shè)有這樣一次場景:客戶端(A) ? 服務(wù)端(B)
????????客戶端A發(fā)出去的第一個連接請求報文并沒有丟失,而是因為某些未知的原因在某個網(wǎng)絡(luò)節(jié)點上發(fā)生滯留,導致延遲到連接釋放以后的某個時間才到達服務(wù)端B,但是服務(wù)端B收到此失效的報文之后,會誤認為是客戶端A再次發(fā)出的一個新的連接請求,于是B就向A又發(fā)出確認報文,表示同意建立連接。
????????如果此時沒有三次握手,那么只要B端發(fā)出確認報文就會認為新的連接已經(jīng)建立了,但是A端并沒有發(fā)出建立連接的請求,因此不會去向B端發(fā)送數(shù)據(jù),B端沒有收到數(shù)據(jù)就會一直等待。這樣B端就會白白浪費掉很多資源
????????如果采用的是三次握手,就算是那一次失效的報文傳送過來了,服務(wù)端接受到了那條失效報文并且回復了確認報文,但是客戶端不會再次發(fā)出確認。由于服務(wù)器收不到確認,就知道客戶端并沒有請求連接。
從以上流程可以看到,3次握手,是可以讓通信雙方確認連接有效,以進行正常全雙工通信認知的最少“握手”次數(shù)。所以TCP選擇了3次握手~
四次揮手
為什么斷開連接需要四次揮手?
四次揮手的目的:因為TCP是一個全雙工協(xié)議,必須單獨拆除每一條信道。4次揮手的目的是終止數(shù)據(jù)傳輸,保證數(shù)據(jù)傳輸完成,并回收資源。
第一步,客戶端主動發(fā)起一個請求給服務(wù)端,里面包含F(xiàn)IN標識位=1,客戶端的seq序列號u,表示的是當前客戶端在該連接上的當前序列號。
第二步,服務(wù)端在收到這個含有FIN的請求消息之后,校驗無誤之后會立馬回復ACK消息給客戶端,消息內(nèi)部包含ACK標志位為1,同時seq號碼是FIN的請求消息的seq號+1。此時的服務(wù)端同時會主動發(fā)個結(jié)束標識給服務(wù)端上面的應用層程序,應用層程序可以決定是立馬結(jié)束,還是等到該連接中的數(shù)據(jù)處理完了之后,在發(fā)送FIN消息給客戶端來關(guān)掉另外的一半連接。
第三步,服務(wù)端在處理完該連接上面的Pending住的數(shù)據(jù)之后,應用程序會close這個連接。服務(wù)端會主動發(fā)起FIN的消息給客戶端。消息內(nèi)部帶有,FIN=1的結(jié)束符標識位,以及服務(wù)端的seq序列號。
第四步,客戶端在收到對應的FIN消息之后,會主動通知應用層程序,告知這個連接現(xiàn)在需要關(guān)閉了。然后,客戶端會回復ACK消息給服務(wù)端,以便斷開另外一個方向的通道,這個消息包含ACK=1的標識位和FIN的請求帶過來的seq+1。
假設(shè)有這樣一次場景:客戶端(A) ? 服務(wù)端(B)
????????客戶端和服務(wù)端通過3次握手建立連接,此時客戶端數(shù)據(jù)全部發(fā)送完成,需要斷開連接,客戶端就會向服務(wù)端發(fā)送斷開請求。
????????服務(wù)器收到對方的客戶端發(fā)送關(guān)閉報文時,僅僅表示客戶端不再發(fā)送數(shù)據(jù)了但是還能接收數(shù)據(jù),而服務(wù)器也未必全部數(shù)據(jù)都發(fā)送給客服端了,所以服務(wù)器可以立即關(guān)閉,也可以繼續(xù)發(fā)送數(shù)據(jù)給客戶端,如果有數(shù)據(jù)未發(fā)送完畢,就需要通知客戶端,我還有數(shù)據(jù)未發(fā)送完,不要斷開連接。等全部數(shù)據(jù)傳輸完成服務(wù)端在發(fā)送斷開請求。客服端收到服務(wù)端斷開報文后,重新發(fā)送一個斷開確認報文,服務(wù)端收到斷開報文后便斷開連接。
這樣便保證了數(shù)據(jù)傳輸完成,資源回收~
錯誤之處,望指正~
總結(jié)
以上是生活随笔為你收集整理的三次握手和四次挥手图解_图解TCP三次握手和四次挥手的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 研究:格陵兰冰川的融化速度比 20 年前
- 下一篇: redhat mysql tar_mys