程序員該知道的HTTP

HTTP

1.1 HTTP報文

HTTP 報文是在 HTTP應用程序之間發送的數據塊(用於HTTP協議交互的信息)。請求端(客戶端)的HTTP報文叫做請求報文,響應端(服務器端)的叫做響應報文。

報文參數介紹:

  • Remote Address :訪問目標URL解析出來的IP地址
  • Referrer Policy:Referrer用戶知名當前請求的來源頁面,對於同源的請求,會發送完整的url作爲引用地址,防盜鏈
  • accept:請求可以支持的響應格式列表信息
  • accept-encoding:告知服務器本地瀏覽支持是壓縮方式
  • sec-fetch-dest:期望獲得什麼類型的資源
  • sec-fetch-mode:navigate,表示這時一個瀏覽器的頁面切換請求
  • sec-fetch-site:表示一個請求發起的來源和目標資源來源之間的關係,cros-site:跨域請求,same-origin:同源請求
  • upgrade-insecure-requests:1,表示當前瀏覽器可以處理https請求
  • sec-fetch-user:?1 表示true
  • user-agent:描述瀏覽器的信息
  • server:web應用程序部署的容器。

1.1.1 報文組成

  1. 請求報文

  1. 響應報文

  1. 請求和響應結構類似:

1.1.2 HTTP 請求方法

1.1.3 響應狀態碼

狀態碼 介紹
200 OK
301 代表永久性轉移
302 代表暫時性轉移
400 錯誤的請求
401 Unauthorized 需要權限認證
403 Forbidden 說明請求被服務器拒絕
405 Method Not Allowed 發起的請求的URL不支持的方法
500 Internal Server Error 服務器遇到一個妨礙它爲請求提供服務的錯誤
502 Bad Gateway 作爲代理或網關使用的服務器從請求響應鏈的下一條鏈路上收到了僞響應
504 Gateway Timeout 代理或網關等待超時

1.2 連接報文

1.2.1 TCP連接

1. 三次握手

0)準備工作

最開始的時候客戶端和服務端都是處於CLOSED狀態,主動打開連接的爲客戶端,被動打開連接的爲服務器。TCP服務器先創建傳輸控制塊TCB,時刻準備接收客戶進程的連接請求,此時服務器就進入了LISTEN(監聽)狀態

1)一次握手

客戶端進程創建傳輸控制塊TCB,然後發出請求報文,SYN=1,同時選擇一個初始序列號seq=x。此時客戶端進入了SYN-SENT(同步已發送狀態)狀態。TCP規定,SYN報文段不能攜帶數據,但需要消耗掉一個序號。

2)二次握手

TCP服務器收到請求報文後,如果同意連接,則發出確認報文。確認報文中應該ACK=1,SYN=1,確認號是x+1,同時自己也初始化一個序列號seq=y,此時服務端進程進入SYN-RCVD(同步收到)狀態。這個報文也不能攜帶數據,但是要消耗一個序號

3)三次握手

TCP客戶進程收到確認後,還要向服務器給出確認。確認報文的ACK=1,ack=y+1,自己的序列號x+1。此時TCP連接建立,客戶端進入ESTABLISHED(已建立連接)狀態。ACK報文段可以攜帶數據,但是如果不攜帶數據則不消耗序號。
服務器收到客戶端的確認後也進入ESTABLISHED狀態,此後雙方就可以開始通信了。

爲什麼要3次握手?

爲了服務器、客戶端雙方都能明確自己和對方的收發能力正常。

2. 四次揮手

1)客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,序列號=u,此時客戶端進入FIN-WAIT-1狀態,TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

2)服務器收到連接釋放報文,發出確認報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時服務器進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態。即客戶端已經沒數據發送了,但是服務器若還要發送數據,客戶端依然要接收。

客戶端收到服務器的確認請求後,此時客戶端進入FIN-WAIT-2狀態,等待服務器發送連接釋放報文。

3)服務器將最後的數據發送完後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器可能又發送了一些數據,假定序列號seq=w,此時服務器進入LAST-ACK(最後確認)狀態,等待客戶端確認。

4)客戶端收到服務器的連接釋放報文後,必鬚髮出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時客戶端進入TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2*MSL的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。

服務器收到客戶端的確認後,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。

爲什麼關閉要4次,建立連接只要3次?

建立連接的時候,服務器收到客戶端的SYN報文,把ACK和SYN放在一個報文裏發送給客戶端了。

而關閉連接時,服務器收到客戶端的FIN報文,僅僅回了一個確認收到。因爲自己可能還有數據要發送,等自己發完了。再發送FIN報文給對方表示可以關閉連接。這也就讓服務器ACK和FIN分開發送,從而多了一次。

爲什麼客戶端最後還要等待2MSL?

去向ACK消息最大存活時間(MSL) + 來向FIN消息的最大存活時間(MSL)。恰好就是2MSL。

  1. 保證客戶端發送的最後一個ACK報文能到達服務器
  2. 等待2MSL時間,客戶端就可以放心的釋放TCP佔用的資源和端口號。

1.3 HTTP2新特性

  1. 二進制分幀
  2. 頭部壓縮
  3. 多路複用
  4. 服務器推送
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章