主頁 > 後端開發 > 簡單了解 HTTP 協議.

簡單了解 HTTP 協議.

2020-10-23 23:16:49 後端開發

一、HTTP 請求流程

最初,HTTP 協議的出現主要是為了解決文本傳輸的難題,由于協議本身非常簡單,于是在此基礎上設想了很多應用方法并投入了實際使用,現在 HTTP 協議已經超出了 Web 這個框架的局限,被運用到了各種場景里,

目前主流的 HTTP 版本還是 HTTP/1.1,

HTTP 協議基于 TCP/IP 協議,會通過分層順序與對方進行通信,首先作為發送端的客戶端在應用層(HTTP 協議)發出一個想看某個 Web 頁面的 HTTP 請求;接著,在傳輸層(TCP 協議)把從應用層處收到的資料(HTTP 請求報文)進行分割,并在各個報文上打上標記序號及埠號轉發給網路層;然后,在網路層(IP 協議)增加作為通信目的地的 MAC 地址(ARP 協議)后轉發給鏈路層;最后接收端的服務器在鏈路層接收到資料,按序往上層發送,一直到應用層,

TCP 協議提供可靠的位元組流服務,并且為了更容易傳送大資料從而把資料分割,而且 TCP 協議能夠確認資料最終是否送達到對方(三次握手),

IP(Internet Protocol)協議的作用是把各種資料包傳送給對方,

ARP 是一種用以決議地址的協議,根據通信方的 IP 地址就可以反查出對應的 MAC 地址,

DNS 提供域名到 IP 地址之間的決議服務,

二、HTTP 協議結構

1.請求報文

請求報文是由請求方法、請求 URI、協議版本、可選的請求首部欄位和內容物體構成的,

keep-alive 表示只要客戶端或服務端任意一端沒有明確提出斷開連接,則保持 TCP 連接狀態,這樣不會導致每次的請求造成無謂的 TCP 連接建立和斷開,從而減少通信量的開銷和服務端的負載,也能使頁面的顯示速度顯著提高,

除了常見的 get/post 方法,HTTP/1.1 中還有諸多可使用的方法,

HTTP 方法 作用 說明
GET 獲取資源 用來請求訪問已被 URI 識別的資源
POST 傳輸物體主體 用來傳輸物體的主體
PUT 傳輸檔案 自身不帶驗證機制,存在安全性問題
HEAD 獲得報文首部 不回傳報文主體部分,用于確認 URI 的有效性及資源更新的日期時間等
DELETE 洗掉檔案 自身不帶驗證機制,存在安全性問題
OPTIONS 詢問支持的方法 用來查詢針對請求 URI 指定的資源支持的方法
TRACE 追蹤路徑 容易引發 XST(Cross-Site Tracing, 跨站追蹤)攻擊,不建議使用
CONNECT 用隧道協議連接代理 代理服務器通信時建立隧道,實作用隧道協議進行 TCP 通信

TRACE 方法是讓 Web 服務器端將之前的請求通信環回給客戶端的方法,發送請求時,在 Max-Forwards 首部欄位中填入數值,每經過一個服務器端就將該數字減 1,當數值剛好減到 0 時, 就停止繼續傳輸,最后接收到請求的服務器端則回傳狀態碼 200 OK 的回應,

CONNECT 方法要求在與代理服務器通信時建立隧道,實作用隧道協議進行 TCP 通信,主要使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協議把通信內容加密后經網路隧道傳輸給代理服務器,

2.回應報文

回應報文基本上由協議版本、狀態碼(表示請求成功或失敗的數字代碼)、用以解釋狀態碼的原因短語、可選的回應首部欄位以及物體主體構成,

回應狀態碼的類別:

狀態碼 類別 描述
1xx Informational(資訊性狀態碼) 接收的請求正在處理
2xx Success(成功狀態碼) 請求正常處理完畢
3xx Redirection(重定向狀態碼) 需要進行附加操作以完成請求
4xx Client Error(客戶端錯誤狀態碼) 服務器無法處理請求
5xx Server Error(服務器錯誤狀態碼) 服務器處理請求出錯

常見的回應狀態碼含義:

狀態碼 含義 描述
200 OK 請求正常處理并回應
204 No Content 請求正常處理,但在回傳的回應報文中不含物體的主體部分,客戶端不做更新
206 Partial Content 客戶端進行范圍請求,回應報文中由 Content-Range 指定范圍的物體內容
301 Moved Permanently 永久性重定向,回應報文中的 Location 首部欄位會帶回新的 URL 地址
302 Found 臨時性重定向,希望用戶(本次)能使用新的 URI 訪問
303 See Other 臨時性重定向,與 302 類似,但 303 狀態碼明確表示客戶端應當采用 GET 方法獲取資源
304 Not Modified 服務端判定資源沒有改變,不回應資源,客戶端可以從本地快取中獲取資源
400 Bad Request 客戶端請求報文中存在語法錯誤
401 Unauthorized 客戶端請求需要 HTTP 認證資訊
403 Forbidden 客戶端請求資源的訪問被服務器拒絕了,多見于權限問題
404 Not Found 服務器無法找到請求的資源
500 Internal Server Error 服務端執行請求時發生了錯誤
503 Service Unavailable 服務端暫時處于超負載或正在進行停機維護,現在無法處理請求

tips:當 301、302、303 回應狀態碼回傳時,幾乎所有的瀏覽器都會把 POST 改成 GET,并洗掉請求報文內的主體,之后請求會自動再次發送,

三、HTTP 狀態管理

HTTP 是一種不保存狀態,即無狀態(stateless)協議,HTTP 協議自身不對請求和回應之間的通信狀態進行保存,也就是說,每當有新的請求發送時,就會有對應的新回應產生,協議本身并不保留之前一切的請求或回應報文的資訊,這是為了更快地處理大量事務,確保協議的可伸縮性,以及減少服務器 CPU 和記憶體資源的損耗,從而特意把 HTTP 協議設計成如此簡單的,

那么 HTTP 協議怎么管理狀態呢?這就要說到 Cookie 技術,Cookie 技術通過在請求和回應報文中寫入 Cookie 資訊來控制客戶端的狀態,

Cookie 會根據從服務器端發送的回應報文內的一個叫做 Set-Cookie 的首部欄位資訊,通知客戶端保存 Cookie,當下次客戶端再往該服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值后發送出去,

服務器端發現客戶端發送過來的 Cookie 后,會去檢查究竟是從哪一個客戶端發來的連接請求,然后對比服務器上的記錄,最后得到之前的狀態資訊,

四、其他

1、HTTP 內容編碼是指在不丟失物體資訊的前提下所進行的壓縮,內容編碼后的物體由客戶端接收并負責解碼,常見的內容編碼有以下幾種:

  • gzip(GUN zip)
  • compress(UNIX 系統的標準壓縮)
  • deflate(zlib)
  • identity(不進行編碼)

2、HTTP 分塊傳輸編碼(Chunked Transfer Coding)會將物體主體分成多個部分(塊),每一塊都會用十六進制來標記塊的大小,而物體主體的最后一塊會使用“0(CR+LF)”來標記,分塊傳輸編碼的物體主體由客戶端接收并負責解碼,

3、HTTP 發送的一份報文主體中可含有多型別物體,通常是在圖片或文本檔案等上傳時使用,多型別物體的每個部分型別中,都可以含有首部欄位,多型別物體包含的物件如下:

  • multipart/form-data,在 web 表單檔案上傳時使用,
  • multipart/byteranges,狀態碼 206(Partial Content,部分內容)回應報文包含了多個范圍的內容時使用,
Content-Type: multipart/form-data; boundary=AaB03x
--AaB03x
Content-Disposition: form-data; name="field1"
Joe Blow
--AaB03x
Content-Disposition: form-data; name="pics"; filename="file1.txt"
Content-Type: text/plain
...(file1.txt的資料) ...
--AaB03x

HTTP 協議的 header 中的 Range 是用來指定資源的 byte 范圍,比如:“Range:bytes=5001-10000” 表示請求 5001- 10000 位元組的資源,針對范圍請求,回應會回傳狀態碼為 206 Partial Content 的回應報文,并在 header 欄位指明 “ContentType:multipart/byteranges”

4、Comet 是一種高級的 Ajax 技術,通過延遲應答,模擬實作服務器端向客戶端推送(Server Push)的功能,通常,服務器端接收到請求,在處理完畢后就會立即回傳回應,但為了實作推送功能,Comet 會先將回應置于掛起狀態,當服務器端有內容更新時,再回傳該回應,因此,服務器端一旦有更新,就可以立即反饋給客戶端,

內容上雖然可以做到實時更新,但為了保留回應,一次連接的持續時間也變長了,期間,為了維持連接會消耗更多的資源,另外,Comet 也仍未解決 HTTP 協議本身存在的問題,

5、HTTP 協議的缺點?

  • 一條連接上只可發送一個請求,
  • 請求只能從客戶端開始,客戶端不可以接收除回應以外的指令,
  • 請求/回應首部未經壓縮就發送,首部資訊越多延遲越大,
  • 發送冗長的首部,每次互相發送相同的首部造成的浪費較多,
  • 可任意選擇資料壓縮格式,非強制壓縮發送,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/187929.html

標籤:Java

上一篇:springcloud~服務發現之k8s服務

下一篇:Java 中 String 對 null 物件的容錯處理!

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more