基於TCP的HTTP協議

TCP協議格式如下:


解析:

  • 序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記;
  • 確認序號:Ack序號,佔32位,只有Ack標記爲1時,確認序號纔有效,Ack = Seq + 1;
  • 標識位:共6個【URG、ACK、PSH、RST、SYN、FIN】,其中URG-緊急指針有效、ACK:確認序號有效、PSH-接收方應該儘快把這個報文提交應用層、RST-重置連接、SYN-發起一個新連接、FIN-釋放連接。

TCP建立連接 三次握手:


解析:

  • 第一次握手:客戶端向服務器發送一個同步數據包請求建立連接,數據包中包含:初始序列號ISN,由客戶端隨機產生,確認號爲0;
  • 第二次握手:服務區收到同步數據包後,回給客戶端一個同步確認,這個數據包中,序列號ISN是服務端隨機產生的值,確認是客戶端初始序列號+1;
  • 第三次握手:客戶端收到同步確認數據包後,在對服務器發送一個確認,數據包中,序列號爲同步請求數據中的序列號,確認號爲服務器初始序列號+1.

TCP釋放連接  四次握手

1、客戶端發起關閉連接:


解析:

四次握手的序列號和確認號:

(u,o)-- (v, u+1) --(w, u+1) -- (u+1, w+1)

  • 第一次握手:客戶端發送一個FIN後,通知服務端此時客戶端沒有數據需要發送了,Client進入FIN_WAIT_1狀態;
  • 第二次握手:Server收到FIN後,確認沒有數據要接收和返回了,發送一個ACK給Client,確認序列號爲收到序列號+1,Server進入Close_wait狀態;
  • 第三次握手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入Last_ack狀態;
  • 第四次握手:Client收到FIN後,Client進入Tiime_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入Close,完成。

2、雙方同時發起主動關閉:



【問題1】:

爲什麼建立連接三次握手,而關閉是四次握手呢?

RE:因爲建立連接時,服務端只需要回覆ACK確認收到消息就可以了,而關閉連接時,第一次回覆ACK是告知客戶端我收到你的請求了,但服務端此時可能不會立即關閉SOCKET,只有確認關閉了纔會在發送FIN。

【問題2】爲什麼關閉連接時,TIME_WAIT需要等待2MSL才返回CLOSE狀態;

RE:雖然說4次握手完成後,就可以closed,但我們必須考慮網絡不可靠,如果最後一個ack丟失,就需要在重新發送FIN,而這個等待時間時2MSL


長連接和短連接:

在HTTP的響應消息中,如果connect:closed -- 短連接, connection:keep-alive -- 長連接

長連接:
       建立連接 -- 傳輸數據 --(保持連接) -- 傳輸數據 -- 關閉連接
短連接:
       建立連接-傳輸數據-關閉連接 ... 建立連接 -- 傳輸數據 -- 關閉連接

長連接和短鏈接的應用場景:

由上面可知,長連接可以省去再次建立和關閉連接的時間,對於頻繁請求資源的客戶端,適用於長連接,不過存在一個問題,存活功能的探測週期太長,還有就是它知識探測TCP連接算是比較斯文的做法,如果遇到惡意連接時,保活功能就不夠用了,在長連接的應用場景下,client一般不會主動關閉它們之間的連接,client和server之間連接如果一直不活動,會有一個問題,隨着客戶端的增加,連接數也在增加,佔用資源;短連接的理解比較容易。對於開放的web網站,建議使用短連接,減少資源佔用,對於專網客戶端較少時,建議使用長連接,減少頻繁請求建立連接。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章