文章目錄
- HTTP 連接:三次握手、四次揮手!你真的了解嗎?全新講解,走出誤區!
- HTTP
- 四次揮手
- 異同
- 整體揮手程序
- Q&A
- 附錄
HTTP 連接:三次握手、四次揮手!你真的了解嗎?全新講解,走出誤區!
在計算機編程中,網路可謂是主心骨之一,扛起了網路互通,連接萬物的重任!其互通的關鍵 “ HTTP 連接 ” 是重中之重!那么征服 “ 三次握手、四次揮手 " ,是踏入計算機編程行業的敲門磚!
HTTP
只要你在網路沖浪🏄?♀?,就一定見過 “ HTTP ” !
現在點開地址欄,網址前面出現的 http:// 就說明你此時此刻正在通過 HTTP 沖浪,
HTTP 到底是什么呢?
超文本傳輸協議(Hyper Text Transfer Protocol,HTTP)是一個簡單的請求-回應協議,它通常運行在TCP之上,它指定了客戶端可能發送給服務器什么樣的訊息以及得到什么樣的回應, ——百科
那么我們怎么建立 HTTP 連接呢?
作為一名軟體開發,知曉建立/斷開一 HTTP 連接需要進行 “ 三次握手、四次揮手 ”,現在市面上包括一些教科書上描述都不太準確,很容易讓人進入誤區,這里挨個分析連接程序,喜歡的同學可以關注,點贊,收藏!
四次揮手
一些資料中,有許多四次揮手—流圖,但并不準確,這里貼上自己梳理的生圖!
如下:

異同
上圖和其它常見的版本存在些許差異:
- 無區分 Client、Server
HTTP 為無狀態連接,連接兩段并無區別,揮手程序雙方都可主動進行觸發!
「只是人們喜歡從主觀出發,認為 發送請求 req 的為 Client 、回傳回應 respose 的是 Server,」
比如在某些特殊訪問時,Server 為了控制資源使用成本及效率,會對 Respose Header 寫入欄位 Connection :Closed ,將會在回應后主動放棄此連接!
- Connection 欄位約束:告訴WEB服務器或者代理服務器,在完成本次請求的回應 后,該做什么
- close:斷開連接,不要等待本次連接的后續請求了
- keep-alive:保持連接,等待本次連接的后續請求
- 在 Fin-Wait-2 狀態后新增 Time-Wait 階段
在 Node1 收到 FIN - response 后,不會立即斷開連接,而是將設定 2 MSL 的定時器,進入到 Time-Wait 階段,
整體揮手程序
下面詳細描述下整體的程序:
- Node1 發起關閉連接的 FIN 信號后,進入到 Fin-Wait-1 階段,等待 Node2 的 ACK、FIN 相應信號
- 在 Fin-Wait-1 狀態中,Node1 只進行業務資料的接收、相應,不再進行資料的發送,若 Node2 長時間為回應,Node1 會進行重試,具體為 HTTP 默認重試策略,默認重試次數 tcp_orphan_retries 為 9 次,且每次間隔時長為上一次的 2 倍,Fin-Wait-1 階段一般時長比較短,若超出配置約束時間還為回應,則成為孤兒連接,等待被重置回收,
- 在 Fin-Wait-1 狀態中,Node1 只進行業務資料的接收、相應,不再進行資料的發送,若 Node2 長時間為回應,Node1 會進行重試,具體為 HTTP 默認重試策略,默認重試次數 tcp_orphan_retries 為 9 次,且每次間隔時長為上一次的 2 倍,Fin-Wait-1 階段一般時長比較短,若超出配置約束時間還為回應,則成為孤兒連接,等待被重置回收,
- Node2 收到 Node1 的關閉信號后,進行 ACK 回應,回應之后,進入到 Close-Wait 狀態,Node2 此時可以進行資料處理,處理遺留的事務「一般為關閉連接前未完成的約定事務」,
- Node1 收到 Node2 回應信號后,進入到 Fin-Wait-2 階段,此階段 Node1 不再進行重試策略,而是等待 Node2 處理未完成的事務,
- Node2 處理完事務之后,將發送 FIN 信號,告訴 Node1 已完成,此時 Node2 進入到 Last-Ack 階段,等待最終的 Node1 回應關閉連接,
- Node1 收到 Node2 FIN 信號后,將發送 ACK 信號,告知 Node2 可以關閉了,隨后進入到 Time-Wait 階段,
- 此階段,Node1 會設定一個時間長度為 2MSL 的定時器,當定時器在到時間點后,內核就會將該連接關閉,當連接尚未關閉的時候,又收到了對方發送過來的 FIN 請求(可能是發送出去的請求對方并未收到),或者收到 ICMP 請求(比如 ACK 資料報,在網路傳輸中出現了錯誤),該連接就會重新發送 ACK 請求,并重置定時器,
- 1、保證 ACK 信號被 Node2 收到,防止 Node2 重復發送 FIN 信號至主動關閉連接,無效的資源消耗,
- 2、等待該連接在網路上的所有報文都傳輸完畢,
- Node2 收到 Node1 的回應信號后,就進入到 Closed 狀態,斷開、釋放連接,
- Node1 進入到 Closed 狀態,斷開、釋放連接,
MSL 是Maximum Segment Lifetime,譯為“報文最大生存時間”,任何報文在網路上存在的最長時間,超過這個時間報文將被丟棄,
2MSL 就是一個報文一來一回的最大時間,
Q&A
1、為什么要先介紹 “ 四次揮手 ” 呢?
隨性吧,知識沒有先后,“ 三次握手 ” 可關注后續博文,
2、TCP 是 3 次握手與 4 次揮手,為什么不是 4 次握手呢?
可以理解為:握手程序中并不需要資料傳輸,因此將兩次合并為一次,
3、HTTP 是應用層,下面的傳輸層有 TCP 和 UDP ,握手和揮手是 TCP ?
對,以上是基于 TCP,UDP 是點對點傳輸,無需進行連接,之間區別,可關注之前博文,
附錄
大型編程專案中,建立外科手術型團隊,拒絕一擁而上!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/298333.html
標籤:其他
上一篇:ORAN專題系列-28:5G基站如何升級到ORAN基站 - O-RU - 平臺和傳輸層的改進(VLAN, PCP, DHCP, DNS)
下一篇:DHCP服務器
