簡介
HTTP(HyperText Transfer Protocol)肾请,當前一直使用的譯法是超文本傳輸協(xié)議
。應該算是當前最廣泛使用的一種網(wǎng)絡協(xié)議,現(xiàn)在人們上網(wǎng)都少不了使用瀏覽器瀏覽網(wǎng)頁,這里面使用的就是HTTP協(xié)議乡翅。
這里的Transfer是
轉(zhuǎn)移,轉(zhuǎn)換
的意思罪郊,不是傳輸?shù)囊馑既溲痢.斍暗淖g法是一個歷史遺留問題
發(fā)展史
HTTP協(xié)議更新還是比較慢的,也可以說明此協(xié)議還是比較穩(wěn)定的悔橄,這么多年只發(fā)布了1.0靶累、1.1腺毫、2.0三個版本。
- 1989年3月Tim BernersLee博士提出的一種能讓遠隔兩地的研究者們共享知識的設想:借助多文檔之間相互關聯(lián)形成的超文本挣柬,連成可相互參閱的萬維網(wǎng)(World Wide Web, 簡稱WWW或者web)潮酒。
- 1990年HTTP誕生,但是并沒有形成一種標準邪蛔,這時的HTTP被命名為HTTP/0.9
- 1996年5月急黎,時隔六年之久才正式將HTTP做為一個標準公布,命名為HTTP/1.0店溢,并記載于RFC1945叁熔。
- 1997年1月公布了HTTP/1.1版本是目前使用最為主流的HTTP協(xié)議版本。在HTTP/1.0的基礎上增加了很多實用的特性床牧。記載于RFC2068荣回,后面又在RFC2626做了更新。
- 2015年5月HTTP/2.0版本公布戈咳,并記載于RFC7540心软。此版本來源于谷歌的SPDY協(xié)議,主要目標是降低延遲著蛙。當前瀏覽器應該都已經(jīng)支持此版本删铃,但是使用最多的還是HTTP/1.1版本
特點
HTTP有很明顯的優(yōu)點,也有很明顯的缺點踏堡,所以現(xiàn)在單單使用HTTP協(xié)議的極少
- 原理簡單猎唁。基于請求顷蟆、響應方式來完成通信诫隅。客戶端發(fā)出請求帐偎,服務端收到請求并處理返回響應信息逐纬。
- 無連接。即每次連接只處理一個請求削樊,完成之后連接斷開豁生。在一開始很少人上網(wǎng)的時候是優(yōu)點,但是當前上網(wǎng)人太多的時候就是一個缺點了漫贞,像同時發(fā)送大量請求的時候會導致創(chuàng)建大量的連接甸箱,浪費計算機資源。這點已經(jīng)通過keepalive機制解決迅脐。
- 無狀態(tài)芍殖。HTTP協(xié)議自身不對請求和響應之間的通信狀態(tài)進行保存。這對于一個需要用戶登錄驗證再操作的網(wǎng)站是一個災難性的
優(yōu)點
仪际,因為每發(fā)一個請求都需要用戶登錄一次围小,不過當前已經(jīng)通過cookie解決。 - 安全性很差树碱,這個可以通過結(jié)合SSL/TLS協(xié)議解決肯适,即我們所說的HTTPS:
- 通信使用明文,內(nèi)容可以被竊聽成榜。
- 不驗證通信方的身份框舔,有可能遭遇偽裝。
- 無法證明報文的完整性赎婚,內(nèi)容有可能遭到篡改刘绣。
HTTP協(xié)議所處位置
HTTP是應用層協(xié)議底層使用的TCP/IP,如下圖:
HTTP報文
HTTP報文結(jié)構(gòu)包含首部和主體兩個部分挣输。根據(jù)HTTP的通信原理分為請求報文和響應報文
HTTP請求方法
主要是為了告知服務端要做什么樣的操作纬凤。HTTP/1.1中可用的有:
- GET: 獲取資源
- POST: 傳輸實體主體
- PUT: 傳輸文件,因安全性差一般不開啟
- DELETE: 刪除文件
- HEAD: 獲取報文首部
- OPTIONS: 詢問支持的方法
- TRACE: 追蹤路徑
PUT和POST是爭議最大的兩個方法撩嚼,這兩個方法都可以實現(xiàn)創(chuàng)建資源以及修改資源的目的停士,取決于設計實現(xiàn)。兩者最主要的區(qū)別是PUT具有冪等性完丽,而POST的具有恋技。一般來講都是使用PUT創(chuàng)建或者覆蓋資源,而使用POST修改資源逻族。
HTTP首部
HTTP首部由很多字段構(gòu)成蜻底,每個字段由字段名和字段值構(gòu)成,中間以":"分隔聘鳞。字段值可以有多個以","分隔薄辅。每個字段值還可以設置屬性以“;”分隔,q=[0,1]表示權(quán)重(即權(quán)重取值0到1搁痛,默認為1长搀,越大權(quán)重越大)。
Accept-Language:zh-CN,zh;q=0.9
注意:當HTTP首部中出現(xiàn)了多個字段名一樣的字段時鸡典,規(guī)范未做明確規(guī)定源请。所以結(jié)果也未可知,所以最好不要出現(xiàn)這種情況 彻况。
4種HTTP首部
-
通用首部字段
請求報文和響應報文都會使用的字段谁尸。
常見的有:- Connection: 控制不在轉(zhuǎn)發(fā)給代理的首部字段和管理持久連接
Connection:close
關閉連接
Connection:Keep-Alive
HTTP/1.0版本實現(xiàn)長連接的方法 - Upgrade:用于檢測HTTP協(xié)議及其他協(xié)議是否可以使用更改版本進行通信,其參數(shù)值可以用來指定一個完全不同的通信協(xié)議纽甘,像WebSocket協(xié)議良蛮,就可以使用下面方法:
Connection: Upgrade Upgrade: websocket
- Connection: 控制不在轉(zhuǎn)發(fā)給代理的首部字段和管理持久連接
-
請求首部
從客戶端向服務端發(fā)送請求時使用的首部。補充請求的附加內(nèi)容悍赢、客戶端信息决瞳、響應內(nèi)容相關優(yōu)先級等货徙。
常見的有:- Accept: 用戶代碼可處理的媒體類型
- Accept-Charset: 優(yōu)先處理的字符集
- Accept-Encoding: 優(yōu)先的內(nèi)容編碼
- Accept-Language: 優(yōu)先的語言(中文、英文等自然語言)
- Host:請求資源所在服務器
accept:text/plain, */*; q=0.01 accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.9
-
響應首部
從服務端向客戶端返回報文時使用的首部皮胡。補充了響應的附加內(nèi)容痴颊。
常見的有:- Location: 令客戶端重定向到指定的URI
- Retry-After: 對再次發(fā)起請求的時機要求
- Server: HTTP服務器的安裝信息
-
實體首部
針對請求報文和響應報文的實體部分使用的首部。補充了與實體資源有關的信息屡贺。
常用的有:- Content-Type: 實體主體的媒體類型
- Content-Length: 實體主體的大小蠢棱,單位字節(jié)
- Content-Language: 實體主體的自然語言
- Content-Encoding: 實體主體適用的編碼方式
- Expires: 實體主體過期時間
- Last-Modified: 資源的最后修改時間
content-length:5 content-type:text/html; charset=utf-8
HTTP狀態(tài)碼
狀態(tài)碼主要是描述服務端對請求處理的返回結(jié)果。
狀態(tài)碼類別
狀態(tài)碼 | 類別 | 描述 | 常用 |
---|---|---|---|
1XX |
Informational(信息性狀態(tài)碼) | 接收的請求正在處理 | |
2XX |
Success(成功狀態(tài)碼) | 請求正常處理完畢 | 200 OK,204 No Content,206 Partial Content |
3XX |
Redirection(重定向狀態(tài)碼) | 需求進行附加操作以完成 | 301 Moved Permanently, 302 Found, 303 See Other, 304 Not Modified, 307 Temporary Redirect |
4XX |
Client Error(客戶端錯誤碼) | 服務器無法處理請求 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
5XX |
Server Error(服務端錯誤碼) | 服務器處理請求出錯 | 500 Internal Server Error, 503 Service Unavailable |