Tcp的三次握手四次揮手

三次握手

第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。服務器

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;圖片

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。同步

四次揮手

描述四次揮手就是:it

1.A與B交談結束以後,A要結束這次會話,對B說:我要關閉鏈接了(seq=u,FIN=1)。(第一次揮手,A進入FIN-WAIT-1)請求

2.B收到A的消息後說:確認,你要關閉鏈接了。(seq=v,ack=u+1,ACK=1)(第二次揮手,B進入CLOSE-WAIT)im

3.A收到B的確認後,等了一段時間,由於B可能還有話要對他說。(此時A進入FIN-WAIT-2)客戶端

4.B說完了他要說的話(只是可能還有話說)以後,對A說,我要關閉鏈接了。(seq=w, ack=u+1,FIN=1,ACK=1)(第三次揮手) 5.A收到B要結束鏈接的消息後說:已收到你要關閉鏈接的消息。(seq=u+1,ack=w+1,ACK=1)(第四次揮手,而後A進入CLOSED) 6.B收到A的確認後,也進入CLOSED。img

爲何鏈接的時候是三次握手,關閉的時候倒是四次握手?

答:由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。時間

輸入圖片說明

相關文章
相關標籤/搜索