1. 程式人生 > >閱讀手札 | 手把手帶你探索『圖解 HTTP』

閱讀手札 | 手把手帶你探索『圖解 HTTP』

前言

本文已經收錄到我的 Github 個人部落格,歡迎大佬們光臨寒舍:

我的 Github 部落格

學習清單:

一、網路基礎 TCP/IP

通常使用的網路(包括網際網路)是在 TCP/IP 協議族的基礎上運作,而 HTTP 屬於它內部的一個子集

1.1 層次劃分

  • 應用層: 決定了向用戶提供應用服務時通訊的活動,比如 FTPDNSHTTP

易記:應用層,顧名思義,是提供給應用服務的活動,然後現在最火的應用是微信(通訊功能),所以就是:向用戶提供應用服務時通訊

  • 傳輸層: 對上層應用層,提供處於網路連線中的兩臺計算機之間的資料傳輸,比如 TCPUDP

易記:傳輸層,顧名思義,提供計算機之間的資料傳輸

  • 網路層: 用來處理在網路上流動的資料包,該層規定了通過怎樣的路徑到達對方計算機,並把資料包傳送給對方;與對方計算機之間通過多臺計算機或網路裝置進行傳輸時,網路層所起的作用就是在眾多的選項內選擇一條傳輸路線

易記:網路層,顧名思義,處理在網路上流動的資料包,規定通過什麼路徑

  • 資料鏈路層: 用來處理連線網路的硬體部分

易記:資料鏈路層,顧名思義,鏈路偏硬體的東西,而資料是偏軟體層面的東西,自然可以想到是起到連線作用

1.2 通訊的過程

  1. 首先作為傳送端的客戶端在應用層(HTTP 協議)發出獲取 Web 頁面的 HTTP 請求
  2. 接著,為了傳輸方便,在傳輸層(TCP 協議)把從應用層處收到的資料(HTTP
    請求報文)進行分割,並在各個報文上打上標記序號及埠號後轉發給網路層
  3. 在網路層(IP 協議),增加作為通訊目的地的 MAC 地址後轉發給鏈路層。這樣一來,發往網路的通訊請求就準備齊全了
  4. 接收端的伺服器在鏈路層接收到資料,按序往上層傳送,一直到應用層。當傳輸到應用層,才能算真正接收到由客戶端傳送過來的 HTTP 請求
image-20200707164153058

1.3 三次握手

之前已經筆者已經寫了,因此在這裡就不再贅述,點選連結即可跳轉:TCP 連線管理

1.4 各協議與 HTTP 協議的關係

image-20200707164806629

1.5 URI 和 URL

Q1:URLURI 的區別

  • URI
    用字串標識某一網際網路資源
  • URL 表示資源的地點

由此可見, URLURI 的子集

Q2:URI 的各部分結構

image-20200707181219904

二、簡單的 HTTP 協議

2.1 HTTP 方法

  • GET 獲取資源: 用來請求訪問已被 URI 識別的資源,指定的資源經伺服器端解析後返回響應內容
  • POST 傳輸實體主體: 用來傳輸實體的主體 雖然用 GET 方法也可以傳輸實體的主體,但一般不用 GET 方法進行傳輸,而是用 POST 方法
  • PUT 傳輸檔案: 在請求報文的主體中包含檔案內容,然後儲存到請求 URI 指定的位置 鑑於 HTTP1.1PUT 方法自身不帶驗證機制,任何人都可以上傳檔案,存在安全性問題,因此一般不使用該方法
  • HEAD 獲得報文首部: 和 GET 方法一樣,只是不返回報文主體部分。 用於確認 URI 的有效性及資源更新的日期時間等
  • DELETE 刪除檔案: 用來刪除檔案,是與 PUT 相反的方法。DELETE 方法按請求 URI 刪除指定的資源。 不帶驗證機制,所以一般不使用 DELETE 方法

put 相對應,兩者都不具備驗證機制

  • OPTIONS 詢問支援的方法: 用來查詢針對請求 URI 指定的資源支援的方法(瞭解即可)
  • TRACE 追蹤路徑: 讓 Web 伺服器端將之前的請求通訊返回給客戶端的方法。 但 TRACE 方法本來就不怎麼常用,再加上它容易引發 XST攻擊,通常就更不會用到了(瞭解即可)
  • CONNECT 要求用隧道協議連線代理: 要求在與代理伺服器通訊時建立隧道,實現用隧道協議進行 TCP 通訊。 主要使用 SSL(Secure Sockets Layer,安全套接層)和 TLS(Transport Layer Security,傳輸層安全)協議把通訊內容加密後經網路隧道傳輸。

2.2 持久連線節省通訊量

2.2.1 持久連結

持久連線的特點是,只要任意一端沒有明確提出斷開連線,則保持 TCP 連線狀態

持久連線的好處:

  • 減少了 TCP 連線的重複建立和斷開所造成的額外開銷,減輕了伺服器端的負載

感覺有點類似於連線池的作用

  • 減少開銷的那部分時間,使 HTTP 請求和響應能夠更早地結束,這樣 Web 頁面的顯示速度也就相應提高了

2.2.2 管線化

管線化技術出現後,不用等待響應亦可直接傳送下一個請求

這樣就能夠做到同時並行傳送多個請求,而不需要一個接一個地等待響應了

用持久連線可以讓請求更快結束。而管線化技術則比持久連線還要快。請求數越多,時間差就越明顯。

2.4 使用 Cookie 的狀態管理

狀態管理其實還有很多種,比如 Session ,token ,這裡僅介紹 cookie

HTTP 是無狀態協議,它不對之前發生過的請求和響應的狀態進行管理。

Cookie 技術通過在請求和響應報文中寫入 Cookie 資訊來控制客戶端的狀態。Cookie 會根據從伺服器端傳送的響應報文內的一個叫做 Set-Cookie 的首部欄位資訊,通知客戶端儲存 Cookie。當下次客戶端再往該伺服器傳送請求時,客戶端會自動在請求報文中加入 Cookie 值後傳送出去

三、HTTP 報文內的 HTTP 資訊

3.1 壓縮傳輸的內容編碼

內容編碼指明應用在實體內容上的編碼格式,並保持實體資訊原樣壓縮

常用的內容編碼有:

  • gzip
  • compress
  • deflate
  • identity

四、返回結果的 HTTP 狀態碼

4.1 狀態碼告知從伺服器端返回的請求結果

數字中的第一位指定了響應類別,後兩位無分類

類別 原因短語
1XX Informational 接收的請求正在處理
2XX Success 請求正常處理完畢
3XX Redirection 需要進行附加操作以完成請求
4XX Client Error 客戶端無法處理請求
5XX Server Error 伺服器處理請求出錯

4.2 2xx 成功

2xx 成功

4.3 3xx 重定向

4.4 4XX 客戶端錯誤

image-20200711224935405

PS:注意區分 403 和 404,一個是被拒絕(一般是許可權問題),另一個是無法找到

4.5 5XX 伺服器錯誤

五、Web 伺服器

5.1 用單臺虛擬主機實現多個域名

HTTP1.1 規範允許一個伺服器搭建多個 Web 站點,這是虛擬主機功能。

Q1:為啥 Host 首部內完整指定主機名或域名的 URI

因為虛擬主機可以寄存多個不同主機名和域名的 Web 網站

5.2 通訊資料轉發程式

這些應用程式和伺服器可以將請求轉發給通訊線路上的下一站伺服器,並且能接收從那臺伺服器傳送的響應再轉發給客戶端。

  1. 代理:接收客戶端傳送的請求後轉發給其他伺服器;代理不改變請求 URI,會直接傳送給前方持有資源的目標伺服器。
  • 快取代理:預先將資源快取儲存在代理伺服器上,當代理再次接收到對相同資源的請求時,就可以直接將之前快取的資源作為響應返回
  • 透明代理:轉發請求或響應時,不對報文做任何加工被稱為透明代理,對報文內容進行加工的稱為非透明代理。
image-20200712195432972

2.閘道器:轉發其他伺服器通訊資料的伺服器,接收從客戶端傳送來的請求時,它就像自己擁有資源的源伺服器一樣對請求進行處理。

image-20200712195459045

3.隧道: 按要求建立起一條與其他伺服器的通訊線路,屆時使用 SSL 等加密手段進行通訊,在通訊雙方斷開連線時結束。隧道的目的是確保客戶端能與伺服器進行安全的通訊。

5.3 儲存資源的快取

客戶端的快取: 瀏覽器快取如果有效,不必再向伺服器請求,而直接從本地讀取。當判定快取過期後,會向源伺服器確認資源的有效性。若判斷瀏覽器快取失效,瀏覽器會再次請求新資源。

image-20200712172523006

六、HTTP 首部

HTTP 協議的請求和響應報文中必定包含 HTTP 首部,請求報文和響應報文結構如下

image-20200713143253306
image-20200713143234364

6.1 HTTP 首部欄位

HTTP 首部欄位將定義成快取代理和非快取代理的行為,分成 2 種類型。

  1. 端到端首部: 分在此類別中的首部會轉發給請求 / 響應對應的最終接收目標,且必須儲存在由快取生成的響應中,另外規定它必須被轉發。
  2. 逐跳首部: 分在此類別中的首部只對單次轉發有效,會因通過快取或代理而不再轉發。HTTP1.1 和之後版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部欄位。

6.1.1 通用首部欄位

請求報文和響應報文兩方都會使用的首部。

首部欄位名 說明
Cache-Control 控制快取的行為
Connection 逐跳首部、連線的管理
Date 建立報文的日期時間
Pragma 報文指令
Trailer 報文末端的首部一覽
Transfer-Encoding 指定報文主體的傳輸編碼方式
Upgrade 升級為其他協議
Via 代理伺服器的相關資訊
Warning 錯誤通知

6.1.2 請求首部欄位

從客戶端向伺服器端傳送請求報文時使用的首部。補充了請求的附加內容、客戶端資訊、響應內容相關優先順序等資訊。

相關推薦

閱讀手札 | 手把手探索圖解 HTTP

前言 本文已經收錄到我的 Github 個人部落格,歡迎大佬們光臨寒舍: 我的 Github 部落格 學習清單: 一、網路基礎 TCP/IP 通常使用的網路(包括網際網路)是在 TCP/IP 協議族的基礎上運作,而 HTTP 屬於它內部的一個子集 1.1 層次劃分 應用層: 決定了向用戶提

手把手閱讀Mybatis原始碼(三)快取篇

前言 大家好,這一篇文章是MyBatis系列的最後一篇文章,前面兩篇文章:手把手帶你閱讀Mybatis原始碼(一)構造篇 和 手把手帶你閱讀Mybatis原始碼(二)執行篇,主要說明了MyBatis是如何將我們的xml配置檔案構建為其內部的Configuration物件和MappedSta

手把手畫一個 時尚儀表盤 Android 自己定義View

androi alias 屬性 extend 三角函數 blank xutils content 還在 拿到美工效果圖。咱們程序猿就得畫得一模一樣。 為了不被老板噴,僅僅能多練啊。 聽說你認為前面幾篇都so easy,那今天就帶你做個相對照較復雜的。

別怕,手把手撕、拉、扯下SpringMVC的外衣

ons mvc springmvc test stp 實的 per war sdi 提到框架,就不得不提一下看源碼,我們平時總是想求大神帶我們飛,然而看源碼就是一個向大神學習的最直接的一種方式,然而我們每次鼓起勇氣看源碼前是這樣的但是一點開源碼,頓時代碼如洪流湧入,你的內心

Android性能優化:手把手全面了解 內存泄露 & 解決方案

new t 簡單介紹 新建 cti 接口 stat you bit ray . 簡介 即 ML (Memory Leak)指 程序在申請內存後,當該內存不需再使用 但 卻無法被釋放 & 歸還給 程序的現象2. 對應用程序的影響 容易使得應用程序發生內存溢出,即 OO

手把手入坑H5與小程序直播開發視頻課程直播的工作原理教程

直播 H5 微信 第1章 課程介紹對於課程整體以及直播行業的現狀進行介紹第2章 直播工作原理所謂知其然也要知其所以然,只會用別人總結好的東西很難有質的進步,只有深諳背後的工作原理才能進一步吃透到進階。本章從直播協議入手到工作原理詳解,步步為營,化繁為簡,極易吸收。第3章 Video詳解video

大數據是什麽?華為雲學院探索大數據之旅

個人 知識管理 一個 信息技術 每年 大數據 vol 核心 創新 大數據是什麽?華為雲學院帶你探索大數據之旅我們首先從大數據是什麽開始講起,!下面由我來帶領大家!展開我們本次的大數據學習之旅!大數據是什麽,內容將包括大數據的產生,發展大數據的基本概念。首先我們來追溯一下大數

手把手擼一套Android簡易ORM框架

ORM概念 實體模型建立 註解列 ID 主鍵 自增長 資料表的列

月薪30k+專案分紅,哥大教授探索“區塊鏈+AI”,抓緊時間投簡歷吧!手慢無...

每週日,「區塊鏈大本營」人才快報與你不見不散!在這裡,可以第一時間瞭解區塊鏈的行業動態、技術風向與人才需求。 如果你是求職者,請將個人簡歷以Word文件形式(統一格式"求職+姓名+目標公司+應聘職位+手機號")發至郵箱; 如果你是招聘者,請將職位資

手把手抓取智聯招聘的“資料分析師”崗位!

前言 很多網友在後臺跟我留言,是否可以分享一些爬蟲相關的文章,我便提供了我以前寫過的爬蟲文章的連結(如下連結所示),大家如果感興趣的話也可以去看一看哦。在本文中,我將以智聯招聘為例,分享一下如何抓取近5000條的資料分析崗資訊。 往期爬蟲連結 上海歷史天氣和空氣質量資料獲取(Pyth

手把手搭建百萬PV網站架構

簡介 PV( page view),即頁面瀏覽量,或點選量;通常是衡量一個網路新聞頻道或網站甚至一條網路新聞的主要指標。對PV的解釋是,一個訪問者在24小時(0點到24點)內到底看了你網站幾個頁面。這裡需要強調:同一個人瀏覽你網站同一個頁面,不重複計算PV量,點100次也算1次。說白了pV就是一個訪問者打開

手把手玩轉 Git

目前國內開發人員普遍都開始使用 Git 進行專案的版本管理,如果說你還在使用 SVN 並且對 Git 一無所知的話,那我的這個 Chat 將會幫助到你。 我將手把手教你入門,並且巡迴漸進的帶入到工作的實際應用中。 在本場 Chat 中我將分享: Git 由來和 Git 的作用以及 Git

Android:手把手 深入讀懂 Retrofit 2.0 原始碼

前言 在Android開發中,網路請求十分常用 而在Android網路請求庫中,Retrofit是當下最熱的一個網路請求庫 Github截圖 今天,我將手把手帶你深入剖析Retrofit v2.0的原始碼,希望你們會喜歡 請儘量在PC端

手把手做專案,3周學會小程式

初衷 自微信小程式出道以後不斷升溫,各行各業都在嘗試使用小程式。所以小編特此把自己編寫小程式過程中遇到的問題,心得,和技巧分享給大家,希望可以幫助在路上和準備上路的“碼”友。 “極客衝頂”是小編在業餘時間編寫的一款答題小程式,期間遇到了很多問題,特此歸納總結,做了一系列的文章分享給大家。為了大家更好的理解小

手把手打造一個 Android 熱修復框架(上篇)

本文來自網易雲社群作者:王晨彥前言熱修復和外掛化是目前 Android 領域很火熱的兩門技術,也是 Android 開發工程師必備的技能。目前比較流行的熱修復方案有微信的 Tinker,手淘的 Sophix,美團的 Robust,以及 QQ 空間熱修復方案。QQ 空間熱修復方

區塊鏈能養貓養狗了?!手把手復現AI+區塊鏈寫碼全過程!(附程式碼)

區塊鏈養貓養狗、區塊鏈遊戲、區塊鏈遊戲,區塊鏈旅遊……打著區塊鏈名頭的專案蜂擁上線。 如何將區塊鏈和AI兩種不同技術結合?如何在python中編寫工作證明演算法?一致性演算法有哪些? 雷鋒字幕組特別編譯了本期「區塊鏈一致性演算法和人工

現場玩轉兒IoT資料?百度雲手把手”!

話說,如今發展勢頭火熱的物聯網,其資料究竟有何special? 每分鐘數百萬條事件,還有大量間歇資料流? 時序資料是常態,還有可能出現“易逝”現象? 各種資料來源產生,從“感測器讀數”到“現場視訊流”簡直應有盡有? 好吧!如此看來,再加上日漸增長的互聯裝置,爆炸式擴容

手把手畫一個動態錯誤提示 Android自定義view

嗯。。再差1篇就可以獲得持之以恆徽章了,今天帶大家畫一個比較簡單的view。 轉載請註明出處:http://blog.csdn.net/wingichoy/article/details/50477108 廢話不多說,看效果圖: 首先 建構函式 測量... 這裡就一筆帶

一個炫字都不夠??!!!手把手打造3D自定義view

分享一則最近流行的笑話: 最新科學研究表明:寒冷可以使人保持年輕,樓下的王大爺表示雖然今年已經60多歲了,但是仍然冷的跟孫子一樣。 呃。好吧,這個冬天確實有點冷,在廣州活生生的把我這個原生北方人,凍成一條狗。(研究表明:寒冷可以讓人類基因突變。。。。)

手把手畫一個 時尚儀表盤 Android 自定義View

拿到美工效果圖,咱們程式設計師就得畫得一模一樣。 為了不被老闆噴,只能多練啊。 聽說你覺得前面幾篇都so easy,那今天就帶你做個相對比較複雜的。 轉載請註明出處:http://blog.csdn.net/wingichoy/article/details/50468

首部欄位名 說明
Accept 使用者代理可處理的媒體型別
Accept-Charset 優先的字符集
Accept-Encoding 優先的內容編碼
Accept-Language 優先的語言(自然語言)