HTTP結構

来源:https://www.cnblogs.com/unclekeith/archive/2018/01/08/8242012.html
-Advertisement-
Play Games

HTTP結構 轉載請註明出處: "HTTP結構簡介" HTTP通信過程包括從客戶端發往伺服器的請求和伺服器返回客戶端的響應,這篇文章就簡單的瞭解一下HTTP請求和響應的結構與協議本身的狀態管理。 用戶HTTP協議交互的信息被稱為HTTP報文,HTTP報文可分為請求報文和響應報文。請求報文包括請求行、 ...


HTTP結構

轉載請註明出處:HTTP結構簡介

HTTP通信過程包括從客戶端發往伺服器的請求和伺服器返回客戶端的響應,這篇文章就簡單的瞭解一下HTTP請求和響應的結構與協議本身的狀態管理。

用戶HTTP協議交互的信息被稱為HTTP報文,HTTP報文可分為請求報文和響應報文。請求報文包括請求行、首部欄位(請求、通用、實體)和報文主體。響應報文包括狀態行、首部欄位(響應、通用、實體)和報文主體。

常見的請求頭和響應頭如下

關於圖中涉及的請求與響應首部欄位在之後的文章會涉及到。

1.HTTP是不保存狀態的協議

HTTP是一種不保存狀態,即無狀態協議。HTTP協議本身不對請求和響應的通信狀態進行保存。也就是說,HTTP協議對於發送過的請求和響應都不做持久化處理。

這樣做的好處是為了更快的處理大量事務,確保協議的可伸縮性。但是隨著web的不斷發展,因為無狀態協議而導致業務處理變得棘手。如用戶登錄到一個電商網站,即使他跳轉到該網站的其他頁面,也需要能保持登錄狀態。如果仍然保持無狀態協議的話,那每次進行頁面跳轉都需要重新登錄一次。

雖然HTTP/1.1是無狀態協議,但是為了實現保持狀態功能而引入了Cookie。有了Cookie進行狀態管理之後,就可以實現登錄、購物車等功能了。

由於HTTP是無狀態協議,因此引入了Cookie技術進行狀態管理。

比如我們要實現的功能是:在登錄之後的5天內,訪問同一個網站時都不用再次登錄。

要實現這個持久登錄的功能,就可以使用Cookie對用戶身份進行狀態管理。過程大致如下:

1. 第一次登錄時,服務端在響應頭部設置Set-Cookie欄位(包括name, value, path, expires, httpOnly, domain等)。
2. 瀏覽器接收到響應之後,會對Cookie信息進行存儲。
3. 在下次訪問該頁面時,瀏覽器在發送請求時會將Cookie自動帶上,一同發向伺服器。
4. 伺服器在收到瀏覽器發過來的請求時,對傳過來的Cookie信息和伺服器的Cookie信息進行匹配校驗,如果匹配成功,則得到之前的狀態信息。

對Cookie不熟悉的同學可以看看這篇文章。傳送門: 前端存儲

給一個生動的圖片說明Cookie狀態管理。

針對登錄態還應該防範XSS攻擊和CSRF攻擊。不熟悉的同學可以看看這篇文章。前端安全之XSS 前端安全之XSS

3. 持久連接節省通信

HTTP協議的初始版本中,每進行一次HTTP通信就要斷開一個TCP連接。這種非持久連接的缺點在於每次請求都會造成無謂的TCP連接建立和斷開,增加TCP協議本身的開銷。

例如,在訪問某東電商網站時,如果是非持久的通信,那麼會出現如下情況。

載入DOM節點(三次握手 + HTTP通信 + 四次分手)
載入各種商品圖片([三次握手 + HTTP通信 + 四次分手] x N次)
...其他前端資源([三次握手 + HTTP通信 + 四次分手] x (N + 1)次)

訪問一次頁面時就要建立和斷開TCP連接無數次,這無疑會導致前端頁面渲染的性能問題。

3.1 持久連接

為瞭解決不斷建立和斷開TCP連接的問題,HTTP/1.1實現了持久連接,即在請求頭和響應頭都有相應的Connection: Keep-Alive欄位。持久連接的特點是,只要任意一端沒有明確提出斷開TCP連接,則保持TCP連接狀態。

持久連接(keep-alive)的好處在於減少了TCP連接的重覆建立和斷開所造成的額外開銷,減輕了伺服器端的負載,加快了網頁渲染的速度。

3.1 管線化

以前發送請求後需要收到響應,才能發送下一個請求。持久連接意味著可以在一次TCP連接之後發送多個請求,而管線化技術的出現使得每個請求可以非同步發送,而不用等待響應了。也就是說,管線化能夠做到同時並行發送多個請求,而不需要一個接一個的等待響應了。

比如說,當請求一個包含10張圖片的網頁,與挨個連接相比,採用持久連接可以減少TCP連接建立與斷開的時間,而採用管線化技術則比持久連接更快,因為可以非同步發送請求。請求數量越多,時間差就越明顯。一般情況下,會同時使用持久連接和管線化。

4 HTTP狀態碼

響應報文中包含的狀態行中,包含HTTP響應狀態碼。狀態碼的職責是當客戶端向伺服器端發送請求時,描述返回的請求結果。

狀態行的格式如下:

[協議版本號] [狀態碼] [狀態碼對應信息]

HTTP狀態碼沒有什麼學習上的難度,只需要記住狀態碼對應的意思即可。以下是狀態碼的類別。

以下會對常見的狀態碼進行簡單的說明。

2XX 成功

200 OK: 伺服器端正確處理請求。

204 No Content: 伺服器接收的請求已經成功處理,但在返回的響應報文中不包含實體的主體內容。也不允許返回任何實體的主體。一般在只需要從客戶端往伺服器發送消息,而對客戶端不需要發送新信息內容的情況下使用。

206 Partial Content: 客戶端進行範圍請求,而伺服器成功執行了GET請求,會在響應報文中添加Content-Range指定範圍的實體內容。

3XX 重定向

301 Moved Permanently: 永久重定向。該狀態碼表示請求的資源已經被分配到了新的URI,以後應使用資源現在所指的URI。

302 Found: 臨時重定向。該狀態碼表示請求的資源被分配到了新的URI,希望用戶能使用(本次)新的URI進行訪問。

303 See Other: 表示由於請求對應的資源存在著另一個URI,應該使用GET方法定向獲取請求的資源。這個狀態碼我在實際業務中基本沒有見過...

304 Not Modified: 表示請求的資源在瀏覽器存在緩存,則伺服器端會返回304,直接從瀏覽器讀取緩存,而不是從伺服器獲取資源。雖然304狀態碼被劃分在3XX中,但是其和重定向沒有關係。

4XX 客戶端錯誤

400 Bad Request: 表示請求報文中存在錯誤。

401 Unauthorized: 表示發送的請求需要有通過HTTP認證的認證信息。當瀏覽器初次接收到401響應時,會彈出認證用的對話視窗。

403 Forbidden: 沒有許可權訪問請求的資源。未獲得文件系統的訪問許可權,訪問許可權出現某些問題(從未授權的IP地址試圖訪問)等情況都可能會返回403。

404 Not Found: 伺服器上無法找到對應的請求資源。

5XX 伺服器錯誤

500 Internal Server Error: 表示伺服器端在執行請求時發生了錯誤。也有可能是應用存在的bug獲某些臨時的故障。

503 Service Unavailable: 表示伺服器暫時處於超負荷獲正在停機維護,現在無法處理請求。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這一節跑下一批plugin。 希望不要跟上一節一樣,全是plugin。 流程如圖(看看流程圖就行了,後面也沒有什麼內容): EnsureChunkConditionsPlugin 這個看看就懂,不解釋了。 RemoveParentModulesPlugin 難道又是另一批plugin麽…… Remo ...
  • 介紹 Elf.js 是一個簡潔的高效的 框架。它不僅高度重視用戶的體驗,也高度重視開發者的體驗。在實現當今主流技術的同時,以儘可能原生態的形式展現出來。在如今花樣繁多的框架中,你是否感覺各種思想、語法、工具大大增加了你的學習時間,那麼 是一個不錯的開始。她將最初的 Web 設計理念與現代技術完美結合 ...
  • 最近在使用webpack + vue做個人娛樂項目時,發現npm run build後,css js img靜態資源文件均找不到路徑,報404錯誤。。。網上查找了一堆解決辦法,總結如下 一、首先修改config目錄下的index.js文件 將其中build的配置項assetsPublicPath進行 ...
  • 在IT界,需要大量的 JavaScript 開發者。如果你的能力能夠勝任這一角色,那麼你將獲得許多換工作和提高薪水的機會。但是在你被公司錄取之前,你需要展現你的技術,以便通過面試環節。在這篇文章中,我會為你展示前端面試會被問到的 5 個典型問題及相關解決方法,這 5 個問題常被用來測試面試者的 Ja ...
  • 下一個compilation來源於以下代碼: 之前簡單分析該處的apply,此處只看非數組單入口的情況,此時會引入SingleEntryDependency模塊,與compilation相關的內容如下: 此處用到了ES6新加的數據結構Map,SingleEntryDependency是個沒什麼營養的 ...
  • Promise 是非同步編程的一種方案,簡單說就是一個容器,裡面保存著某個未來才會結束的事件的 結果,Promise 是一個對象,從它,可以獲取非同步操作的消息。 Promise 對象有以下兩個特點。 (1)對象的狀態不受外界影響。Promise 對象代表一個非同步操作,有是三種狀態。pendding ( ...
  • 一切皆是對象嗎 ...
  • 當我們的app開發完成之後,無可避免的以後會進行產品升級,那麼我們希望在客戶的手機上讓app進行自動升級,可以分為自動升級和手動升級。 自動升級:一般在客戶app第一次打開首頁的時候。 手動升級:在app界面提供一個升級的入口。 界面效果演示如下: 代碼其實也很簡單,不過針對ios和android要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...