1. 程式人生 > >HTTP協議簡介

HTTP協議簡介

put tle option 字符 http協議 一行 ava 客戶 ont

簡介

HTTP(HyperText Transfer Protocol, 超文本傳輸協議) 是訪問互聯網使用的核心通信協議,也是所有web應用程序使用的通信協議。
消息模型:客戶端發送請求消息,服務器返回響應消息。傳輸層使用具有狀態的TCP協議,但HTTP協議本身不具有狀態。

HTTP請求

HTTP請求消息分為消息頭和消息主體(可選),消息頭和消息主體用空白行分隔。實例:

1
2
3
4
5
6
7
8
9
GET / HTTP/1.1
Host: www.cnbeta.com
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&ch=&tn=baidu&bar=&wd=cnbeta&rn=&rsv_pq=917ee072000177b3&rsv_t=67c29bDcYXbklwxp5LMXvSvgQrSWnKznmk4XgHbAghkt7XqGt%2BfEuP%2BMDo4
Cookie: Hm_lvt_4216c57ef1855492a9281acd553f8a6e=1437836998; Hm_lpvt_4216c57ef1855492a9281acd553f8a6e=1437836998; _ga=GA1.2.1311393193.1437836981; bfd_s=208385984.21594488.1437837000279; tma=208385984.15187292.1437837000282.1437837000282.1437837000282.1; tmd=1.208385984.15187292.1437837000282.; bfd_g=b56c782bcb75035d00000a500201ba8455b3a6ca
Connection: keep-alive

說明:

1.消息頭第一行由三個以空格分隔的元素組成,分別為HTTP方法、請求的URL和使用的HTTP版本

  • HTTP方法;
    1). GET:用於獲取資源,參數通過URL查下字符串方式提交給服務器,無消息主體
    2). POST:用於執行操作,參數可以通過URL查下字符串方式和消息主體提交給服務
    3). HEAD:用於檢測資源是否存在,與GET類似,區別在於在響應消息中返回的消息主體為空
    4). TRACE:用於診斷,可判斷客戶端和服務器之間是否存在代理服務器,原理:服務器在響應主體中返回收到的請求消息的具體內容
    5). OPTIONS:用於要求服務器報告對某一資源有效的HTTP方法,服務器常返回Allow消息頭的響應,並列出所有有效的方法
    6). PUT:使用請求主體中的內容向服務器上傳指定的資源
    7). DELETE:用於刪除資源
    8). CONNECT:

  • 請求URL:用於指定請求的資源名稱以及查下參數

  • 使用的HTTP版本:常用1.0和1.1版本,在1.1版本中請求消息中必須包含Host請求頭

2.其他

  • Host:指定請求訪問的主機名,當多個web站點部署在同一臺主機上時需要使用Host消息頭

  • User-Agent:指定客戶端軟件的信息,不如瀏覽器類型和版本、操作系統類型和版本等

  • Referer:表示發出請求的原始URL

  • Cookie:提交服務器想客戶端發布的其他參數

HTTP 響應

HTTP響應消息分為消息頭和消息主體(可選),消息頭和消息主體用空白行分隔。實例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
HTTP/1.0 200 OK
Content-Type: text/html
Last-Modified: Sat, 25 Jul 2015 15:52:02 GMT
Vary: Accept-Encoding
Server: nginx/1.4.1
Date: Sat, 25 Jul 2015 15:53:04 GMT
ETag: "55b3b0a2-2539c"
Age: 74
X-Cache: HIT from RJ-ZSBGP-CDN-74
Set-Cookie: uuid=AQAAAEx080zNuwoAJH3PdhcuX+oK943s; Path=/; Expires=Sat, 25-Jul-15 17:09:08 GMT; HttpOnly

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>cnBeta.COM?</title>

<body>
Hello, Silence!
</body>
</html>

說明:

1.消息頭第一行由三個空格分開的元素組成,分別表示HTTP版本、請求狀態碼(數字)、請求狀態描述
2.其他:

  • Server:旗標,指明使用的Web服務器軟件

  • Set-Cookie:設置cookie信息,在隨後向服務器發送的請求中由Cookie消息頭返回

  • Content-Type:指定消息主體類型

  • Content-Length:指定消息主體的字節長度

URL

URL(Uniform Resource Locator,統一資源定位符)是web資源的唯一標識,格式:

protocol://hostname[:port]/[path/]file[?param=value]

REST

REST(表達性狀態轉移)是分布式系統的一個體系架構,REST風格URL 指在URL中使用文件路徑方式替代查詢字符串

HTTP消息頭

1.常用消息頭

  • Connection:用於指定告訴通信另一端傳輸完成後關閉TCP連接還是保持連接,HTTP/1.1中默認為keep-alive,可設置為close

  • Content-Encoding:用於指定消息主體中編碼格式

  • Content-Length;用於指定消息主體的字節長度

  • Content-Type:用於指定消息主體的內容類型

  • Transfer-Encoding:常指定為Transfer-Encoding:chunked,用於表示邊產生數據邊傳輸,在最後一塊數據中0\r\n\r\n標識數據結束,在其他塊數據中格式為\r\ncontent\r\n

2.請求消息頭

  • Accept:用於告知服務器客戶端接受哪些類型的數據

  • Accept-Encoding:用於告知服務器客戶端接受哪些編碼格式

  • Authorization:用於內置HTTP身份驗證,用於提交用戶名/密碼給服務器

  • Cookie:提交Cookie

  • If-Modified-Since:用於告知服務器最後一次收到請求資源的響應時間,當資源未發生變化時服務器返回狀態碼304表示使用本地緩存

  • If-None-Match:用於指定實體標簽,說明主體內容的標識符,當最後一次收到所請求的資源時,瀏覽器提交服務器發布的實體標簽。服務器可通過使用實體標簽確定瀏覽器是否使用緩存副本

  • Origin:用在Ajax跨域請求,指定發出請求的域名

  • Referer:指定發出請求額原始URL

  • User-Agent:用於指定客戶端信息

3.響應消息頭

  • Access-Control-Allow-Origin:用於指頂是否可通過跨域Ajax請求獲取資源

  • Cache-Control:用於向瀏覽器發送緩存指令(no-cache)

  • Etag:指定實體標簽,客戶端可在後續提交實體標簽獲得與If-None-Match消息頭相同的資源,通知服務器瀏覽器當前緩存保存的是哪個版本的資源

  • Expires:指定消息主體的有效時間,在時間內,瀏覽器可使用資源的緩存副本

  • Location:重定向響應,說用重定向的目標

  • Pragma:向瀏覽器傳送緩存指令(no-cache)

  • Server:告知瀏覽器服務器軟件相關信息

  • Set-Cookie:向瀏覽器發布cookie

  • WWW-Authenticate:用於401狀態碼響應,提供與服務器所支持的身份驗證類型等信息

  • X-Frame-Options:指示瀏覽器Frame是否及如何加載當前響應

cookie

服務器使用Set-Cookie響應消息頭向瀏覽器發布cookie信息,可以使用多個響應消息頭發布多個cookie,瀏覽器也可使用Cookie請求消息頭提交使用分號分隔的多個cookie信息給服務器

cookie具有名稱、值、有效時間、有效域、有效路徑、是否為https請求、是否可在客戶端修改屬性,可通過Set-Cookie響應消息頭設置,參數列表如下:

  • expires:指定cookie有效時間,若未指定則表示只保存在當前瀏覽器回話中

  • domain:指定cookie有效域,必須和收到cookie的域相同或者是其父域

  • path:指定cookie的有效url路徑

  • secure:僅僅在https請求中提交cookie信息

  • httpOnly:用於指定在客戶端是否可以通過js修改cookie信息

狀態碼

狀態碼用於說明請求結果,分為5大類:

  • 1XX:提供信息

  • 2XX:請求成功

  • 3XX:請求重定向

  • 4XX:請求包含錯誤

  • 5XX:服務器執行錯誤

常見狀態碼說明:

  • 100 Continue:當客戶端提交一個包含主體的請求時,將發送該響應,表示已收到請求消息頭,客戶端繼續發送主體

  • 200 OK:請求成功,且響應主體中包含請求結果

  • 201 Created:PUT請求的響應返回狀態碼,表示請求成功提交

  • 301 Moved Permanently:指示瀏覽器永久重定向到Location指定的URL,客戶端使用新的URL替換原始URL

  • 302 Found:指示瀏覽器暫時重定向到Location指定的URL,客戶端隨後的請求恢復到原始URL

  • 304 Not Modified:指示瀏覽器使用緩存中保存的資源副本

  • 400 Bad Request:表示發起無效HTTP請求

  • 401 Unauthorized:服務器需要進行HTTP身份認證

  • 403 Forbidden:禁止訪問請求資源

  • 404 Not Found:表示資源不存在

  • 405 Method Not Allowd:表示URL不支持請求方法

  • 413 Request Entity Too Large:表示請求主體過長,服務器無法處理

  • 413 Request URI Too Long:表示請求URL過長,服務器無法處理

  • 500 Internal Server Error:表示服務器執行遇到錯誤

  • 503 Service Unavailable:表示服務器運行正常,但無法做出響應

HTTPS

HTTP使用非加密的TCP作為傳輸機制,缺點在網絡適當位置的攻擊者能夠截獲發送內容,HTTPS和HTTP都屬於應用層協議,當HTTPS通過安全傳輸機制-安全套接層(Secure Socket Layer,SSL)傳輸數據,可保護通過網絡傳輸數據的機密性和完整性

SSL已經由TLS(Transport Layer Security,傳輸層安全)代替

HTTP代理

代理服務器運行在客戶端瀏覽器和web服務器之間,瀏覽器將所有請求提交給代理服務器,代理服務器將請求傳送給相關web服務器,並將響應返回給瀏覽器

HTTP代理服務器工作機制:

  • 當瀏覽器向代理服務器發送HTTP請求時,代理服務器將完整URL插入請求中,代理服務器將提取主機名和端口,並使用這些信息將請求指向正確的目標web服務器

  • 當瀏覽器向代理服務器發送HTTPS請求時,瀏覽器將代理作為TCP級中繼,瀏覽器使用CONNECT方法向代理服務器提交一個HTTP請求,並指定URL中的目標主機名稱和端口號,從而建立中繼。若代理允許該請求,則返回200狀態碼的HTTP響應,一直開放TCP鏈接,從此以後作為目標web服務器的TCP級中繼

HTTP身份認證

HTTP具有自己的用戶身份驗證機制,主要方案由:

    • Basic:在請求消息頭中隨每條消息以Base64編碼字符串的形式發送用戶證書

    • NTLM:是質詢-響應式機制,使用Windows NTLM協議版本

    • Digest:是質詢-響應式機制,隨同用戶證書一起使用一個隨機值的MD5校驗和

HTTP協議簡介