1. 程式人生 > >python3.6入門到高階(全棧) day027 tcp協議的三次握手四次揮手

python3.6入門到高階(全棧) day027 tcp協議的三次握手四次揮手

TCP協議的三次握手, 四次揮手

  三次握手過程

  1, 伺服器時刻準備接受客戶端程序的連線請求, 此時伺服器就進入了LISTEN(監聽)狀態;

  2, 客戶端程序然後向伺服器發出連線請求報文, 之後客戶端程序進入了 SYN-SENT(同步已傳送狀態)狀態;

  3, 伺服器收到請求報文後, 如果同意連線, 則發出確認報文, 此時, 伺服器程序進入了SYN-RCVD(同步收到)狀態;

  4, 客戶端程序收到確認後, 還要向伺服器給出確認. 此時, 客戶端進入ESTABLISHED(已建立連線)狀態;

  5, 當伺服器收到客戶端的確認後也進入ESTABLISHED狀態, 此後雙方就可以開始通訊了. 

  舉個列子: 

    A: " 餵我是A, 你能聽到我講話嗎? " (客戶端發起連線請求)

    B: " 聽到了, 我是B, 那你能聽到我講話嗎? "  (服務端接收到請求, 同意連線後向客戶端發出確認報文)

    A: " 嗯嗯, 我能聽得到. "  (客戶端收到服務端發出的確認報文後, 給出確認, 表明客戶端處於連線已建立狀態)

    B: " ...... "  (服務端收到客戶端的確認後, 也進入連線已建立狀態)

 

 四次揮手過程: 

  資料傳輸完畢後,雙方都可釋放連線。最開始的時候,客戶端和伺服器都是處於ESTABLISHED狀態,然後客戶端主動關閉,伺服器被動關閉。

  1, 客戶端程序發出連線釋放報文,並且停止傳送資料. 此時,客戶端進入FIN-WAIT-1(終止等待1)狀態;

  2, 伺服器收到客戶端的連線釋放報文,伺服器發出確認報文, 此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態(此時客戶端已經沒有資料要傳送了, 但是伺服器若傳送資料, 客戶端依然要接受);

  3, 客戶端收到伺服器的確認請求後, 客戶端就進入FIN-WAIT-2(終止等待2)狀態, 等待伺服器傳送連線釋放報文(在這之前還要接受伺服器傳送的最後資料);

  4, 伺服器傳送完最後的資料後, 就向客戶端傳送連線釋放報文, 此時,伺服器就進入了LAST-ACK(最後確認)狀態, 等待客戶端的最後確認;

  5, 客戶端收到伺服器的連線釋放報文後, 必須發出確認, 此時客戶端就進入了TIME-WAIT ( 時間等待 )狀態(此時連線還沒有釋放, 必須經過2∗MSL(最長報文段壽命)的時間後, 當客戶端撤銷相應的TCB連線後,才進入CLOSED狀態)。

  6, 伺服器只要收到了客戶端發出的確認,立即進入CLOSED狀態(伺服器結束TCP連線的時間要比客戶端早一些)。

   舉個例子:

    A: " 喂, 我不說了, 我要掛電話了 "  (客戶端發出連線釋放請求, 客戶端並且停止傳送資料)

    B: " 嗯我知道, 我剛才那句話還沒說完 "  (伺服器收到客戶端的連線釋放報文, 併發出確認報文給客戶端, 表示伺服器收到請求了)

    B: " 好了, 說完了, 我不說了 "  (伺服器在傳送完最後的資料後, 給客戶端發出最後連線釋放報文, 伺服器等待客戶端的最後確認)

    A: " 我知道了 "  (客戶端收到服務端的最後請求後並給出確認, 客戶端經過2MSL時間後, 撤銷TCP連線)

    B: 結束通話電話....  (伺服器收到客戶端的最後確認後立即斷開TCP連線)

 

 

符號說明

   Seq:"sequance"序列號
  Ack:"acknowledge"確認號
  SYN:"synchronize"請求同步標誌
  ACK:"acknowledge"確認標誌"
  FIN:"Finally"結束標誌