類別 | 原因短語 | |
---|---|---|
1xx | Informational 信息性狀態碼 | 接收的請求正在處理 |
2xx | Success 成功狀態碼 | 請求正常處理完畢 |
3xx | Redirection 重定向狀態碼 | 需要進行附加操作以完成請求 |
4xx | Client Error 客戶端錯誤狀態碼 | 服務器無法處理請求 |
5xx | Server Error 服務器錯誤狀態碼 | 服務器處理請求出錯 |
2xx:請求正常處理完畢
200 OK
:客戶端請求成功
204 No Content
:無內容。服務器成功處理,但未返回內容。一般用在只是客戶端向服務器發送信息,而服務器不用向客戶端返回什么信息的情況。不會刷新頁面。
206 Partial Content
:服務器已經完成了部分 GET 請求(客戶端進行了范圍請求)。響應報文中包含 Content-Range 指定范圍的實體內容
3xx:需要進行附加操作以完成請求(重定向)
301 Moved Permanently
:永久重定向,表示請求的資源已經永久的搬到了其他位置。302 Found
:臨時重定向,表示請求的資源臨時搬到了其他位置303 See Other
:臨時重定向,應使用GET定向獲取請求資源。303功能與302一樣,區別只是303明確客戶端應該使用GET訪問304 Not Modified
:表示客戶端發送附帶條件的請求(GET方法請求報文中的IF…)時,條件不滿足。返回304時,不包含任何響應主體。雖然304被劃分在3XX,但和重定向一毛錢關系都沒有307 Temporary Redirect
:臨時重定向,和302有著相同含義。POST不會變成GET4xx:客戶端錯誤
400 Bad Request
:客戶端請求有語法錯誤,服務器無法理解。401 Unauthorized
:請求未經授權,這個狀態代碼必須和 WWW-Authenticate 報頭域一起使用。403 Forbidden
:服務器收到請求,但是拒絕提供服務404 Not Found
:請求資源不存在。比如,輸入了錯誤的 URL415 Unsupported media type
:不支持的媒體類型5xx:服務器端錯誤,服務器未能實現合法的請求。
500 Internal Server Error
:服務器發生不可預期的錯誤。503 Server Unavailable
:服務器當前處于超負載或正在停機維護,暫時不能處理客戶端的請求,一段時間后可能恢復正常HTTP 響應頭
響應頭也是用鍵值對 k:v,用于補充響應的附加信息、服務器信息,以及對客戶端的附加要求等。
這里著重說明一下 Location
這個字段,可以將響應接收方引導至與某個 URI 位置不同的資源。通常來說,該字段會配合 3xx:Redirection
的響應,提供重定向的 URI。
① 短連接(非持久連接)
在 HTTP 協議的初始版本(HTTP/1.0)中,客戶端和服務器每進行一次 HTTP 會話,就建立一次連接,任務結束就中斷連接。當客戶端瀏覽器訪問的某個 HTML 或其他類型的 Web 頁中包含有其他的 Web 資源(如JavaScript 文件、圖像文件、CSS文件等),每遇到這樣一個 Web 資源,瀏覽器就會重新建立一個 HTTP 會話。這種方式稱為短連接(也稱非持久連接)。
也就是說每次 HTTP 請求都要重新建立一次連接。由于 HTTP 是基于 TCP/IP 協議的,所以連接的每一次建立或者斷開都需要 TCP 三次握手或者 TCP 四次揮手的開銷。
顯然,這種方式存在巨大的弊端。比如訪問一個包含多張圖片的 HTML 頁面,每請求一張圖片資源就會造成無謂的 TCP 連接的建立和斷開,大大增加了通信量的開銷
② 長連接(持久連接)
從 HTTP/1.1 起,默認使用長連接也稱持久連接 keep-alive。使用長連接的 HTTP 協議,會在響應頭加入這行代碼:Connection:keep-alive
在使用長連接的情況下,當一個網頁打開完成后,客戶端和服務器之間用于傳輸 HTTP 數據的 TCP 連接不會關閉,客戶端再次訪問這個服務器時,會繼續使用這一條已經建立的連接。Keep-Alive 不會永久保持連接,它有一個保持時間,可以在不同的服務器軟件(如 Apache)中設定這個時間。實現長連接需要客戶端和服務端都支持長連接。
HTTP 協議的長連接和短連接,實質上是 TCP 協議的長連接和短連接。
③ 流水線(管線化)
默認情況下,HTTP 請求是按順序發出的,下一個請求只有在當前請求收到響應之后才會被發出。由于受到網絡延遲和帶寬的限制,在下一個請求被發送到服務器之前,可能需要等待很長時間。
持久連接使得多數請求以流水線(管線化 pipeline)方式發送成為可能,即在同一條持久連接上連續發出請求,而不用等待響應返回后再發送,這樣就可以做到同時并行發送多個請求,而不需要一個接一個地等待響應了。
HTTP 協議是無狀態協議。也就是說他不對之前發生過的請求和響應的狀態進行管理,即無法根據之前的狀態進行本次的請求處理。
這樣就會帶來一個明顯的問題,如果 HTTP 無法記住用戶登錄的狀態,那豈不是每次頁面的跳轉都會導致用戶需要再次重新登錄?
當然,不可否認,無狀態的優點也很顯著,由于不必保存狀態,自然就減少了服務器的 CPU 及內存資源的消耗。另一方面,正式由于 HTTP 簡單,所以才會被如此廣泛應用。
這樣,在保留無狀態協議這個特征的同時,又要解決無狀態導致的問題。方案有很多種,其中比較簡單的方式就是使用 Cookie 技術。
Cookie
通過在請求和響應報文中寫入 Cookie 信息來控制客戶端的狀態。具體來說,Cookie 會根據從服務器端發送的響應報文中的一個叫作 Set-Cookie
的首部字段信息,通知客戶端保存 Cookie。當下次客戶端再往服務器發送請求時,客戶端會自動在請求報文中加入 Cookie 值發送出去。服務器端收到客戶端發來的 Cookie 后,會去檢查究竟是哪一個客戶端發來的連接請求,然后對比服務器上的記錄,最后得到之前的狀態信息。
形象來說,在客戶端第一次請求后,服務器會下發一個裝有客戶信息的身份證,后續客戶端請求服務器的時候,帶上身份證,服務器就能認得了。
下圖展示了發生 Cookie 交互的情景:
1)沒有 Cookie 信息狀態下的請求:
對應的 HTTP 請求報文(沒有 Cookie 信息的狀態)
GET /reader/ HTTP/1.1
Host: baidu.com
* 首部字段沒有 Cookie 的相關信息
對應的 HTTP 響應報文(服務端生成 Cookie 信息)
HTTP/1.1 200 OK
Date: Thu, 12 Jul 2020 15:12:20 GMT
Server: Apache
Set-Cookie: sid=1342077140226; path=/; expires=Wed, 10-Oct-12 15:12:20 GMT>
Content-Type: text/plain; charset=UTF-8
2)第 2 次以后的請求(存有 Cookie 信息狀態)
對應的 HTTP 請求報文(自動發送保存著的 Cookie 信息)
GET /image/ HTTP/1.1
Host: baidu.com
Cookie: sid=1342077140226
所謂斷點續傳指的是下載傳輸文件可以中斷,之后重新下載時可以接著中斷的地方開始下載,而不必從頭開始下載。斷點續傳需要客戶端和服務端都支持。
這是一個非常常見的功能,原理很簡單,其實就是 HTTP 請求頭中的字段 Range
和響應頭中的字段 Content-Range
的簡單使用。客戶端一塊一塊的請求數據,最后將下載回來的數據塊拼接成完整的數據。打個比方,瀏覽器請求服務器上的一個服務,所發出的請求如下:
假設服務器域名為www.baidu.com,文件名為 down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive
服務器收到請求后,按要求尋找請求的文件,提取文件的信息,然后返回給瀏覽器,返回信息如下:
200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT
OK,那么既然要斷點續傳,客戶端瀏覽器請求服務器的時候要多加一條信息 — 從哪里開始請求數據。 比如要求從 2000070 字節開始:
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔細看一下就會發現多了一行 RANGE: bytes=2000070-
。這一行的意思就是告訴服務器 down.zip 這個文件從 2000070 字節開始傳,前面的字節不用傳了。
服務器收到這個請求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服務器返回的信息比較一下,就會發現增加了一行: Content-Range=bytes 2000070-106786027/106786028
。返回的代碼也改為 206 了,而不再是 200 了。
到現在為止,我們已經了解到了 HTTP 具有相當優秀和方便的一面,然后,事務皆有兩面性,他也是有不足之處的:
通信使用明文(不加密),內容可能被竊聽
不驗證通信對方的身份,因此有可能遭遇偽裝
無法證明報文的完整性,所以有可能被篡改
這些問題不僅在 HTTP 上出現,其他未加密的協議中也存在類似問題,為了解決 HTTP 的痛點,HTTPS 應用而生,說白了 HTTP + 加密 + 認證 + 完整性保護就是 HTTPS 協議,關于 HTTPS 協議的內容也非常之多且重要,后續會單開一篇文章進行講解。
以上就是詳細HTTP協議的前世今生的詳細內容,更多關于HTTP協議的資料請關注腳本之家其它相關文章!
標簽:襄陽 錫林郭勒盟 鄂爾多斯 莆田 哈爾濱 雙鴨山 遵義 丹東
巨人網絡通訊聲明:本文標題《詳細HTTP協議的前世今生》,本文關鍵詞 詳細,HTTP,協議,的,前世,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。