1. 程式人生 > >三次握手與四次揮手

三次握手與四次揮手

傳輸 重復 其中 客戶 狀態 首部 信息 客戶端 打開

傳輸層有兩個協議:TCP協議和UDP協議,兩者主要的區別是TCP是提供可靠服務,而UDP是提供不可靠服務。UDP沒有TCP為了保證傳輸而進行的三次握手和四次揮手,所以UDP在效率上高於TCP,目前還應用在一些語音、視頻等對丟失信息不敏感的信息傳輸中。

本文主要介紹一下TCP中的三次握手和四次揮手,詳細介紹其流程、原理以及缺點。

1、三次握手

三次握手需要用到下面的標誌位和數據:

技術分享圖片

SYN表示請求打開連接;

技術分享圖片

流程就是上圖所示

第一次握手:客戶端發送SYN=1標誌符給服務器,請求與服務器建立連接,同時發送seq=x給服務器;其中x是客戶端產生的,位於TCP首部中。

第二次握手:服務器收到客戶端的消息後,如果確認請求便向客戶端回復

ACK=1標誌符,表示確認請求,發送ack=x+1,用於驗證序列;與此同時,服務器向客戶端也發送一個建立連接請求SYN=1和序列號seq=y

第三次握手:客戶端收到了服務器發來的消息,ACK=1說明服務器確認了客服端向其發送的建立連接請求被確認,接著驗證ack=x+1,確認回復的是自己發送的連接請求;收到了服務器向客戶端發送的建立連接請求SYN=1seq=y,同意建立連接,回復ACK=1ack=y+1

當服務器收到客戶端發送的ack=y+1ACK=1,即整個三次握手完成,可以進行TCP通信。

為什麽需要三次握手?

根本原因是為了防止客戶端的消息由於擁塞等原因,又重復發送一次SYN請求。由於請求實質上沒有丟失,服務器之後會收到兩次

SYN請求。由於客戶端只發送了一次請求,所以對服務器端發回的兩次ACK只響應一次。在三次握手的情況下,對於第二次從服務器發出的請求,由於服務器沒有再收到客戶端發送的確認,服務器等待超時後就停止等待響應。如果沒有三次握手,服務器端將無法獲得客戶端的狀態,將一直等待下去,浪費大量資源。

2、四次揮手

技術分享圖片

四次握手可以由客戶端發起,也可以由服務器端發起,所以只區分主動方和被動方。當一方發送完全部數據,即發起Fin斷開請求。

第一次揮手:主動方發送請求FIN=1,表示主動方已經發送完所有的數據,這時發送最後的數據ack=Z,發送序列號seq=X

第二次揮手:被動方收到了主動方的請求和序號,確認後斷開從主動方到被動方的連接,並回復消息:

ack=seq+1=X+1;並且發送序號seq=Z;被動方依舊可以繼續發送數據給主動方;

第三次揮手:當被動方將所有的數據發送完成後,向主動方格發送斷開連接請求FIN=1ack是對上一次傳輸數據的確認,發送序號seq=Y

第四次揮手:確認請求,斷開從被動端到主動端的連接。

需要四次握手的原因:

因為在被動方收到主動方的斷開請求FIN時可能還有數據需要發送,所以被動方回復主動方的確認後繼續發送數據,完成數據發送後再向主動方發送請求,發送斷開請求。而三次握手時由於中間不需要發送數據,所以確認和發送請求一並發送,即三次。

三次握手與四次揮手