《圖解HTTP》

来源:http://www.cnblogs.com/jesse131/archive/2016/04/02/5347911.html
-Advertisement-
Play Games

第一章、瞭解web及網路基礎 1.2 http的誕生 HTTP於1990年問世,那時候HTTP並沒有作為正式的標準被建立,被稱為HTTP/0.9 HTTP正式作為標準被公佈是在1996年5月,版本被命名為HTTP/1.0,該協議至今仍被廣泛用在伺服器端。 HTTP/1.1於1997年1月公佈,是目前 ...


第一章、瞭解web及網路基礎

1.2 http的誕生

HTTP於1990年問世,那時候HTTP並沒有作為正式的標準被建立,被稱為HTTP/0.9

HTTP正式作為標準被公佈是在1996年5月,版本被命名為HTTP/1.0,該協議至今仍被廣泛用在伺服器端。

HTTP/1.1於1997年1月公佈,是目前主流的HTTP協議版本。

HTTP/2.0正在制定中。

1.3 TCP/IP

TCP/IP不是某個協議,而是互聯網相關的各類協議族的總稱。詳細內容參見TCP/IP詳解學習筆記

TCP/IP協議族按層次分別為以下4層:

應用層:決定了向用戶提供應用服務時的通信活動,該層包括FTP DNS HTTP

傳輸層:對上層應用層,提供處於網路連接中的兩台電腦之間的數據傳輸,該層包括TCP UDP

網路層:用來處理在網路上流動的數據包,該層規定了通過怎樣的路徑達到對方電腦並把數據包傳送給對方

鏈路層:用來處理連接網路的硬體部分,網卡 光纖

TCP/IP通信傳輸流程(http舉例)

首先作為發送端的客戶端在應用層(http協議)發出一個想看某個web頁面的http請求。接著,為了傳輸的方便,在傳輸層(tcp協議)把從應用層處收到的數據(http請求報文)進行分割,併在各個報文上打上標記序號及埠號後轉發給網路層。在網路層(ip協議)增加作為通信目的地的MAC地址後轉發給鏈路層。這樣,發往網路的通信請求就齊全了。

TCP/IP通信傳輸流程

1.4.1 負責傳輸的IP協議

IP協議的作用是把各種數據包傳送給對方

IP地址指明瞭節點被分配到的地址,MAC地址是指網卡所屬的固定地址

1.4.2 確保可靠性的TCP協議

TCP協議為了更容易送達大數據才把數據分割,採用三次握手策略確保數據最終送達對方

三次握手策略:

發送端首先發送一個帶SYN(synchronize)標誌的數據包給對方,接收端收到後回傳一個帶有SYN/ACK標誌的數據包以示傳達確認信息。最後發送端再回傳一個帶ACK(acknowledgement)標誌的數據包代表握手結束。

1.5 負責功能變數名稱解析的DNS(Domain Name System)服務

DNS提供功能變數名稱到IP地址之間的解析服務

1.6 各種協議在http協議通信過程中的職責

按流程順序分別為:

DNS服務:把用戶輸入的功能變數名稱解析為IP地址

HTTP協議:生成針對目標web伺服器的HTTP請求報文

TCP協議:為了方便通信將HTTP請求報文分割成報文段,把每個報文段可靠的傳給對方

IP協議:搜索對方的地址,一邊中轉一邊傳送

TCP協議:從對方那裡接收報文段並按序號從組請求報文

HTTP協議:對web伺服器請求的內容的處理

1.7 URI/URL

URI(Uniform Resource Identifier)某個協議方案的資源的定位標識符

URL(Uniform Resource Locator)表示互聯網資源的具體地點

第二章、簡單的http協議

2.2 通過請求和響應的交換達成通信

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

請求報文的構成

響應報文基本上是由協議版本、狀態碼、用以解釋狀態碼的原因短語、可選的響應首部欄位及實體主體構成。

響應報文的構成

2.3 HTTP是不保存狀態的協議

HTTP協議自身不對請求和響應之間的通信狀態進行保存

2.5 告知伺服器意圖的http方法

GET:用來訪問已被URI識別的資源

POST:用來傳輸實體的主體

GET方法和POST方法的區別:

  1. 安全性

    • GET請求的數據會附在URL之後(就是把數據放置在HTTP協議頭中),以?分割URL和傳輸數據,參數之間以&相連,參數將明文出現在URL上,容易被他人看到,URL信息也可能會被記錄到歷史紀錄中。
    • POST請求是把提交的數據則放置在是HTTP包的包體中。
  2. 數據長度:

    • HTTP協議沒有對傳輸的數據和URL長度進行限制, 但特定瀏覽器和伺服器對URL長度有限制, 因此對於GET提交時,傳輸數據就會受到URL長度的限制;
    • 由於POST操作不是通過URL傳值,理論上數據長度不受限;
  3. GET請求能夠被緩存,以GET請求的URL能夠保存為瀏覽器書簽,而POST請求則都不能

  4. Get是用來從伺服器上獲得數據,而Post是用來向伺服器上傳遞數據。

以下其他方法均不常用

PUT:傳輸文件 HEAD:獲得報文首部 DELETE:刪除文件 OPTUIONS:詢問支持的方法 TRACK:追蹤路徑 CONNECT:要求用隧道協議連接代理

2.7 持久連接節省通信量

持久連接的好處在於減少了TCP連接的重覆建立和斷開所造成的額外開銷,減輕伺服器端荷載。在HTTP/1.1中所有連接預設都是持久連接

持久連接使得多數請求以管線化方式發送,即能同時並行發送多個請求。

2.8 使用cookie的狀態管理

cookie技術是通過在請求和響應報文中寫入cookie信息來控制客戶端的狀態

Cookie會根據從伺服器發送的響應報文內的一個叫做Set-Cookie的首部欄位信息,通知客戶端保存cookie。當下次客戶端再往該伺服器發送請求時,客戶端會自動在請求報文中加入Cookie值後發送出去。伺服器端接收到客戶端發送過來的Cookie後,會去檢查究竟是從哪一個客戶端發來的連接請求,然後對比伺服器上的記錄,最後得到之前的狀態信息。

第三章、http報文內的http信息

3.1 HTTP報文

HTTP報文大致可分為報文首部和報文主體兩塊,兩者有最初出現的空行來劃分,通常並不一定要有報文主體

3.2 請求報文和響應報文的結構

請求行:包含用於請求的方法,請求URI和HTTP版本

狀態行:包含響應結果的狀態碼,原因短語和HTTP版本

首部欄位:包含表示請求和響應的各種條件和屬性的各類首部,一般分別為:通用首部、請求首部、響應首部和實體首部。

其他:包含HTTP的RFC里未定義的首部(Cookie等)

3.3 編碼提升傳輸速率

常用的內容編碼方式有以下幾種:

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

3.5 獲取部分內容的範圍請求(Range Request)

執行範圍請求時,會用到首部欄位Range來指定資源的byte範圍

針對範圍請求,響應會返回狀態碼為206 Partial Content的響應報文

3.6 內容協商返回最合適的內容

內容協商機制是指客戶端和伺服器端就響應的資源內容進行交涉,然後提供給客戶端最適合的資源。內容協商會以響應資源的語言、字元集、編碼方式等作為判斷的基準。如首部欄位中的Accept、Accept-Charset、Accept-Enoding、Accept-Language、Content-Language

第四章、返回結果的http狀態

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

類別 Cool
1XX informational(信息性狀態碼) 接收的請求正在處理
2XX Success(成功狀態碼) 請求正常處理完畢
3XX Redirection(重定向狀態碼) 需要進行附加操作已完成請求
4XX Client Error(客戶端錯誤狀態碼) 伺服器無法處理請求
5XX Server Error(伺服器端錯誤狀態碼) 伺服器處理請求出錯

4.2 2XX成功

200 OK 表示從客戶端發來的請求在伺服器端被正常處理

204 No Content 表示伺服器接收的請求已成功處理,但返回的響應報文中不允許返回任何實體的主體部分

206 Partial Content 表示客戶端進行了範圍請求,伺服器成功執行了這部分GET請求

4.3 3XX 重定向

304 Not Modified 表示客戶端發送附帶條件的GET請求時,其訪問的資源(自上次訪問以來或者根據請求的條件)未變化

4.4 4XX客戶端錯誤

401 Bad Request 表示報文中存在語法錯誤

403 Forbidden 表示對請求資源的訪問被伺服器拒絕了

404 Not Found 表示伺服器上無法找到請求的資源

4.5 5XX 伺服器錯誤

501 Internet Sever Error 表示伺服器端在執行請求時發生了錯誤

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

第五章、與http協作的web伺服器

5.1 用單個虛擬主機實現多個功能變數名稱

在相同的IP地址下,由於虛擬主機可以寄存多個不同主機名和功能變數名稱的Web網站,因此在發送HTTP請求時,必須在Host首部內完整指定主機名或功能變數名稱的URI

5.2.1 代理

代理伺服器的基本行為接收客戶端發送的請求後轉發給其他伺服器,代理不改變請求URI,轉發時需要附加Via首部欄位已標記出經過的主機信息。

使用代理伺服器的理由:

  • 利用緩存技術(代理緩存)減少網路帶寬的流量
  • 組織內部針對特定網站的訪問控制,以獲取訪問日誌為主要目的。

5.2.2 網關

網關能使通信線路上的伺服器提供非HTTP服務(SQL數據查詢)

5.2.3 隧道

隧道的目的是確保客戶端能與伺服器進行安全的通信

第六章、http首部

6.2.4 首部欄位一覽表

通用首部欄位

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

請求首部欄位

首部欄位名 說明
Accept 用戶代理可處理的媒體類型
Accept-Charset 優先的字元集
Accept-Encoding 優先的內容編碼
Accept-Language 優先的語言
Authorization web認證信息
Expect 期待伺服器的特定行為
Form 用戶的電子郵箱地址
Host 請求資源所在伺服器
if-Match 比較實體標記ETag
if-None-Math 比較實體標記
if-Modified-Since 比較資源的更新時間
if-Unmodified-Since 比較資源的更新時間
if-Range 資源未更新時發送實體byte的範圍請求
Max-Forwards 最大傳輸逐跳數
Proy-Authorization 代理伺服器要求的客戶端認證信息
Referer 對請求中URI的原始獲取方
Range 實體的位元組範圍請求
TE 傳輸編碼的優先順序
User-Agent http客戶端程式的信息

響應首部欄位

首部欄位名 說明
Accept-Range 是否接受位元組範圍請求
Age 推算資源創建經過時間
ETag 資源的匹配信息
Location 令客戶端重定向指定URI
Proxy-Authenticate 代理伺服器對客戶端的認證信息
Petry-After 對再次發起請求的時機要求
Server HTTP伺服器的安裝信息
Vary 代理伺服器緩存的管理信息
WWW-Authenticate 伺服器對客戶端的認證信息

實體首部欄位

實體首部欄位

第七章、確保web安全的https

7.1http缺點

  • 通信使用明文,內容可能被竊聽
  • 不驗證通信方身份,有可能遭遇偽裝
  • 無法證明報文的完整性,有可能已遭篡改

7.2 HTTP+加密+認證+完整性保護=HTTPS

HTTPS並非應用層的一種新協議,只是HTTP通信介面部分用SSL和TLS協議代替而已,其實就是身披SSL協議這層外殼的HTTP

SSL採用一種叫做公開密鑰加密的加密處理方式

公開密鑰加密使用一對非對稱的密鑰,私有密鑰和公開密鑰,發送密文的一方使用對方的公開密鑰進行加密處理,對方收到被加密的信息後,再使用自己的私有密鑰進行解密

公開密鑰加密處理起來比共用密鑰加密方式更為複雜,因此若在通信時使用公開密鑰加密方式,效率會很低。所以HTTPS採用採用共用密鑰加密和公開密鑰加密兩者並用的混合加密機制

混合加密機制原理:

  1. 使用公開密鑰加密方式安全的交換共用密鑰(在稍後的共用密鑰加密中要使用的密鑰)
  2. 確保交換的秘鑰安全的前提下,使用共用密鑰加密方式通信。

第八章、確認訪問用戶身份的認證

第九章、基於http的功能追加協議

9.2 消除http瓶頸的spdy

http瓶頸:

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

消除http瓶頸方法嘗試:

  • Ajax 能實時地從伺服器獲取內容,可能導致大量請求產生
  • Comet 內容隨可以實時更新,但為了保留響應,一次連接的持續時間變長了,消耗更多資源
  • SPDY 雖然能有效消除瓶頸,但當一個web網站使用多個功能變數名稱下的資源時,改善效果受限制

9.3 使用瀏覽器進行雙全工通信的WebSocket

WebSocket協議主要特點:

  • 支持由伺服器向客戶端推送數據功能
  • 減少通信量,不但每次連接總開銷減少,而且首部信息也很少

為了實現WebSocket通信需要將Http的Upgrade首部欄位值設為websocket,對於之前的握手請求,返回狀態碼101 Switching Proticols.成功握手確立WebSocket連接之後,不再使用HTTP的數據幀,而採用WebSocket獨立數據幀

WebSocket API

javascript可調用“The Websocket API”內提供的websocket程式介面,以實現websocket協議下雙全工通信

第十章、構建web內容的技術

第十一章、web的攻擊技術


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

-Advertisement-
Play Games
更多相關文章
  • Atitit.eclipse git使用 1. Git vs svn1 1.1. 直接記錄快照,而非差異比較1 1.2. Git的patch則不依附於branch,commit和commit之間的關係是一個GRAPH3 1.3. hg 本地有更改的時候,可以直接 pull 遠程代碼,然後在自己當前更 ...
  • 首先,我不是一個開發者,只是業餘學習者。其次我的文化水平很低,寫這個主要是記錄一下當前對於這塊的理解,因為對於一個低水平 的業餘學習者來說,忘記是很平常的事,因為接觸、應用的少,現在理解,可能過段時間就會忘了,自己記錄下來應該可以少走些彎路,以免從頭再來查找資料。 另外,如果我的記錄能幫忙到一些朋友 ...
  • 極驗目前的用戶超過7萬家網站,日均驗證量1億次,作為一家專註於驗證安全服務的公司,極驗所要面臨的併發壓力主要表現在以下幾點: 日益增加的用戶併發量。 驗證請求是全動態過程,不能夠進行緩存。 每一次請求都會造成資料庫的讀寫。 處理請求需要耗費CPU大量的時間進行模型的計算。 作為抗擊黑產的第一線,可能 ...
  • Element類型用於表現XML或HTML元素,提供對元素標簽名,子節點及特性的訪問。原型鏈的繼承關係為 某節點元素.__proto__->(HTML某元素Element.prototype)->HTMLElement.prototype->Element.prototype->Node.proto ...
  • html文本垂直居中對齊,代碼如下: <div id="box" style="height:100px; line-height:100px; border:1px solid #cccccc;margin:50px;"> <span style="vertical-align:middle;di ...
  • 本文章向碼農們介紹motion-path在css動畫中的使用實例分析,需要的碼農可以參考一下。 使用motion path,作者可以讓圖像物體按照指定的路徑運動。谷歌瀏覽器積極的要實現這個CSS特征,我想主要motion-path是SVG動畫里獨特的亮點,而谷歌瀏覽器已經決定放棄SVG SMIL,所 ...
  • 前端工作一年了,期間由於工作需要,也做了一些產品的設計,因為自己的目標就是做編程,所以婉拒了與產品相關的一些任務,打算主要把精力放到編程這方面. PS:2015年1月進軍編程行業。 廢話不多講,這一年頁面改版了N次,以至於設計師都撂挑子了,,,頁面做多了,經驗自然就有了。 背景(前端小白,迫於生計放 ...
  • 現如今做電商網站必不可少的一個效果就是限時搶購,這也是各大電商網站的一種促銷手段。下麵的圖片就是聚划算上面的限時搶的效果 一、實現限時搶的效果需要用到的知識 :Javascript Date()對象 Date()返回當前的日期和事件 getYear()返回年份 獲得年最好用 getFullYear( ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...