python面試題tcp三次握手四次揮手

三次握手:

在這裏插入圖片描述

第一次握手: Client端發送位碼爲SYN=1,隨機產生seq number=J的數據包到服務器,Server端收到數據包後,由SYN=1判斷出 Client端要求連接;此時Client端處於SYN_SENT的狀態。

第二次握手: Server端收到請求後要向Client端發送確認連接的信息,於是,Server端向Client端發送一個ACK=1,SYN=1,ack number=J+1(即Client端的seq number +1),隨機生成的seq number=K,此時服務端處於SYN_RCVD;

第三次握手:
Client端收到後檢查兩點 :
1、ack number 是否正確(是否等於J+1);
2、位碼ACK是否等於1。
若以上兩點都正確,Client端會再次發送ack num=K+1(第二次機握手中 Server端發送的seq number + 1),位碼ACK=1,
Server端收到後確認ack number值是否正確,ACK是否爲1 ,若均正確則連接建立成功。
此時雙方處於ESTABLISHED的狀態。

四次揮手:

在這裏插入圖片描述

第一次揮手: Client端發送位碼爲FIN=1,隨機產生seq number=J的數據包到服務器,Server端收到數據包後,由FIN=1判斷出 Client端要求斷開連接;此時Client端處於FIN-WAIT-1的狀態。

第二次揮手: Server端收到請求後要向Client端發送確認斷開連接的信息,於是,Server端向Client端發送一個ACK=1,ack number=J+1(即Client端的seq number +1),此時服務端處於CLOSE_WAIT的狀態,Client端收到這個信號後,由FIN-WAIT-1變成FIN-WAIT-2的狀態,此時Client端可以接受Server端的數據但是不能向Server端傳輸數據。

第三次揮手: Server端主動向Client端發送一個位碼爲FIN=1,隨機產生seq number=K 的數據包到服務器,Client端收到數據包後,由FIN=1判斷出Server端要斷開連接,此時Server端處於LAST-ACK的狀態。

第四次揮手: Client端接受到Server端的請求後,要向Server端發送確認端口連接的信息,於是,Client端向Server端發送了一個ACK=1,ack num=K+1(即Server端的seq number +1),發送後Client端處於TIME-WAIT的狀態,等待2MSL後變成CLOSED,而Server端收到Client端的最後一個ACK後便會變成CLOSED

這個有點難理解 下面我給大家說一種通俗易懂的方法:

在這裏插入圖片描述

三次握手就是客戶端和服務器進行通信的時候有三次交流。

例如如下:

客戶端問服務端你準備好了嗎(第一次),

服務端告訴客戶端裝備好了,並且問客戶端你準備好了嗎(第二次),

客戶端說我準備好了(第三次)。

第一次握手:是客戶端讓服務器準備好資源。
第二次握手:服務端資源準備好了並且服務端問客戶端資源有沒有準備好。
第三次握手:客戶端資源也準備好了。接下來才真正的發生數據。

真正進行3次握手的時候發送的是值。

第一次客戶端裝備了一個值例如是11,發送給了服務端,服務端如果準備好了就將11+1變成
12再發送給客戶端,表示服務端準備好了資源。
服務怎麼知道客戶端準備好了資源呢?服務器給客戶端發送一次數據例如33,客戶端如果準
備好了就再將數據加1 33+1 =34 發送給服務端,服務端接受到後就表明客戶端準備好了。
這樣4次才知道雙方準備好了資源。這裏發生了4次,不是3次,
當用戶打開一個網站的時候我們想盡快的看到內容,因此能減少的終將12和44 的數據變成了一次請求。發生12表示給客戶端回答的值,44表示
我向客戶端發送的值。提高傳輸的效率。節約時間。

四次揮手
客戶端給服務器說再見,

服務器給客戶端說拜拜,

服務端告訴客戶端我也不和你玩了,

客戶端說不玩就不玩。

第一次,客戶端告訴服務端我不會給你發數據了,
第二次服務端告訴客戶端我收到你發生的信息了,
第三次服務端給客戶端發生數據說我也不給你發了,
第四次客戶端給服務端說我知道了。

建立一個連接需要三次握手,而終止一個連接要經過四次揮手。

發佈了37 篇原創文章 · 獲贊 49 · 訪問量 4064
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章