1. 程式人生 > >http協議知識點整理

http協議知識點整理

1.前言

這篇文章主要是我平時在學習HTTP過程中看到的一些知識點,現在把他們總結成一篇文章,建立一個自己的知識體系

1.1基礎知識鋪墊

OSIOpen System Interconnection的縮寫,意為開放式系統互聯

OSI7層框架 如圖:

1)應用層(dns,http)DNS解析域名為IP併發送http地址

2)傳輸層(tcp,udp)建立tcp連線(三次握手)

3)網路層(IP,ARP)IP定址

4)資料鏈路層(PPP)封裝成幀

今天的主角是http:http是基於TCP/IP協議的應用層協議,用於客戶端和伺服器之間的通訊HTTP是一個無狀態的協議。

1.2在TCP/IP協議棧中的位置

HTTP協議通常承載於TCP協議之上,有時也承載於TLSSSL協議層之上,這個時候,就成了我們常說的HTTPS。如下圖所示:

預設HTTP的埠號為80HTTPS的埠號為443

2. HTTP發展歷程

  1. HTTP/0.9版本,這個時候的HTTP只支援GET請求,且不支援請求頭,
  2. HTTP/1.0版本,這是第一個在通訊中指定版本號的HTTP協議版本,至今仍被廣泛採用,特別是在代理伺服器中。
  3. HTTP/1.1版本,持久連線被預設建立,並能很好地配合代理伺服器工作。還支援以管道方式在同時傳送多個請求,以便降低線路負載,提高傳輸速度。現在使用最廣泛的。
  4. HTTP/2.0版本,當前版本,於2015年5月作為網際網路標準正式釋出。

3.HTTP請求

HTTP請求第一步,應該是由客戶端發起一個HTTP請求,當然這個客戶端可以是例如我們的瀏覽器,F12除錯,發起我們的第一個請求頭資訊。

http報文一般包括:通用頭部、請求/響應頭部、請求/響應體

假設我們現在開始請求CSDN主頁

通用頭部:

請求頭部

響應頭部

說一點:Content-Length當瀏覽器使用持久http連線才需要。

如果存在Transfer-Encoding(重點是chunked),則在header中不能有Content-Length,有也會被忽視

這裡插一句,HTTP/1.1沿用的是文字型別的請求頭,HTTP/2則會使用二進位制資料。

4.HTTP是如何建立連線的

說道如何連線的,我們必須要回顧一個東西,那就是大學學到過的計算機網路基礎,幾乎所有的大學生都應該瞭解過計算機的網路模型,也就是我們熟知的七層網路模型,如下圖

但是計算機網路中的七層模型畢竟是理想中的情況,現實是很少有應用實現了七層模型,一般都是整合其中兩個或多個,實現一個四層或者五層的模型。

TCP/IP模型

在這裡我們研究的是HTTP,自然要知道它所處在哪個模型中,答案是應用層。這裡要引入一個TCP/IP的概念,大家應該知道,TCP處於傳輸層,IP屬於網路層,而我們這裡所探究的HTTP,實際上就是基於TCP/IP協議開發的,至於TCP/IP的網路模型,它沒有照搬計算機網路的七層模型,而是整合了表示層,會話層應用層,統一為應用層,比較有爭議的是,關於TCP/IP究竟是幾層協議,目前為止沒有定論,一般我比較習慣統稱為四層協議,至於別人說的五層協議,其實就是資料鏈路層,物理層是不是一層有所爭議吧。如圖:

因為HTTP是基於TCP/IP開發的協議,看過HTTP協議的同學肯定都知道,有句話概述HTTP協議為無差錯的協議按序傳輸未分段的資料流,這其實說的就是TCP協議。

5 傳送一條HTTP請求會發生什麼?

當你在瀏覽器輸入一個URL的時候,有沒有想過這其中發生了什麼?

  1. 獲取主機名,例如:http://www.nowamagic.net/academy/

  2. 通過DNS獲取伺服器IP

  3. 獲取埠,預設是80埠
  4. 連線到 121.199.24.143:80伺服器

  5. 通過TCP通道傳送一個HTTP請求

  6. 伺服器讀取一個HTTP請求

  7. 伺服器查詢所需資源並通過TCP通道返回資源

  8. 關閉TCP連線

6 .欄位解釋

通用頭部

這也是開發人員見過的最多的資訊,包括如下:

Request Url: 請求的web伺服器地址

Request Method: 請求方式(Get、POST、OPTIONS、PUT、HEAD、DELETE、CONNECT、TRACE)

Status Code: 請求的返回狀態碼,如200代表成功

Remote Address: 請求的遠端伺服器地址(會轉為IP)

這裡面最常用到的就是狀態碼,很多時候都是通過狀態碼來判斷,如(列舉幾個最常見的):

200——表明該請求被成功地完成,所請求的資源傳送回客戶端
304——自從上次請求後,請求的網頁未修改過,請客戶端使用本地快取
400——客戶端請求有錯(譬如可以是安全模組攔截)
401——請求未經授權
403——禁止訪問(譬如可以是未登入時禁止)
404——資源未找到
500——伺服器內部錯誤
503——服務不可用

再列舉下大致不同範圍狀態的意義

1xx——指示資訊,表示請求已接收,繼續處理
2xx——成功,表示請求已被成功接收、理解、接受
3xx——重定向,要完成請求必須進行更進一步的操作
4xx——客戶端錯誤,請求有語法錯誤或請求無法實現
5xx——伺服器端錯誤,伺服器未能實現合法的請求

請求/響應頭部

請求和響應頭部也是分析時常用到的

常用的請求頭部(部分):

Accept:接收型別,表示瀏覽器支援的MIME型別(對標服務端返回的Content-Type)
Accept-Encoding:瀏覽器支援的壓縮型別,如gzip等,超出型別不能接收
Content-Type:客戶端傳送出去實體內容的型別
Cache-Control:指定請求和響應遵循的快取機制,如no-cache
If-Modified-Since:對應服務端的Last-Modified,用來匹配看檔案是否變動,只能精確到1s之內,http1.0中
Expires:快取控制,在這個時間內不會請求,直接使用快取,http1.0,而且是服務端時間
Max-age:代表資源在本地快取多少秒,有效時間內不會請求,而是使用快取,http1.1中
If-None-Match:對應服務端的ETag,用來匹配檔案內容是否改變(非常精確),http1.1中
Cookie:有cookie並且同域訪問時會自動帶上
Connection:當瀏覽器與伺服器通訊時對於長連線如何進行處理,如keep-alive
Host:請求的伺服器URL
Origin:最初的請求是從哪裡發起的(只會精確到埠),Origin比Referer更尊重隱私
Referer:該頁面的來源URL(適用於所有型別的請求,會精確到詳細頁面地址,csrf攔截常用到這個欄位)
User-Agent:使用者客戶端的一些必要資訊,如UA頭部等

常用的響應頭部(部分):

Access-Control-Allow-Headers: 伺服器端允許的請求Headers
Access-Control-Allow-Methods:伺服器端允許的請求方法
Access-Control-Allow-Origin:伺服器端允許的請求Origin頭部(譬如為*)
Content-Type:服務端返回的實體內容的型別
Date:資料從伺服器傳送的時間
Cache-Control:告訴瀏覽器或其他客戶,什麼環境可以安全的快取文件
Last-Modified:請求資源的最後修改時間
Expires:應該在什麼時候認為文件已經過期,從而不再快取它
Max-age:客戶端的本地資源應該快取多少秒,開啟了Cache-Control後有效
ETag:請求變數的實體標籤的當前值
Set-Cookie:設定和頁面關聯的cookie,伺服器通過這個頭部把cookie傳給客戶端
Keep-Alive:如果客戶端有keep-alive,服務端也會有響應(如timeout=38)
Server:伺服器的一些相關資訊

一般來說,請求頭部和響應頭部是匹配分析的。

譬如,請求頭部的Accept要和響應頭部的Content-Type匹配,否則會報錯

譬如,跨域請求時,請求頭部的Origin要匹配響應頭部的Access-Control-Allow-Origin,否則會報跨域錯誤

譬如,在使用快取時,請求頭部的If-Modified-SinceIf-None-Match分別和響應頭部的Last-ModifiedETag對應

7.HTTPS

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

它的加密過程是:

1.瀏覽器請求建立SSL連結並向服務端傳送一個隨機數Client random和客戶端支援的加密方法比如RSA加密此時是明文傳輸
2.服務端從中選出一組加密演算法與Hash演算法回覆一個隨機數Server random並將自己的身份資訊以證書的形式發回給瀏覽器證書裡包含了網站地址非對稱加密的公鑰以及證書頒發機構等資訊
3.瀏覽器收到服務端的證書後:

       -驗證證書的合法性頒發機構是否合法證書中包含的網址是否和正在訪問的一樣),如果證書信任則瀏覽器會顯示一個小鎖頭否則會有提示

      -使用者接收證書後不管信不信任),瀏覽會生產新的隨機數Premastersecret然後證書中的公鑰以及指定的加密方法加密`Premaster secret`傳送給伺服器

      -利用Client randomServer random和Premaster secret通過一定的演算法生成HTTP連結資料傳輸的對稱加密key-`session key`

      -使用約定好的HASH演算法計算握手訊息並使用生成的`session key`對訊息進行加密最後將之前生成的所有資訊傳送給服務端.

4.服務端收到瀏覽器的回覆

    -利用已知的加解密方式與自己的私鑰進行解密獲取`Premaster secret`

    -和瀏覽器相同規則生成`session key`

    -使用`session key`解密瀏覽器發來的握手訊息並驗證Hash是否與瀏覽器發來的一致

    -使用`session key`加密一段握手訊息傳送給瀏覽器

5.瀏覽器解密並計算握手訊息的HASH如果與服務端發來的HASH一致此時握手過程結束.

8. http2.0

http2.0不是https,它相當於是http的下一代規範(譬如https的請求可以是http2.0規範的)

然後簡述下http2.0與http1.1的顯著不同點:

http1.1中,每請求一個資源,都是需要開啟一個tcp/ip連線的,所以對應的結果是,每一個資源對應一個tcp/ip請求,由於tcp/ip本身有併發數限制,所以當資源一多,速度就顯著慢下來

http2.0中,一個tcp/ip請求可以請求多個資源,也就是說,只要一次tcp/ip請求,就可以請求若干個資源,分割成更小的幀請求,速度明顯提升。

所以,如果http2.0全面應用,很多http1.1中的優化方案就無需用到了(譬如打包成精靈圖,靜態資源多域名拆分等)

然後簡述下http2.0的一些特性:

  • 多路複用(即一個tcp/ip連線可以請求多個資源)
  • 首部壓縮(http頭部壓縮,減少體積)
  • 二進位制分幀(在應用層跟傳送層之間增加了一個二進位制分幀層,改進傳輸效能,實現低延遲和高吞吐量)
  • 伺服器端推送(服務端可以對客戶端的一個請求發出多個響應,可以主動通知客戶端)
  • 請求優先順序(如果流被賦予了優先順序,它就會基於這個優先順序來處理,由伺服器決定需要多少資源來處理該請求。)

9. 跨域

跨域產生的原因,是因為受到同源策略的限制。同源策略指的是協議、域名、埠不相同。這裡我將介紹三種跨域的方式:JSONP、CORS(跨域資源共享)、document.domain + iframe。

9.1 JSONP

1. 原理

動態插入script標籤(因為script標籤不受同源策略的限制),通過插入script標籤引入一個js檔案,這個js檔案載入成功之後會執行我們在url中指定的回撥函式,並且會把我們需要的json資料作為引數傳入。

2. 實現

(1)原生實現:

var script = document.createElement('script');
script.type = 'text/javascript';
// 傳參並指定回撥執行函式為onBack
script.src = 'http://www.domain2.com:8080/login?user=admin&callback=onBack';
document.head.appendChild(script);
// 回撥函式
function onBack(res) 
{
   alert(JSON.stringify(res));
}
//服務端返回如下(返回時即執行全域性函式):
onBack({"status": true, "user": "admin"})

(2)jquery ajax:

$.ajax({url:'http://www.domain2.com:8080/login',    
type: 'get',
dataType: 'jsonp',  // 請求方式為jsonp
jsonpCallback: "onBack", // 自定義回撥函式名
data: {}
});

9.2 CORS

1. 原理

伺服器在響應頭中設定相應的選項,瀏覽器如果支援這種方法的話就會將這種跨站資源請求視為合法,進而獲取資源。

2. 實現

CORS分為簡單請求和複雜請求,簡單請求指的是:

(1)請求方法是以下三種方法之一:HEAD、GET、POST;

(2)HTTP的頭資訊不超出以下幾種欄位:Accept、Accept-Language、Content-Language、Last-Event-ID、
         Content-Type(只限於三個值application/x-www-form-urlencoded、multipart/form-data、text/plain)。

其他情況就是非簡單請求了。

  • 簡單請求

(1)請求頭

Origin: http://www.domain.com

(2)響應頭

Access-Control-Allow-Origin: http://www.domain.com
Access-Control-Allow-Credentials: true //`是否允許傳送cookie`
Access-Control-Expose-Headers: FooBar //`CORS請求時,只能拿到6個基本欄位:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他欄位,就必須指定。`

(3)另外,ajax請求中,如果要傳送Cookie,Access-Control-Allow-Origin就不能設為星號,必須指定明確的、與請求網頁一致的域名,還要設定以下內容:

var xhr = new XMLHttpRequest();

xhr.withCredentials = true;
  • 非簡單請求

(1)預檢請求:

OPTIONS /cors HTTP/1.1  `OPTIONS請求是用來詢問的`
Origin: http://www.domian.com
Access-Control-Request-Method: PUT
Access-Control-Request-Headers: X-Custom-Header

(2)響應頭

Access-Control-Allow-Origin: http://www.domain.com
Access-Control-Allow-Methods: GET, POST, PUT  `伺服器支援的所有跨域請求的方法`
Access-Control-Allow-Headers: X-Custom-Header  `伺服器支援的所有頭資訊欄位,不限於瀏覽器在"預檢"中請求的欄位。`
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 1728000  `指定本次預檢請求的有效期,單位為秒`

(3)之後的步驟就同簡單請求了

這是CORS的整個流程圖:

與JSOP的比較

JSONP只支援GET請求,CORS支援所有型別的HTTP請求。JSONP的優勢在於支援老式瀏覽器,以及可以向不支援CORS的網站請求資料。

相關推薦

http協議知識點整理

1.前言 這篇文章主要是我平時在學習HTTP過程中看到的一些知識點,現在把他們總結成一篇文章,建立一個自己的知識體系。 1.1基礎知識鋪墊 OSI是Open System Interconnection的縮寫,意為開放式系統互聯。 OSI有7層框架 如圖:

前端http協議知識點

1.特點 簡單快速:每個uri 是固定的 靈活:通過一個http型別,可以完成不同資料型別的傳遞 無連線:連線一次會斷掉,不會保持連線 無狀態:沒有記錄狀態,無法區分兩次連線的身份 2.http報文的組成部分 請求報文:

HTTP協議知識點總結

三、HTTP協議詳的響應型別  在接收和解釋請求訊息後,伺服器返回一個HTTP響應訊息。  HTTP響應也是由三個部分組成,分別是:狀態行、訊息報頭、響應正文  狀態行格式如下:   HTTP-Version Status-Code Reason-Phrase CRLF    其中,HTTP-Version表

【前端小小白的學習之路】整理幾道面試題之(HTTP協議)【轉】

ase 賬號 檢測 提交數據 大型數據集 tor 添加 描述 分享 轉自:http://www.cnblogs.com/ranyonsue/p/5984001.html HTTP簡介 HTTP協議是Hyper Text Transfer Protocol(超文本傳輸

HTTP協議相關知識點

es2017 類型 ati mage 服務器 客戶 提示信息 得到 而且 主要參考 http://www.imooc.com/article/14397,來源:慕課網,作者種子_fe HTTP是超文本傳輸協議,主要特點有: 支持客戶、服務器模式 簡單快速:客戶向服務器請求

前端面試知識點梳理之四——http協議

strong 允許 使用 類型 包括 響應報文 解答 能力 面試 一、相關問題 http協議的主要特點 http報文的組成部分 http方法 post與get的區別 http狀態碼 什麽是持久連接 什麽是管線化 二、問題解答 1.http協議的主要特點

HTTP安全協議詳細整理《圖解HTTP

一、HTTP的缺點 HTTP 主要有這些不足, 例舉如下。 通訊使用明文(不加密) , 內容可能會被竊聽 不驗證通訊方的身份, 因此有可能遭遇偽裝 無法證明報文的完整性, 所以有可能已遭篡改 這些問題不僅在 HTTP 上出現, 其他未加密的協議中也會存在這類

HTTP協議相關基礎知識點

@1 簡介:   HTTP是全球資訊網的應用層通訊協議,web頁面的所有資料都是通過這個文字協議進行傳輸、HTTP是一種無狀態、由文字構成的請求響應(request-response)協議,這種協議使用的是客戶端-伺服器(client-server)計算模式 @2 版本:  

大前端學習筆記整理【七】HTTP協議以及http與https的區別

前言 還是老樣子,新部落格開始前總是想先囉嗦幾句...HTTP協議其實在當初學習java時老師就有提過...但是...反正就那麼過去了... 這段時間公司的專案正好要求做https的轉換和遷移,然後自己思考了一下,好像自己對於http連一知半解都算不上...更不提http與https的區別...想想作為一個未

HTTP協議狀態碼部分整理

前段時間面試被問到HTTP協議的狀態碼,結果有一個沒有回答上來,現在整理一下,雖然不一定能在後面的面試中能完整的說出來,但至少得保證能記得重點。 HTTP協議狀態碼在HTTP響應報文中出現,其職責是當客戶端向伺服器端傳送請求時,描述返回的請求結果。使用者可以藉

Web開發基礎知識的整理(一、Http協議的簡單介紹)

Web方面的東西,實際上挺多挺雜的,所以有的時候就需要一些整理,今天這裡來簡單介紹一下Http協議,算是對之前學習一些東西的整體,希望對自己或者對一些人有些幫助。 首先從Http協議說起,Web瀏

淺顯易懂的前端知識點(二)——HTTP協議基礎

HTTP 協議的初印象: 是基於 TCP/IP 協議的應用層協議,不涉及資料包的傳輸,主要規定了客戶端和伺服器之間的通訊格式,預設使用 80 埠。 1 HTTP 協議 0.9 版(1991 年) 是個弱智協議,客戶端發起請求以後,伺服器只能返回 HTML 格式的字串,不能迴應別的格式。 只有一個 GET 命令

HTTP協議簡介

put tle option 字符 http協議 一行 ava 客戶 ont 簡介 HTTP(HyperText Transfer Protocol, 超文本傳輸協議) 是訪問互聯網使用的核心通信協議,也是所有web應用程序使用的通信協議。消息模型:客戶端發送請求消息,服務

http協議的相關知識

per art title uri 方法 能夠 head 版本號 網絡資源 因為如今的工作設計的Web開發,因此了解了一下Http協議。在閱讀了這篇文章HTTP協議具體解釋(真的非常經典)後,總結了相關經常使用知識並列在此處以方便以後的查詢。 HTTP協議的主要

http協議

get keep -s 發送 modified mime family uri urlencode 1.概述 超文本傳輸協議,傳輸HTML文件。 用於定義WEB瀏覽器與WEB服務器之間交換數據的過程及數據本身的格式。 2、請求部分 1)請求消息行 GET /day08_0

HTTP協議入門

http協議入門 www web一、WWW基本概念WWW是World Wide Web的縮寫,意為萬維網。要了解什麽是萬維網,需要先了解超文本的概念。超文本就是一種用於顯示信息的文本,而在這個文本中可以包含有跳轉到其他文本的超鏈接,通過這些鏈接就可以訪問與文本相關聯的其它文本,就這樣通過鏈接的方式將兩個或多個

自動加載類的知識點整理

簡單 副本 而是 ren 是個 其中 自動調用 php文件 代碼 //__tostring()方法 class Ren      //造一個人類,裏面有成員變量$name {   public $name; } $r = new Ren(); echo $r; //寫出

JavaEE常用小知識點整理

context add 結束 gin 參數 thread 函數 線程 -m 1.獲取項目路徑:request.getContextPath(); 2.獲取請求的參數:request.getQueryString(); 3.指定請求的字符編碼格式:URLEncoder.enc

MyBatis知識點整理

for 表示 sql {} 引號 構建 bsp user lose 1.Mybatis的查詢中可以這樣寫: 如 ID IN (${IDS})在IDS外面拼接了一個(),同樣可以拼接%或者單引號2.Mybatis的${}和#{}的區別: ${}的值直接顯示在生成的sql語句

Jquery知識點整理

元素 返回值 篩選 事情 find 創建對象 播放 設值 from 1.attr()設置或返回被選元素的屬性值。 如:設值:$("img").attr("width","180"); 返回值:$(selector).attr(attribute,value) a