面試寶典系列-tcp三次握手、四次揮手

1、三次握手

首先Client端發送鏈接請求報文,Server段接受鏈接後回覆ACK報文,併爲此次鏈接分配資源。Client端接收到ACK報文後也向Server段發生ACK報文,並分配資源,這樣TCP鏈接就創建了。服務器

  • 1)第一次握手:A的TCP客戶進程向B發出鏈接請求報文段,(首部的同步位SYN=1初始序號seq=x),(SYN=1的報文段不能攜帶數據)但要消耗掉一個序號,此時TCP客戶進程進入SYN-SENT(同步已發送)狀態。
  • 2)第二次握手:B收到鏈接請求報文段後,如贊成創建鏈接,則向A發送確認,在確認報文段中(SYN=1,ACK=1,確認號ack=x+1,初始序號seq=y),測試TCP服務器進程進入SYN-RCVD(同步收到)狀態;
  • 3)第三次握手:TCP客戶進程收到B的確認後,要向B給出確認報文段(ACK=1,確認號ack=y+1,序號seq=x+1)(初始爲seq=x,第二個報文段因此要+1),ACK報文段能夠攜帶數據,不攜帶數據則不消耗序號。TCP鏈接已經創建,A、B進入ESTABLISHED(已創建鏈接)。

2、四次揮手

假設Client端發起中斷鏈接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說"我Client端沒有數據要發給你了",可是若是你還有數據沒有發送完成,則沒必要急着關閉Socket,能夠繼續發送數據。因此你先發送ACK,"告訴Client端,你的請求我收到了,可是我還沒準備好,請繼續你等個人消息"。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。當Server端肯定數據已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊數據發完了,準備好關閉鏈接了"。Client端收到FIN報文後,"就知道能夠關閉鏈接了,可是他仍是不相信網絡,怕Server端不知道要關閉,因此發送ACK後進入TIME_WAIT狀態,若是Server端沒有收到ACK則能夠重傳。「,Server端收到ACK後,"就知道能夠斷開鏈接了"。Client端等待了2MSL後依然沒有收到回覆,則證實Server端已正常關閉,那好,我Client端也能夠關閉鏈接了。Ok,TCP鏈接就這樣關閉了!網絡

  • 1)A的應用進程先向其TCP發出鏈接釋放報文段(FIN=1,序號seq=u),並中止再發送數據,主動關閉TCP鏈接,進入FIN-WAIT-1(終止等待1)狀態,等待B的確認。
  • 2)B收到鏈接釋放報文段後即發出確認報文段,(ACK=1,確認號ack=u+1,序號seq=v),B進入CLOSE-WAIT(關閉等待)狀態,此時的TCP處於半關閉狀態,A到B的鏈接釋放。
  • 3)A收到B的確認後,進入FIN-WAIT-2(終止等待2)狀態,等待B發出的鏈接釋放報文段。
  • 4)B沒有要向A發出的數據,B發出鏈接釋放報文段(FIN=1,ACK=1,序號seq=w,確認號ack=u+1),B進入LAST-ACK(最後確認)狀態,等待A的確認。
  • 5)A收到B的鏈接釋放報文段後,對此發出確認報文段(ACK=1,seq=u+1,ack=w+1),A進入TIME-WAIT(時間等待)狀態。此時TCP未釋放掉,須要通過時間等待計時器設置的時間2MSL後,A才進入CLOSED狀態。

 

相關文章
相關標籤/搜索