三次握手:
第一次握手: 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表示
我向客戶端發送的值。提高傳輸的效率。節約時間。
四次揮手
客戶端給服務器說再見,
服務器給客戶端說拜拜,
服務端告訴客戶端我也不和你玩了,
客戶端說不玩就不玩。
第一次,客戶端告訴服務端我不會給你發數據了,
第二次服務端告訴客戶端我收到你發生的信息了,
第三次服務端給客戶端發生數據說我也不給你發了,
第四次客戶端給服務端說我知道了。
建立一個連接需要三次握手,而終止一個連接要經過四次揮手。