HTTP的三次握手與四次揮手

第一次握手:創建鏈接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。服務器

第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時本身也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;code

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP鏈接成功)狀態,完成三次握手。隊列

完成三次握手,客戶端與服務器開始傳送數據,在上述過程當中,還有一些重要的概念:同步

未鏈接隊列請求

在三次握手協議中,服務器維護一個未鏈接隊列,該隊列爲每一個客戶端的SYN包(syn=j)開設一個條目,該條目代表服務器已收到SYN包,並向客戶發出確認,正在等待客戶的確認包。這些條目所標識的鏈接在服務器處於SYN_RECV狀態,當服務器收到客戶的確認包時,刪除該條目,服務器進入ESTABLISHED狀態。程序

關閉TCP鏈接:改進的三次握手(四次揮手)通信

對於一個已經創建的鏈接,TCP使用改進的三次握手來釋放鏈接(使用一個帶有FIN附加標記的報文段)。TCP關閉鏈接的步驟以下:數據

第一步,當主機A的應用程序通知TCP數據已經發送完畢時,TCP向主機B發送一個帶有FIN附加標記的報文段(FIN表示英文finish)。客戶端

第二步,主機B收到這個FIN報文段以後,並不當即用FIN報文段回覆主機A,而是先向主機A發送一個確認序號ACK,同時通知本身相應的應用程序:對方要求關閉鏈接(先發送ACK的目的是爲了防止在這段時間內,對方重傳FIN報文段)。協議

第三步,主機B的應用程序告訴TCP:我要完全的關閉鏈接,TCP向主機A送一個FIN報文段。

第四步,主機A收到這個FIN報文段後,向主機B發送一個ACK表示鏈接完全釋放。

問題1: 爲何要三次握手?

答:三次握手的目的是創建可靠的通訊信道,說到通信,簡單來講就是數據的發送與接收,而三次握手最主要的目的就是雙方確認本身與對方的發送與接收機能正常。

第一次握手:Client什麼都不能確認;Server確認了對方發送正常

    第二次握手:Client確認了:本身發送、接收正常,對方發送、接收正常;Server確認了:本身接收正常,對方發送正常

    第三次握手:Client確認了:本身發送、接收正常,對方發送、接收正常;Server確認了:本身發送、接收正常,對方發送接收正常

因此三次握手就能確認雙發收發功能都正常,缺一不可。

問題2:爲何要發送特定的數據包,隨便發不行嗎?

答:三次握手的另一個目的就是確認雙方都支持TCP,告知對方用TCP傳輸。

第一次握手:Server 猜想Client可能要創建TCP請求,但不肯定,由於也多是Client亂髮了一個數據包給本身

    第二次握手:經過ack=J+1,Client知道Server是支持TCP的,且理解了本身要創建TCP鏈接的意圖

    第三次握手:經過ack=K+1,Server知道Client是支持TCP的,且確實是要創建TCP鏈接

註釋:SYN是標誌位,SYN=1表示請求鏈接;

相關文章
相關標籤/搜索