05-HTTP協議-萬字好文!建議收藏

HTTP協議介紹

設計HTTP(HyperText Transfer Protocol)是爲了提供一種發佈和接收HTML(HyperText Markup Language)頁面的方法css

Http組成

由兩部分組成:請求與響應html

HTTP協議介紹 - 圖1

客戶端請求消息

客戶端發送一個HTTP請求到服務器的請求消息包括如下格式:請求行(request line)、請求頭部(header)、空行和請求數據四個部分組成,下圖給出了請求報文的通常格式。web

HTTP協議介紹 - 圖2

服務器響應消息

HTTP響應也由四個部分組成,分別是:狀態行、消息報頭、空行和響應正文。數據庫

HTTP協議介紹 - 圖3


先看Request 消息的結構, Request 消息分爲3部分,第一部分叫Request line, 第二部分叫Request header, 第三部分是body. header和body之間有個空行, 結構以下圖跨域

HTTP協議介紹 - 圖4

抽象的東西,難以理解,老感受是虛的, 所謂眼見爲實, 實際見到的東西,咱們才能理解和記憶。 咱們今天用Fiddler,實際的看看Request和Response.瀏覽器

下面咱們打開Fiddler 捕捉一個博客園登陸的Request 而後分析下它的結構, 在Inspectors tab下以Raw的方式能夠看到完整的Request的消息,緩存

咱們再看Response消息的結構, 和Request消息的結構基本同樣。 一樣也分爲三部分,第一部分叫Response line, 第二部分叫Response header,第三部分是body. header和body之間也有個空行, 結構以下圖安全

HTTP協議介紹 - 圖6

HTTP/version-number表示HTTP協議的版本號, status-code 和message 請看下節[狀態代碼]的詳細解釋.服務器

咱們用Fiddler 捕捉一個博客園首頁的Response而後分析下它的結構, 在Inspectors tab下以Raw的方式能夠看到完整的Response的消息, 以下圖cookie

HTTP協議介紹 - 圖7


提出一個問題

服務器和客戶端的交互僅限於請求/響應過程,結束以後便斷開,在下一次請求服務器會認爲新的客戶端;

爲了維護他們之間的連接,讓服務器知道這是前一個用戶發送的請求,必須在一個地方保存客戶端的信息,

  • Cookie經過在客戶端記錄信息肯定用戶身份
  • Session經過在服務器端記錄信息肯定用戶身份

HTTP 請求

HTTP請求 - 圖1


  • 請求方法

根據HTTP標準,HTTP請求可使用多種請求方法。

HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法。

HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

序號 方法 描述
1 GET 請求指定的頁面信息,並返回實體主體。
2 HEAD 相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
3 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。
4 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。
5 DELETE 請求服務器刪除指定的頁面。
6 CONNECT HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。
7 OPTIONS 容許客戶端查看服務器的性能。
8 TRACE 回顯服務器收到的請求,主要用於測試或診斷。

GET和POST方法區別概括以下幾點:

  • GET是從服務器上獲取數據,POST是向服務器傳送數據。
  • GET請求參數顯示,都顯示在瀏覽器網址上,POST請求參數在請求體當中,消息長度沒有限制並且以隱式的方式進行發送
  • 儘可能避免使用Get方式提交表單,由於有可能會致使安全問題。好比說在登錄表單中用Get方式,用戶輸入的用戶名和密碼將在地址欄中暴露無遺。可是在分頁程序中,用Get方式就比用Post好。

Http協議定義了不少與服務器交互的方法,最基本的有4種,分別是GET,POST,PUT,DELETE. 一個URL地址用於描述一個網絡上的資源,而HTTP中的GET, POST, PUT, DELETE就對應着對這個資源的查,改,增,刪4個操做。 咱們最多見的就是GET和POST了。GET通常用於獲取/查詢資源信息,而POST通常用於更新資源信息.

咱們看看GET和POST的區別

  1. GET提交的數據會放在URL以後,以?分割URL和傳輸數據,參數之間以&相連,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的數據放在HTTP包的Body中.
  2. GET提交的數據大小有限制(由於瀏覽器對URL的長度有限制),而POST方法提交的數據沒有限制.
  3. GET方式須要使用Request.QueryString來取得變量的值,而POST方式經過Request.Form來獲取變量的值。
  4. GET方式提交數據,會帶來安全問題,好比一個登陸頁面,經過GET方式提交數據時,用戶名和密碼將出如今URL上,若是頁面能夠被緩存或者其餘人能夠訪問這臺機器,就能夠從歷史記錄得到該用戶的帳號和密碼.

URL概述

統一資源定位符(URL,英語 Uniform / Universal Resource Locator的縮寫)是用於完整地描述Internet上網頁和其餘資源的地址的一種標識方法。

URL格式:

基本格式以下schema://host[:port#]/path/…/?query-string

HTTP請求 - 圖2

  • schema 協議(例如:http, https, ftp)
  • host 服務器的IP地址或者域名
  • port# 服務器的端口(若是是走協議默認端口,缺省端口80)
  • path 訪問資源的路徑
  • query-string 參數,發送給http服務器的數據
  • anchor- 錨(跳轉到網頁的指定錨點位置)

例子:

當你在瀏覽器輸入URL http://www.website.com 的時候,瀏覽器發送一個Request去獲取 http://www. website.com的html. 服務器把Response發送回給瀏覽器.瀏覽器分析Response中的 HTML,發現其中引用了不少其餘文件,好比圖片,CSS文件,JS文件。瀏覽器會自動再次發送Request去獲取圖片,CSS文件,或者JS文件。當全部的文件都下載成功後, 網頁就被顯示出來了。

經常使用的請求報頭

  • Host

Host初始URL中的主機和端口,用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的

  • Connection

表示客戶端與服務鏈接類型;

  • client 發起一個包含Connection:keep-alive的請求
  • server收到請求後,若是server支持keepalive,回覆一個包含Connection:keep-alive的響應,不關閉鏈接,不然回覆一個包含Connection:close的響應,關閉鏈接。
  • 若是client收到包含Connection:keep-alive的響應,向同一個鏈接發送下一個請求,直到一方主動關閉鏈接。Keep-alive在不少狀況下可以重用鏈接,減小資源消耗,縮短響應時間HTTP
  • Accept

表示瀏覽器支持的 MIME 類型

MIME的英文全稱是 Multipurpose Internet Mail Extensions(多用途互聯網郵件擴展)

eg:Accept:image/gif,代表客戶端但願接受GIF圖象格式的資源;Accept:text/html,代表客戶端但願接受html文本。Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8意思:瀏覽器支持的 MIME 類型分別是 text/html、application/xhtml+xml、application/xml 和 */*,優先順序是它們從左到右的排列順序。 Text:用於標準化地表示的文本信息,文本消息能夠是多種字符集和或者多種格式的;Application:用於傳輸應用程序數據或者二進制數據;

設定某種擴展名的文件用一種應用程序來打開的方式類型,當該擴展名文件被訪問的時候,瀏覽器會自動使用指定應用程序來打開

Mime類型 擴展名
text/html .htm .html .shtml
text/plain text/html是以html的形式輸出,好比<input type="text"/>就會在頁面上顯示一個文本框,而以plain形式就會在頁面上原樣顯示這段代碼
application/xhtml+xml .xhtml .xml
text/css .css
application/msexcel .xls .xla
application/msword .doc .dot
application/octet-stream .exe
application/pdf .pdf
….. …..

q是權重係數,範圍 0 =< q <= 1,q 值越大,請求越傾向於得到其「;」以前的類型表示的內容,若沒有指定 q 值越大,請求越傾向於得到其「,則默認爲1,若被賦值爲0,則用於提醒服務器哪些是瀏覽器不接受的內容類型。

  • Content-Type

POST 提交,application/x-www-form-urlencoded 提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。

  • User-Agent

瀏覽器類型

  • Referer

請求來自哪一個頁面,用戶是從該 Referer URL頁面訪問當前請求的頁面。

  • Accept-Encoding

瀏覽器支持的壓縮編碼類型,好比gzip,支持gzip的瀏覽器返回經gzip編碼的HTML頁面。

許多情形下這能夠減小5到10倍的下載時間

eg:Accept-Encoding:gzip;q=1.0, identity; q=0.5, *;q=0 // 按順序支持 gzip , identity若是有多個Encoding同時匹配, 按照q值順序排列

若是請求消息中沒有設置這個域服務器假定客戶端對各類內容編碼均可以接受。

  • Accept-Language

瀏覽器所但願的語言種類,當服務器可以提供一種以上的語言版本時要用到。

  1. eg:
  2. Accept-Language:zh-cn

若是請求消息中沒有設置這個報頭域,服務器假定客戶端對各類語言均可以接受。

  • Accept-Charset

瀏覽器可接受的字符集,用於指定客戶端接受的字符集

eg:Accept-Charset:iso-8859-1,gb2312ISO8859-1,一般叫作Latin-1。Latin-1包括了書寫全部西方歐洲語言不可缺乏的附加字符;gb2312是標準中文字符集;UTF-8 是 UNICODE 的一種變長字符編碼,能夠解決多種語言文本顯示問題,從而實現應用國際化和本地化。若是在請求消息中沒有設置這個域,缺省是任何字符集均可以接受。

HTTP 響應

學習目的

掌握經常使用的響應狀態碼

HTTP響應 - 圖1

  • 響應狀態碼

響應狀態代碼有三位數字組成,第一個數字定義了響應的類別,且有五種可能取值:

狀態碼

Response 消息中的第一行叫作狀態行,由HTTP協議版本號, 狀態碼, 狀態消息 三部分組成。

狀態碼用來告訴HTTP客戶端,HTTP服務器是否產生了預期的Response.

HTTP/1.1中定義了5類狀態碼, 狀態碼由三位數字組成,第一個數字定義了響應的類別

1XX 提示信息 - 表示請求已被成功接收,繼續處理

2XX 成功 - 表示請求已被成功接收,理解,接受

3XX 重定向 - 要完成請求必須進行更進一步的處理

4XX 客戶端錯誤 - 請求有語法錯誤或請求沒法實現

5XX 服務器端錯誤 - 服務器未能實現合法的請求

分類 分類描述
1 信息,服務器收到請求,須要請求者繼續執行操做
2 成功,操做被成功接收並處理
3 重定向,須要進一步的操做以完成請求
4 客戶端錯誤,請求包含語法錯誤或沒法完成請求
5** 服務器錯誤,服務器在處理請求的過程當中發生了錯誤
  • 最經常使用的響應狀態碼

◆200 (OK): 找到了該資源,而且一切正常。

◆301(Moved Permanently): 客戶請求的文檔在其餘地方,新的URL在Location頭中給出,瀏覽器應該自動地訪問新的URL。

◆302 (Found): 相似於301,但新的URL應該被視爲臨時性的替代,而不是永久性的。

◆304 (NOT MODIFIED): 該資源在上次請求以後沒有任何修改。這一般用於瀏覽器的緩存機制。

◆400 (Bad Request): 請求出現語法錯誤。

◆403 (FORBIDDEN): 客戶端未能得到受權。這一般是在401以後輸入了不正確的用戶名或密碼。

◆404 (NOT FOUND): 在指定的位置不存在所申請的資源。

◆500 (Internal Server Error): 服務器遇到了意料不到的狀況,不能完成客戶的請求

◆503 (Service Unavailable): 服務器因爲維護或者負載太重未能應答。例如,Servlet可能在數據庫鏈接池已滿的狀況下返回503。服務器返回503時能夠提供一個Retry-After頭


看看一些常見的狀態碼

200 OK

最多見的就是成功響應狀態碼200了, 這代表該請求被成功地完成,所請求的資源發送回客戶端

以下圖, 打開博客園首頁

HTTP響應 - 圖2

302 Found

重定向,新的URL會在response 中的Location中返回,瀏覽器將會自動使用新的URL發出新的Request

例如在IE中輸入, http://www.google.com. HTTP服務器會返回302, IE取到Response中Location header的新URL, 又從新發送了一個Request.

304 Not Modified

表明上次的文檔已經被緩存了, 還能夠繼續使用,

例如打開博客園首頁, 發現不少Response 的status code 都是304

HTTP響應 - 圖3

提示: 若是你不想使用本地緩存能夠用Ctrl+F5 強制刷新頁面

400 Bad Request 客戶端請求與語法錯誤,不能被服務器所理解

403 Forbidden 服務器收到請求,可是拒絕提供服務

404 Not Found

請求資源不存在(輸錯了URL)

好比在IE中輸入一個錯誤的URL, http://www.cnblogs.com/tesdf.aspx

HTTP響應 - 圖4

500 Internal Server Error 服務器發生了不可預期的錯誤

503 Server Unavailable 服務器當前不能處理客戶端的請求,一段時間後可能恢復正常


HTTP Request header

使用Fiddler 能很方便的查看Reques header, 點擊Inspectors tab ->Request tab-> headers 以下圖所示

HTTP響應 - 圖5

header 有不少,比較難以記憶,咱們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。


Cache 頭域

  • If-Modified-Since
做用: 把瀏覽器端緩存頁面的最後修改時間發送到服務器去,服務器會把這個時間與服務器上實際文件的最後修改時間進行對比。若是時間一致,那麼返回304,客戶端就直接使用本地緩存文件。若是時間不一致,就會返回200和新的文件內容。客戶端接到以後,會丟棄舊文件,把新文件緩存起來,並顯示在瀏覽器中.

例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

實例以下圖

HTTP響應 - 圖6

  • If-None-Match
做用: If-None-Match和ETag一塊兒工做,工做原理是在HTTP Response中添加ETag信息。 當用戶再次請求該資源時,將在HTTP Request 中加入If-None-Match信息(ETag的值)。若是服務器驗證資源的ETag沒有改變(該資源沒有更新),將返回一個304狀態告訴客戶端使用本地緩存文件。不然將返回200狀態和新的資源和Etag. 使用這樣的機制將提升網站的性能

例如: If-None-Match: "03f2b33c0bfcc1:0"

實例以下圖

HTTP響應 - 圖7

  • Pragma
做用: 防止頁面被緩存, 在HTTP/1.1版本中,它和Cache-Control:no-cache做用如出一轍

Pargma只有一個用法, 例如: Pragma: no-cache

注意: 在HTTP/1.0版本中,只實現了Pragema:no-cache, 沒有實現Cache-Control

  • Cache-Control
做用: 這個是很是重要的規則。 這個用來指定Response-Request遵循的緩存機制。各個指令含義以下

Cache-Control:Public 能夠被任何緩存所緩存()

Cache-Control:Private 內容只緩存到私有緩存中

Cache-Control:no-cache 全部內容都不會被緩存

還有其餘的一些用法, 我沒搞懂其中的意思, 請你們參考其餘的資料

Client 頭域

HTTP響應 - 圖8

  • Accept
做用: 瀏覽器端能夠接受的媒體類型,

例如: Accept: text/html 表明瀏覽器能夠接受服務器回發的類型爲 text/html 也就是咱們常說的html文檔,

若是服務器沒法返回text/html類型的數據,服務器應該返回一個406錯誤(non acceptable)

通配符 表明任意類型

例如 Accept: /* 表明瀏覽器能夠處理全部類型,(通常瀏覽器發給服務器都是發這個)

  • Accept-Encoding:
做用: 瀏覽器申明本身接收的編碼方法,一般指定壓縮方法,是否支持壓縮,支持什麼壓縮方法(gzip,deflate),(注意:這不是隻字符編碼);

例如: Accept-Encoding: gzip, deflate

  • Accept-Language
做用: 瀏覽器申明本身接收的語言。

語言跟字符集的區別:中文是語言,中文有多種字符集,好比big5,gb2312,gbk等等;

例如: Accept-Language: en-us

  • User-Agent
做用:告訴HTTP服務器, 客戶端使用的操做系統和瀏覽器的名稱和版本.

咱們上網登錄論壇的時候,每每會看到一些歡迎信息,其中列出了你的操做系統的名稱和版本,你所使用的瀏覽器的名稱和版本,這每每讓不少人感到很神奇,實際上,服務器應用程序就是從User-Agent這個請求報頭域中獲取到這些信息User-Agent請求報頭域容許客戶端將它的操做系統、瀏覽器和其它屬性告訴服務器。

例如:User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; CIBA; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; InfoPath.2; .NET4.0E)

  • Accept-Charset
做用:瀏覽器申明本身接收的字符集,這就是本文前面介紹的各類字符集和字符編碼,如gb2312,utf-8(一般咱們說Charset包括了相應的字符編碼方案)

Cookie/Login 頭域

Cookie:

做用: 最重要的header, 將cookie的值發送給HTTP 服務器


Entity頭域

  • Content-Length
做用:發送給HTTP服務器數據的長度。

例如: Content-Length: 38

  • Content-Type
做用:

例如:Content-Type: application/x-www-form-urlencoded


Miscellaneous 頭域

  • Referer:
做用: 提供了Request的上下文信息的服務器,告訴服務器我是從哪一個連接過來的,好比從我主頁上連接到一個朋友那裏,他的服務器就可以從HTTP Referer中統計出天天有多少用戶點擊我主頁上的連接訪問他的網站。

例如: Referer:http://translate.google.cn/?hl=zh-cn&tab=wT


Transport 頭域

  • Connection
例如: Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接

例如: Connection: close 表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉, 當客戶端再次發送Request,須要從新創建TCP鏈接。

  • Host(發送請求時,該報頭域是必需的)
做用: 請求報頭域主要用於指定被請求資源的Internet主機和端口號,它一般從HTTP URL中提取出來的

例如: 咱們在瀏覽器中輸入:http://www.guet.edu.cn/index.html

瀏覽器發送的請求消息中,就會包含Host請求報頭域,以下:Host:http://www.guet.edu.cn 此處使用缺省端口號80,若指定了端口號,則變成:Host:指定端口號


HTTP Response header

一樣使用Fiddler 查看Response header, 點擊Inspectors tab ->Response tab-> headers 以下圖所示

HTTP響應 - 圖9

咱們也按照Fiddler那樣把header 進行分類,這樣比較清晰也容易記憶。

Cache頭域

  • Date
做用: 生成消息的具體時間和日期

例如: Date: Sat, 11 Feb 2012 11:35:14 GMT

  • Expires
做用: 瀏覽器會在指定過時時間內使用本地緩存

例如: Expires: Tue, 08 Feb 2022 11:35:14 GMT

  • Vary
做用:要了解 Vary 的做用,先得了解 HTTP 的內容協商機制。有時候,同一個 URL 能夠提供多份不一樣的文檔,這就要求服務端和客戶端之間有一個選擇最合適版本的機制,這就是內容協商。

例如: Vary: Accept-Encoding

Cookie/Login 頭域

  • P3P
做用: 用於跨域設置Cookie, 這樣能夠解決iframe跨域訪問cookie的問題

例如: P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

  • Set-Cookie
做用: 很是重要的header, 用於把cookie 發送到客戶端瀏覽器, 每個寫入cookie都會生成一個Set-Cookie.

例如: Set-Cookie: sc=4c31523a; path=/; domain=.acookie.taobao.com

HTTP響應 - 圖10

Entity頭域

  • ETag
做用: 和If-None-Match 配合使用。 (實例請看上節中If-None-Match的實例)

例如: ETag: "03f2b33c0bfcc1:0"

  • Last-Modified:
做用: 用於指示資源的最後修改日期和時間。(實例請看上節的If-Modified-Since的實例)

例如: Last-Modified: Wed, 21 Dec 2011 09:09:10 GMT

  • Content-Type
做用:WEB服務器告訴瀏覽器本身響應的對象的類型和字符集,

例如:

Content-Type: text/html; charset=utf-8

Content-Type:text/html;charset=GB2312

Content-Type: image/jpeg

  • Content-Length
指明實體正文的長度,以字節方式存儲的十進制數字來表示。在數據下行的過程當中,Content-Length的方式要預先在服務器中緩存全部數據,而後全部數據再一古腦兒地發給客戶端。

例如: Content-Length: 19847

  • Content-Encoding
WEB服務器代表本身使用了什麼壓縮方法(gzip,deflate)壓縮響應中的對象。

例如:Content-Encoding:gzip

  • Content-Language
做用: WEB服務器告訴瀏覽器本身響應的對象的語言者

例如: Content-Language:da

Miscellaneous 頭域

  • Server:
做用:指明HTTP服務器的軟件信息

例如:Server: Microsoft-IIS/7.5

  • X-AspNet-Version:
做用:若是網站是用ASP.NET開發的,這個header用來表示ASP.NET的版本

例如: X-AspNet-Version: 4.0.30319

  • X-Powered-By:
做用:表示網站是用什麼技術開發的

例如: X-Powered-By: ASP.NET

Transport頭域

  • Connection
例如: Connection: keep-alive 當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接

例如: Connection: close 表明一個Request完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接會關閉, 當客戶端再次發送Request,須要從新創建TCP鏈接。

Location頭域

  • Location
做用: 用於重定向一個新的位置, 包含新的URL地址

實例請看304狀態實例


HTTP協議是無狀態的和Connection: keep-alive的區別

無狀態是指協議對於事務處理沒有記憶能力,服務器不知道客戶端是什麼狀態。從另外一方面講,打開一個服務器上的網頁和你以前打開這個服務器上的網頁之間沒有任何聯繫

HTTP是一個無狀態的面向鏈接的協議,無狀態不表明HTTP不能保持TCP鏈接,更不能表明HTTP使用的是UDP協議(無鏈接)

從HTTP/1.1起,默認都開啓了Keep-Alive,保持鏈接特性,簡單地說,當一個網頁打開完成後,客戶端和服務器之間用於傳輸HTTP數據的TCP鏈接不會關閉,若是客戶端再次訪問這個服務器上的網頁,會繼續使用這一條已經創建的鏈接

Keep-Alive不會永久保持鏈接,它有一個保持時間,能夠在不一樣的服務器軟件(如Apache)中設定這個時間

image

IT入門 感謝關注 |  練習地址:www.520mg.com/it

相關文章
相關標籤/搜索