HTTP協議簡述

小杰哥001發表於2019-03-26

1.HTTP協議簡介

1.HTTP協議介紹

1.HTTP協議(HyperText Transfer Protocol,超文字傳輸協議)是因特網上應用最為廣泛的一種網路傳輸協議,所有的WWW檔案都必須遵守這個標準。

2.HTTP是基於TCP/IP通訊協議來傳遞資料(HTML 檔案, 圖片檔案, 查詢結果等)

2.HTTP協議通常承載於TCP協議之上,有時也承載於TLS或SSL協議層之上,這個時候,就成了我們常說的HTTPS。

HTTP協議簡述
3.HTTP是一個應用層協議,由請求和響應構成,是一個標準的客戶端伺服器模型。HTTP是一個無狀態的協議。

4.HTTP預設的埠號為80,HTTPS的埠號為443。

HTTP協議工作流程

一次HTTP操作稱為一個事務,其工作過程大概如下:

1.使用者在瀏覽器中鍵入需要訪問網頁的URL或者點選某個網頁中連結;

2.瀏覽器根據URL中的域名,通過DNS解析出目標網頁的IP地址;

eg:

a.瀏覽器請求這個頁面:hackr.ip/index.html

b.在這一步,需要域名系統DNS解析域名hackr.ip,得主機的IP地址 20X.189.105.112。

c.然後將上面結合本機自己的資訊,封裝成一個http請求資料包

3.在HTTP開始工作前,客戶端首先會通過TCP/IP協議來和服務端建立連結(TCP三次握手)

4.建立連線後,客戶機傳送一個請求給伺服器,請求方式的格式為:統一資源識別符號(URL)、協議版本號,後邊是MIME資訊包括請求修飾符、客戶機資訊和內容。

5.伺服器接到請求後,給予相應的響應資訊,其格式為一個狀態行,包括資訊的協議版本號、一個成功或錯誤的程式碼,後邊是MIME資訊包括伺服器資訊、實體資訊和可能的內容。

6.一般情況下,一旦Web伺服器向瀏覽器傳送了請求資料,它就要關閉TCP連線,然而如果瀏覽器或者伺服器在其頭資訊加入了這行程式碼:Connection:keep-alive,TCP連線在傳送後將仍然保持開啟狀態,於是,瀏覽器可以繼續通過相同的連線傳送請求。保持連線節省了為每個請求建立新連線所需的時間,還節約了網路頻寬。

2.1 短連線

短連線的操作步驟是:建立連線——資料傳輸——關閉連線...建立連線——資料傳輸——關閉連線

如果客戶請求頻繁,將在TCP的建立和關閉操作上浪費較多時間和頻寬。

2.2 長連結

示意:長連結,指在一個連線上可以連續傳送多個資料包,在連線保持期間,如果沒有資料包傳送,需要雙方發鏈路檢測包。

長連結操作步驟:建立連線——資料傳輸...(保持連線)...資料傳輸——關閉連線

長連線可以省去較多的TCP建立和關閉的操作,減少浪費,節約時間

長連結分為 without pipelining 和 with pipelining,下圖中是without

pipelining,客戶端只在收到前一個請求的響應後,才發出新的請求

HTTP協議簡述

2.3 管線化

下圖是with pipelining,每次建立連結後無需等待請求回來就可以傳送下一個請求

HTTP協議簡述

3. Http請求報文

客戶端傳送一個HTTP請求到伺服器的請求訊息包括以下格式:

請求行(request line)、請求頭部(header)、請求體組成,下圖給出了請求報文的一般格式。

HTTP協議簡述

請求行:

方法:
    GET 獲取資源
    POST 向伺服器端傳送資料,傳輸實體主體
    PUT 傳輸檔案
    HEAD 獲取報文首部
    DELETE 刪除檔案
    OPTIONS 詢問支援的方法
    TRACE 追蹤路徑
協議/版本號
URL
複製程式碼

請求頭:

通用首部(General Header)
請求首部(Request Header)
響應首部(Response Header)
實體首部(Entity Header Fields)
複製程式碼

請求體

請求報文拆解:

HTTP協議簡述

3.1 get請求

HTTP協議簡述

3.2 post請求

HTTP協議簡述

4. Http響應報文

HTTP響應組成:響應行、響應頭、響應體。

HTTP協議簡述

響應行

(HTTP/1.1)表明HTTP版本為1.1版本,狀態碼為200,狀態訊息為(ok)
複製程式碼

響應頭

Date:生成響應的日期和時間;
Content-Type:指定了MIME型別的HTML(text/html),編碼型別是ISO-8859-1
複製程式碼

響應體

響應報文拆解:

HTTP協議簡述

5. Http狀態碼

類別 原因

1XX Informational(資訊性狀態碼)

2XX Success(成功狀態碼)

3XX Redirection(重定向)

4XX Client Error(客戶端錯誤狀態碼)

5XX Server Error(伺服器錯誤狀態嗎)

5.1 2XX 成功

200(OK 客戶端發過來的資料被正常處理

204(Not Content 正常響應,沒有實體

206(Partial Content 範圍請求,返回部分資料,響應報文中由Content-Range指定實體內容

5.2 3XX 重定向

301(Moved Permanently) 永久重定向

302(Found) 臨時重定向,規範要求,方法名不變,但是都會改變

303(See Other) 和302類似,但必須用GET方法

304(Not Modified) 狀態未改變,

配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)

307(Temporary Redirect) 臨時重定向,不該改變請求方法

5.3 4XX 客戶端錯誤

  • 400(Bad Request) 請求報文語法錯誤

  • 401 (unauthorized) 需要認證

  • 403(Forbidden) 伺服器拒絕訪問對應的資源

  • 404(Not Found) 伺服器上無法找到資源

5.4 5XX 伺服器端錯誤

  • 500(Internal Server Error)伺服器故障

  • 503(Service Unavailable) 伺服器處於超負載或正在停機維護

6. 首部

6.1 通用首部欄位

首部欄位名 說明

  • Cache-Control 控制快取行為

  • Connection 連結的管理

  • Date 報文日期

  • Pragma 報文指令

  • Trailer 報文尾部的首部

  • Trasfer-Encoding 指定報文主體的傳輸編碼方式

  • Upgrade 升級為其他協議

  • Via 代理伺服器資訊

  • Warning 錯誤通知

6.2 請求首部欄位

首部欄位名 說明

Accept 使用者代理可處理的媒體型別

Accept-Charset 優先的字符集

Accept-Encoding 優先的編碼

Accept-Langulage 優先的語言

Authorization Web認證資訊

Expect 期待伺服器的特定行為

From 使用者的電子郵箱地址

Host 請求資源所在的伺服器

If-Match 比較實體標記

If-Modified-Since 比較資源的更新時間

If-None-Match 比較實體標記

If-Range 資源未更新時傳送實體Byte的範圍請求

If-Unmodified-Since 比較資源的更新時間(和If-Modified-Since相反)

Max-Forwards 最大傳輸跳數

Proxy-Authorization 代理伺服器需要客戶端認證

Range 實體位元組範圍請求

Referer 請求中的URI的原始獲取方

TE 傳輸編碼的優先順序

User-Agent HTTP客戶端程式的資訊

6.3 響應首部欄位

首部欄位名 說明

Accept-Ranges 是否接受位元組範圍

Age 資源的建立時間

ETag 資源的匹配資訊

Location 客戶端重定向至指定的URI

Proxy-Authenticate 代理伺服器對客戶端的認證資訊

Retry-After 再次傳送請求的時機

Server 伺服器的資訊

Vary 代理伺服器快取的管理資訊

www-Authenticate 伺服器對客戶端的認證

6.4 實體首部欄位

首部欄位名 說明

Allow 資源可支援的HTTP方法

Content-Encoding 實體的編碼方式

Content-Language 實體的自然語言

Content-Length 實體的內容大小(位元組為單位)

Content-Location 替代對應資源的URI

Content-MD5 實體的報文摘要

Content-Range 實體的位置範圍

Content-Type 實體主體的媒體型別

Expires 實體過期時間

Last-Modified 資源的最後修改時間

7、HTTP中的重定向和請求轉發的區別

解釋一   一句話,轉發是伺服器行為,重定向是客戶端行為。為什麼這樣說呢,這就要看兩個動作的工作流程:

轉發過程:客戶瀏覽器傳送http請求----》web伺服器接受此請求--》呼叫內部的一個方法在容器內部完成請求處理和轉發動作----》將目標資源傳送給客戶;在這裡,轉發的路徑必須是同一個web容器下的url,其不能轉向到其他的web路徑上去,中間傳遞的是自己的容器內的request。在客戶瀏覽器路徑欄顯示的仍然是其第一次訪問的路徑,也就是說客戶是感覺不到伺服器做了轉發的。轉發行為是瀏覽器只做了一次訪問請求。

重定向過程:客戶瀏覽器傳送http請求----》web伺服器接受後傳送302狀態碼響應及對應新的location給客戶瀏覽器--》客戶瀏覽器發現是302響應,則自動再傳送一個新的http請求,請求url是新的location地址----》伺服器根據此請求尋找資源併傳送給客戶。在這裡location可以重定向到任意URL,既然是瀏覽器重新發出了請求,則就沒有什麼request傳遞的概念了。在客戶瀏覽器路徑欄顯示的是其重定向的路徑,客戶可以觀察到地址的變化的。重定向行為是瀏覽器做了至少兩次的訪問請求的。

解釋二

重定向,其實是兩次request, 第一次,客戶端request A,伺服器響應,並response回來,告訴瀏覽器,你應該去B。這個時候IE可以看到地址變了,而且歷史的回退按鈕也亮了。重定向可以訪問自己web應用以外的資源。在重定向的過程中,傳輸的資訊會被丟失。

請求轉發是伺服器內部把對一個request/response的處理權,移交給另外一個 對於客戶端而言,它只知道自己最早請求的那個A,而不知道中間的B,甚至C、D。 傳輸的資訊不會丟失。

解釋三 假設你去辦理某個執照,

重定向:你先去了A局,A局的人說:“這個事情不歸我們管,去B局”,然後,你就從A退了出來,自己乘車去了B局。

轉發:你先去了A局,A局看了以後,知道這個事情其實應該B局來管,但是他沒有把你退回來,而是讓你坐一會兒,自己到後面辦公室聯絡了B的人,讓他們辦好後,送了過來。

相關文章