1. 程式人生 > >HTTP(一)、詳細介紹

HTTP(一)、詳細介紹

HTTP 概述

HTTP 是一種獲取網路資源的通訊協議,它是Web進行交換資料的基礎,是一種client-server協議。

通常,客戶端是由像瀏覽器這樣的接收方發起的,服務端一般分為Web伺服器或者Ftp檔案伺服器。

一個完整的Web頁面是由不同的子文件拼接而成,例如文字、佈局描述、指令碼、圖片、視訊等。

這裡寫圖片描述

HTTP不僅被用來傳輸HTML檔案還可以傳輸圖片、視訊或者向服務端傳送如HTML表單資料。HTTP還可以根據網頁需求,僅獲取部分Web文件內容更新網頁。

HTTP 元件系統

HTTP協議是一個client-server協議:請求通過一個實體被髮出,實體也就是使用者代理,大多數情況下,這個使用者代理就是指瀏覽器。

這裡寫圖片描述

1.客戶端:user-agent

user-agent 就是可以發起HTTP請求的工具。通常這個角色是由瀏覽器扮演。

如何顯示一個網頁?
瀏覽器首先發送一個請求資訊獲取頁面的HTML文件,再解析這些文件中的資源資訊傳送其他請求,獲取JS指令碼檔案或CSS樣式檔案來進行頁面佈局渲染,以及其他資原始檔(圖片或者視訊)。最後,瀏覽器將這些資源進行整合輸出,呈現最終的頁面檔案。

2.Web服務端

在HTTP請求的另一端,是由WEB 伺服器提供客戶端請求的文件資料的。

服務端不一定是一臺機器,但是一臺機器上是可以部署多個服務。服務端的作用,就是為客戶端提供不同種類的服務,這些服務可能是Web 服務,Ftp資料資源服務,資料庫服務等。

3.代理(Proxies)

代理存在於伺服器和客戶端之間。

代理的作用:

  • 快取
  • 過濾
  • 負載均衡
  • 認證
  • 日誌記錄

HTTP 基本屬性

1.HTTP是簡單的

2.HTTP是可擴充套件的

HTTP可擴充套件,具體是說HTTP header具有可擴充套件型。這就可以使我們自定義頭資訊,從而實現和服務端達成某種特殊約定。

3.HTTP是無狀態,有會話的

無狀態的:在同一個連線中,兩個執行成功的請求之間是沒有關係的。這就帶來了一個新的問題,使用者無法在同一個網站中進行連續的互動。比如,在一個電商網站中,使用者把某個商品新增到購物車中,切換一個頁面之後,購物車中的資料是無法儲存的,每次重新整理頁面購物車中的資料將被清空。解決方案是,使用HTTP頭部擴充套件,HTTP Cookies就可以解決這個問題。把Cookies新增到頭部中,就可以使每個請求都能共享相同的上下文資訊,從而達到相同的狀態。

4.HTTP和連線

客戶端到服務端的連線是由傳輸層來控制的。

HTTP是面向應用層的協議,HTTP並不需要其底層的傳輸層協議是面向連線的,只需要它是可靠的,或不丟失資料資訊的。

傳輸層有兩個常見的協議:TCP、UDP。TCP是可靠傳輸,HTTP是基於TCP進行訊息傳遞的。

因此,每次建立一個HTTP/1.0請求都會開啟一個TCP連線,這就導致了兩個缺點:

  • 速度慢

開啟一個TCP連線需要多次往返訊息傳遞(三次握手協議,這種方式可以避免在不可靠的網路中提供一種可靠的端對端位元組流資料傳輸)。

  • 效率低

單個連線傳送時效率低下,不過在週期性傳送多個訊息時,這樣的連線方式的效率才能提升。

HTTP 能控制什麼

用HTTP可以控制快取和認證。

下面是常見的控制屬性:

  • 快取

服務端告訴客戶端或代理哪些資源是需要被快取的,以及快取時間,同時客戶端也能夠命令中間的快取代理來忽略快取資源。

  • 開放同源限制

為了防止網路竊聽和其他隱私資料洩露,瀏覽器對Web網站進行了強制安全限制。只有來自於相同來源的網頁才能獲取網站的全部資訊(例如,欺詐網站可以利用iframe偽裝成銀行網站,如何沒有同源策略,那麼我們輸入的銀行賬號資訊就可能被竊取)。這樣的限制有時也是一種負擔,HTTP可以通過修改頭部資訊來開放這樣的限制,因此,Web文件可以是由不同域下的資訊拼接成的。

  • 認證

某些網站只允許特定使用者進行授權訪問。基本的認證功能是通過HTTP提供。使用WWW-Authenticate類似的header資訊即可實現,或者使用HTTP Cookies來設定指定的會話。

  • 代理和隧道

通常情況下,服務端一般是在內網環境下的通過代理伺服器連線到外網環境的,因此外網是無法感知其真實ip地址。HTTP請求就要通過代理越過這層網路障礙,但是並非所有的代理都是HTTP代理,例如SOCKET協議的代理就是在底層。

  • 會話

HTTP Cookies允許使用服務端的狀態發起請求,這就建立了會話。會話的作用就是將我們的狀態進行儲存。

HTTP 資料流(flow)

當客戶端想要和服務端進行資訊互動時(服務端是指最終伺服器或中間代理),要通過以下幾個步驟:

第一步 開啟TCP連線

TCP連線用來發送一條或多條請求資訊,以及接收服務端響應資訊。客服端可以開啟一條新的TCP連線,或重用一個已經存在的連線,也有可能開啟多個新的TCP連線與服務端進行連線。

第二步 傳送HTTP報文

HTTP報文(HTTP/2之前)是語義可讀的。在HTTP/2中,這些簡單的訊息被封裝在幀中,這使得報文不能直接進行讀取,但是原理相似。


Request URL: https://www.google.com.hk/
Request Method: GET
Status Code: 200 
Remote Address: 108.177.125.199:443
Referrer Policy: no-referrer-when-downgrade

第三步 讀取服務端返回報文


alt-svc: quic=":443"; ma=2592000; v="44,43,39,35"
cache-control: private, max-age=0
content-encoding: br
content-type: text/html; charset=UTF-8
date: Thu, 02 Aug 2018 08:51:15 GMT
expires: -1
server: gws
set-cookie: 1P_JAR=2018-08-02-08; expires=Sat, 01-Sep-2018 08:51:15 GMT; path=/; domain=.google.com.hk
status: 200
strict-transport-security: max-age=3600
x-frame-options: SAMEORIGIN
x-xss-protection: 1; mode=block

第四步 關閉連線或為後續請求重用連線

HTTP 報文

在HTTP/1.1以及更早之前,HTTP協議報文都是語義可讀的。在HTTP/2中,這些報文資訊被嵌入到一個新的資料結構中,* 幀*。幀允許實現很多優化,比如報文header的壓縮和複用。

HTTP報文有兩種型別:

  • 1.請求
  • 2.響應