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"結束標誌