1. 程式人生 > >Http協議之請求報文

Http協議之請求報文

要想在網路上進行通訊,我們首先需要知道網路的構成和網路通訊所使用的協議。現在網際網路所遵循的是OSI(Open System Interconnection)參考模型,是參考模型是國際標準化組織(ISO)制定的一個用於計算機或通訊系統間互聯的標準體系。分為:物理層、資料鏈路層、網路層、傳輸層、會話層、表示層、應用層。當然做一部分簡化,有分五層的:

1、物理層

該層負責資料流的傳輸,即負責物理傳輸。這一層的協議既與鏈路有關,也與傳輸介質有關。通俗將就是把計算機連線起來的物理手段(包括線纜、光纜等)

2、資料鏈路層

該層控制網路層和物理層直接的通訊,主要功能是解決在不可靠的物理線路上進行可靠的資料傳輸

。為了保證傳輸,從網路層接收到資料被分割成特定的可被物理層傳輸的幀。幀是用來移動資料的結構包,它不僅包括原始資料,還包括髮送方和接收方的實體地址和糾錯資訊。

3、網路層

該層決定如何將資料從傳送方路由到接收方。網路層通過綜合考慮傳送優先權、網路阻塞程度、服務質量以及可選路由的花費來決定從一個節點到A到另一個節點B的最佳路徑。

4、傳輸層

該層為兩臺主機上的應用提供端到端的通訊。相比之下,網路層的功能是建立主機到主機的通訊。傳輸層有兩個協議:TCP(傳輸控制協議)和UDP(使用者資料報協議)。其中,TCP是一個可靠的面向連線的協議,UDP是不可靠的無連線的協議。

5、應用層

應用程式收到傳輸層的資料之後,接下來要進行解讀。要解讀就必須規定好格式,而應用層就是規定應用程式的資料格式的。他的主要協議有HTTP、FTP、Telnet、SMTP、POP3等。

下面重點說一下HTTP協議

HyperText Transfer Tansfer Protocol 超文字傳輸協議,是一種基於TCP的應用層協議,也是目前為止最為流行的應用層協議之一,可以說HTTP協議是全球資訊網的基石。歷經了0.9、HTTP/1.0、HTTP/1.1、HTTP/2幾個版本(關於HTTP協議的歷史,這裡有一片文章介紹的比較詳細),目前流行的還是HTTP1.1這個版本,HTTP2還在推廣中,我這裡複習的也僅僅是HTTP1.1(HTTP2還不是瞭解,只知道增加了很多加密技術)。

1.需要明白HTTP是一種客戶端請求、伺服器應答式的應用層傳輸協議,也就是說伺服器端是不可能主動向客戶端傳送資料的,如果伺服器能主動向客戶端傳送資料那這個世界就亂套了,同時還說明了在網路正常的情況下請求和響應都是一一對應的。而這個請求和響應也就是後端開發人員經常看到的Request和Response。

HTTP基於TCP/IP通訊協議來傳遞資料。

HTTP基於客戶端/服務端(C/S)架構模型,通過一個可靠的連結來交換資訊,是一個無狀態的請求/響應協議。

2.特點

(1)HTTP是無連線:無連線的含義是限制每次連線只處理一個請求。伺服器處理完客戶的請求,並收到客戶的應答後,即斷開連線。採用這種方式可以節省傳輸時間。

(2)HTTP是媒體獨立的:只要客戶端和伺服器知道如何處理的資料內容,任何型別的資料都可以通過HTTP傳送。客戶端以及伺服器指定使用適合的MIME-type內容型別。

(3)HTTP是無狀態:無狀態是指協議對於事務處理沒有記憶能力。缺少狀態意味著如果後續處理需要前面的資訊,則它必須重傳,這樣可能導致每次連線傳送的資料量增大。另一方面,在伺服器不需要先前資訊時它的應答就較快。

HTTP請求報文

HTTP請求報文由3部分組成(請求行+請求頭+請求體):
1856419-dda70fede5f1ef04.jpg

請求報文的首部內容由以下資料組成:

請求行 —— 包含用於請求的方法、請求 URI 和 HTTP 版本。
首部欄位 —— 包含表示請求的各種條件和屬性的各類首部。(通用首部、請求首部、實體首部以及RFC裡未定義的首部如 Cookie 等)
請求報文的示例,如下:
1856419-f8b56031bcc68ff8.png
請求行:

①是請求方法,GET和POST是最常見的HTTP方法,除此以外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。

②為請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL。

③是協議名稱及版本號。

請求頭:

④是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的資訊。

與快取相關的規則資訊,均包含在header中

請求體:

⑤是報文體,它將一個頁面表單中的元件值通過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求引數的資料。不但報文體可以傳遞請求引數,請求URL也可以通過類似於“/chapter15/user.html? param1=value1&param2=value2”的方式傳遞請求引數。
HTTP請求報文頭屬性

Accept
請求報文可通過一個“Accept”報文頭屬性告訴服務端 客戶端接受什麼型別的響應。
如下報文頭相當於告訴服務端,俺客戶端能夠接受的響應型別僅為純文字資料啊,你丫別發其它什麼圖片啊,視訊啊過來,那樣我會歇菜的~~~

Accept:text/plain

Accept屬性的值可以為一個或多個MIME型別的值(描述訊息內容型別的因特網標準, 訊息能包含文字、影象、音訊、視訊以及其他應用程式專用的資料)
cookie

客戶端的Cookie就是通過這個報文頭屬性傳給服務端的哦!如下所示:

Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23

服務端是怎麼知道客戶端的多個請求是隸屬於一個Session呢?注意到後臺的那個jsessionid = 5F4771183629C9834F8382E23木有?原來就是通過HTTP請求報文頭的Cookie屬性的jsessionid的值關聯起來的!(當然也可以通過重寫URL的方式將會話ID附帶在每個URL的後面哦)。
Referer
表示這個請求是從哪個URL過來的,假如你通過google搜尋出一個商家的廣告頁面,你對這個廣告頁面感興趣,滑鼠一點發送一個請求報文到商家的網站,這個請求報文的Referer報文頭屬性值就是http://www.google.com。

Cache-Control

對快取進行控制,如一個請求希望響應返回的內容在客戶端要被快取一年,或不希望被快取就可以通過這個報文頭達到目的。

HTTP響應報文

image.png

2.1 狀態行

狀態行由協議版本號、狀態碼和狀態碼描述3個部分組成

2.2 響應頭部

響應頭部與請求頭部對應,與請求頭部類似

2.3 響應正文

伺服器返回給客戶端的文字資訊

狀態碼                          狀態碼英文名稱 中文描述
100 Continue 繼續。客戶端應繼續其請求
101 Switching Protocols 切換協議。伺服器根據客戶端的請求切換協議。只能切換到更高階的協議,例如,切換到HTTP的新版本協議
 
200 OK 請求成功。一般用於GET與POST請求
201 Created 已建立。成功請求並建立了新的資源
202 Accepted 已接受。已經接受請求,但未處理完成
203 Non-Authoritative Information 非授權資訊。請求成功。但返回的meta資訊不在原始的伺服器,而是一個副本
204 No Content 無內容。伺服器成功處理,但未返回內容。在未更新網頁的情況下,可確保瀏覽器繼續顯示當前文件
205 Reset Content 重置內容。伺服器處理成功,使用者終端(例如:瀏覽器)應重置文件檢視。可通過此返回碼清除瀏覽器的表單域
206 Partial Content 部分內容。伺服器成功處理了部分GET請求
 
300 Multiple Choices 多種選擇。請求的資源可包括多個位置,相應可返回一個資源特徵與地址的列表用於使用者終端(例如:瀏覽器)選擇
301 Moved Permanently 永久移動。請求的資源已被永久的移動到新URI,返回資訊會包括新的URI,瀏覽器會自動定向到新URI。今後任何新的請求都應使用新的URI代替
302 Found 臨時移動。與301類似。但資源只是臨時被移動。客戶端應繼續使用原有URI
303 See Other 檢視其它地址。與301類似。使用GET和POST請求檢視
304 Not Modified 未修改。所請求的資源未修改,伺服器返回此狀態碼時,不會返回任何資源。客戶端通常會快取訪問過的資源,通過提供一個頭資訊指出客戶端希望只返回在指定日期之後修改的資源
305 Use Proxy 使用代理。所請求的資源必須通過代理訪問
306 Unused 已經被廢棄的HTTP狀態碼
307 Temporary Redirect 臨時重定向。與302類似。使用GET請求重定向
 
400 Bad Request 客戶端請求的語法錯誤,伺服器無法理解
401 Unauthorized 請求要求使用者的身份認證
402 Payment Required 保留,將來使用
403 Forbidden 伺服器理解請求客戶端的請求,但是拒絕執行此請求
404 Not Found 伺服器無法根據客戶端的請求找到資源(網頁)。通過此程式碼,網站設計人員可設定“您所請求的資源無法找到”的個性頁面
405 Method Not Allowed 客戶端請求中的方法被禁止
406 Not Acceptable 伺服器無法根據客戶端請求的內容特性完成請求
407 Proxy Authentication Required 請求要求代理的身份認證,與401類似,但請求者應當使用代理進行授權
408 Request Time-out 伺服器等待客戶端傳送的請求時間過長,超時
409 Conflict 伺服器完成客戶端的PUT請求是可能返回此程式碼,伺服器處理請求時發生了衝突
410 Gone 客戶端請求的資源已經不存在。410不同於404,如果資源以前有現在被永久刪除了可使用410程式碼,網站設計人員可通過301程式碼指定資源的新位置
411 Length Required 伺服器無法處理客戶端傳送的不帶Content-Length的請求資訊
412 Precondition Failed 客戶端請求資訊的先決條件錯誤
413 Request Entity Too Large 由於請求的實體過大,伺服器無法處理,因此拒絕請求。為防止客戶端的連續請求,伺服器可能會關閉連線。如果只是伺服器暫時無法處理,則會包含一個Retry-After的響應資訊
414 Request-URI Too Large 請求的URI過長(URI通常為網址),伺服器無法處理
415 Unsupported Media Type 伺服器無法處理請求附帶的媒體格式
416 Requested range not satisfiable 客戶端請求的範圍無效
417 Expectation Failed 伺服器無法滿足Expect的請求頭資訊
 
500 Internal Server Error 伺服器內部錯誤,無法完成請求
501 Not Implemented 伺服器不支援請求的功能,無法完成請求
502 Bad Gateway 充當閘道器或代理的伺服器,從遠端伺服器接收到了一個無效的請求
503 Service Unavailable 由於超載或系統維護,伺服器暫時的無法處理客戶端的請求。延時的長度可包含在伺服器的Retry-After頭資訊中
504 Gateway Time-out 充當閘道器或代理的伺服器,未及時從遠端伺服器獲取請求
505 HTTP Version not supported 伺服器不支援請求的HTTP協議的版本,無法完成處理