一、Http協(xié)議簡介
HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本到本地瀏覽器的傳送協(xié)議。它基于TCP/IP通信協(xié)議來傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。屬于協(xié)議分層中的應(yīng)用層協(xié)議。
主要特點(diǎn):
簡單快速:客戶向服務(wù)器請求服務(wù)時,只需傳送請求方法和路徑。請求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同。由于HTTP協(xié)議簡單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。
靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對象。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。
無連接:無連接的含義是限制每次連接只處理一個請求。服務(wù)器處理完客戶的請求,并收到客戶的應(yīng)答后,即斷開連接。采用這種方式可以節(jié)省傳輸時間。
無狀態(tài):HTTP協(xié)議是無狀態(tài)協(xié)議。無狀態(tài)是指協(xié)議對于事務(wù)處理沒有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時它的應(yīng)答就較快。
支持B/S及C/S模式。
二、URL
URI:uniform resource identifier,統(tǒng)一資源標(biāo)識符,用來唯一的標(biāo)識一個資源。
URL:uniform resource locator,統(tǒng)一資源定位器,它是一種具體的URI,即URL可以用來標(biāo)識一個資源,而且還指明了如何locate這個資源。
URL是Internet上用來描述信息資源的字符串,主要用在各種WWW客戶程序和服務(wù)器程序上,采用URL可以用一種統(tǒng)一的格式來描述各種信息資源,包括文件、服務(wù)器的地址和目錄等。URL一般由三部組成:
- 協(xié)議(或稱為服務(wù)方式)
- 存有該資源的主機(jī)IP地址(有時也包括端口號)
- 主機(jī)資源的具體地址。如目錄和文件名等
URL格式:http://host[":"port][abs_path]
http表示要通過HTTP協(xié)議來定位網(wǎng)絡(luò)資源;host表示合法的Internet主機(jī)域名或者IP地址;port指定一個端口號,為空則使用默認(rèn)端口80;abs_path指定請求資源的URI(Web上任意的可用資源)
三、Http協(xié)議請求方法
HTTP請求方法有8種:
GET:請求獲取Request-URI所標(biāo)識的資源
POST:在Request-URI所標(biāo)識的資源后附加新的數(shù)據(jù)
HEAD:請求獲取由Request-URI所標(biāo)識的資源的響應(yīng)消息報頭
PUT: 請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識
DELETE :請求服務(wù)器刪除Request-URI所標(biāo)識的資源
TRACE : 請求服務(wù)器回送收到的請求信息,主要用于測試或診斷
CONNECT: HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
OPTIONS :請求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項(xiàng)和需求
根據(jù)請求方法,又可以分為如下幾類:
安全的方法:指的是這個方法在語義上是只讀的,它不會對服務(wù)器產(chǎn)生任何預(yù)期修改。
冪等的方法:指的是一個請求方法多次獨(dú)立執(zhí)行和只執(zhí)行一次對服務(wù)器產(chǎn)生的預(yù)期效果完全相同。
可緩存的方法:指的是該方法對應(yīng)的響應(yīng)消息能夠在客戶端被存儲,并在之后的請求中被直接使用,而不再需要從服務(wù)端重新獲取。
根據(jù)上述分類,可將8種Http請求方法歸納如下:

最后比較下Android中常用的get和post的區(qū)別:
GET提交的數(shù)據(jù)會放在URL之后,以?分割URL和傳輸數(shù)據(jù),參數(shù)之間以&相連,如EditPosts.aspx?name=test1&id=123456.,POST方法是把提交的數(shù)據(jù)放在HTTP包的Body中。
GET提交的數(shù)據(jù)大小有限制(因?yàn)闉g覽器對URL的長度有限制),而POST方法提交的數(shù)據(jù)沒有限制。
GET方式需要使用Request.QueryString來取得變量的值,而POST方式通過Request.Form來獲取變量的值。
GET方式提交數(shù)據(jù),會帶來安全問題,比如一個登錄頁面,通過GET方式提交數(shù)據(jù)時,用戶名和密碼將出現(xiàn)在URL上,如果頁面可以被緩存或者其他人可以訪問這臺機(jī)器,就可以從歷史記錄獲得該用戶的賬號和密碼。
四、HTTP的消息報頭
消息報頭分為通用報頭、請求報頭、響應(yīng)報頭、實(shí)體報頭等。消息頭由鍵值對組成,每行一對,關(guān)鍵字和值用英文冒號“:”分隔。
通用報頭
請求報頭和響應(yīng)報頭均出現(xiàn)
- Date:表示消息產(chǎn)生的日期和時間
- Connection:允許發(fā)送指定連接的選項(xiàng),例如指定連接是連續(xù)的,或者指定“close”選項(xiàng),通知服務(wù)器,在響應(yīng)完成后,關(guān)閉連接
- Cache-Control:用于指定緩存指令,緩存指令是單向的(響應(yīng)中出現(xiàn)的緩存指令在請求中未必會出現(xiàn)),且是獨(dú)立的(一個消息的緩存指令不會影響另一個消息處理的緩存機(jī)制)
請求報頭
請求報頭通知服務(wù)器關(guān)于客戶端求求的信息,典型的請求頭有:
- Host:請求的主機(jī)名,允許多個域名同處一個IP地址,即虛擬主機(jī)
- User-Agent:發(fā)送請求的瀏覽器類型、操作系統(tǒng)等信息
- Accept:客戶端可識別的內(nèi)容類型列表,用于指定客戶端接收那些類型的信息
- Accept-Encoding:客戶端可識別的數(shù)據(jù)編碼
- Accept-Language:表示瀏覽器所支持的語言類型
- Connection:允許客戶端和服務(wù)器指定與請求/響應(yīng)連接有關(guān)的選項(xiàng),例如這是為Keep-Alive則表示保持連接。
- Transfer-Encoding:告知接收端為了保證報文的可靠傳輸,對報文采用了什么編碼方式。
響應(yīng)報頭
用于服務(wù)器傳遞自身信息的響應(yīng),常見的響應(yīng)報頭:
- Location:用于重定向接受者到一個新的位置,常用在更換域名的時候
- Server:包含可服務(wù)器用來處理請求的系統(tǒng)信息,與User-Agent請求報頭是相對應(yīng)的
實(shí)體報頭
實(shí)體報頭用來定義被傳送資源的信息,既可以用于請求也可用于響應(yīng)。請求和響應(yīng)消息都可以傳送一個實(shí)體,常見的實(shí)體報頭為:
- Content-Type:發(fā)送給接收者的實(shí)體正文的媒體類型
- Content-Lenght:實(shí)體正文的長度
- Content-Language:描述資源所用的自然語言,沒有設(shè)置則該選項(xiàng)則認(rèn)為實(shí)體內(nèi)容將提供給所有的語言閱讀
- Content-Encoding:實(shí)體報頭被用作媒體類型的修飾符,它的值指示了已經(jīng)被應(yīng)用到實(shí)體正文的附加內(nèi)容的編碼,因而要獲得Content-Type報頭域中所引用的媒體類型,必須采用相應(yīng)的解碼機(jī)制。
- Last-Modified:實(shí)體報頭用于指示資源的最后修改日期和時間
- Expires:實(shí)體報頭給出響應(yīng)過期的日期和時間
五、Request
Get請求例子:
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host www.zht.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.[imooc.com/](http://imooc.com/)
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:請求行,用來說明請求類型,要訪問的資源以及所使用的HTTP版本。
第二部分:請求頭部,緊接著請求行(即第一行)之后的部分,用來說明服務(wù)器要使用的附加信息。
第三部分:空行,請求頭部后面的空行是必須的。即使第四部分的請求數(shù)據(jù)為空,也必須有空行。
第四部分:請求數(shù)據(jù)也叫主體,可以添加任意的其他數(shù)據(jù)。
POST請求例子:
POST / HTTP1.1
Host: www.zht.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:請求行,第一行明了是post請求,以及http1.1版本。
第二部分:請求頭部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:請求數(shù)據(jù)。
六、Response
HTTP/1.1 200 OK //狀態(tài)行
Server: openresty //響應(yīng)報頭
Date: Sun, 27 Mar 2016 08:26:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
Cache-Control: private
X-Powered-By: PHP 5.4.28
Content-Encoding: gzip
//不能省略的空格
...請求內(nèi)容...
其中狀態(tài)行包括了響應(yīng)碼,表示服務(wù)器的反饋狀態(tài):
狀態(tài)代碼有三位數(shù)字組成,第一個數(shù)字定義了響應(yīng)的類別,且有五種可能取值:
- 100~199:指示信息,表示請求已接收,繼續(xù)處理
- 200~299:請求成功,表示請求已被成功接收、理解、接受
- 300~399:重定向,要完成請求必須進(jìn)行更進(jìn)一步的操作
- 400~499:客戶端錯誤,請求有語法錯誤或請求無法實(shí)現(xiàn)
- 500~599:服務(wù)器端錯誤,服務(wù)器未能實(shí)現(xiàn)合法的請求
常見的狀態(tài)碼如下:
- 200 OK:客戶端請求成功
- 400 Bad Request:客戶端請求有語法錯誤,不能被服務(wù)器所理解
- 401 Unauthorized:請求未經(jīng)授權(quán),這個狀態(tài)代碼必須和WWW-Authenticate報頭域一起使用
- 403 Forbidden:服務(wù)器收到請求,但是拒絕提供服務(wù)
- 404 Not Found: 服務(wù)器找不到請求的網(wǎng)頁。
- 500 Internal Server Error:服務(wù)器發(fā)生不可預(yù)期的錯誤
- 503 Server Unavailable:服務(wù)器當(dāng)前不能處理客戶端的請求,一段時間后可能恢復(fù)正常
七、Http請求和響應(yīng)流程
在瀏覽器地址欄鍵入URL,按下回車之后會經(jīng)歷以下流程:
- 瀏覽器向 DNS 服務(wù)器請求解析該 URL 中的域名所對應(yīng)的 IP 地址;
- 解析出 IP 地址后,根據(jù)該 IP 地址和默認(rèn)端口 80,和服務(wù)器建立TCP連接;
- 瀏覽器發(fā)出讀取文件(URL 中域名后面部分對應(yīng)的文件)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數(shù)據(jù)發(fā)送給服務(wù)器;
- 服務(wù)器對瀏覽器請求作出響應(yīng),并把對應(yīng)的 html 文本發(fā)送給瀏覽器;
- 釋放 TCP連接;
- 瀏覽器收到該html文本并顯示內(nèi)容。
八、Https
HTTPS的全稱是Secure Hypertext Transfer Protocol(安全超文本傳輸協(xié)議),是在http協(xié)議基礎(chǔ)上增加了使用SSL加密傳送信息的協(xié)議。 即:HTTPS = HTTP + SSL。
http和https不同之處:
- HTTP 的 URL 以 http:// 開頭,而 HTTPS 的 URL 以 https:// 開頭。
- HTTP 是不安全的,而 HTTPS 是安全的。
- HTTP 標(biāo)準(zhǔn)端口是 80 ,而 HTTPS 的標(biāo)準(zhǔn)端口是 443。
- 在 OSI 網(wǎng)絡(luò)模型中,HTTP 工作于應(yīng)用層,而 HTTPS 工作在傳輸層。
- HTTP 無需加密,而 HTTPS 對傳輸?shù)臄?shù)據(jù)進(jìn)行加密。
- HTTP 無需證書,而 HTTPS 需要認(rèn)證證書。
Https的優(yōu)缺點(diǎn):
優(yōu)點(diǎn):
- 通過證書可以更信任服務(wù)器。
- 更安全,防篡改。
缺點(diǎn):
- https 需要證書。
- 因?yàn)閷鬏斶M(jìn)行加密,會一定程度增加cpu消耗。
- 由于https 要還密鑰和確認(rèn)加密算法的需要,所以首次建立連接會慢一些。
- 帶寬消耗會增加。
另外,再了解下SSL:
SSL證書是數(shù)字證書的一種,類似于駕駛證、護(hù)照和營業(yè)執(zhí)照的電子副本。因?yàn)榕渲迷诜?wù)器上,也稱為SSL服務(wù)器證書。SSL 證書就是遵守 SSL協(xié)議,由受信任的數(shù)字證書頒發(fā)機(jī)構(gòu)CA,在驗(yàn)證服務(wù)器身份后頒發(fā),具有服務(wù)器身份驗(yàn)證和數(shù)據(jù)傳輸加密功能。
SSL在https上的用處:
- 驗(yàn)證服務(wù)器端。
- 允許客戶端和服務(wù)器端選擇加密算法和密碼,確保雙方都支持。
- 驗(yàn)證客戶端(可選)。
- 使用公鑰加密技術(shù)來生成共享加密數(shù)據(jù)。
- 創(chuàng)建一個加密的 SSL 連接。
- 基于該 SSL 連接傳遞 HTTP 請求。
參考:
http://liuwangshu.cn/application/network/1-http.html
https://www.cnblogs.com/ranyonsue/p/5984001.html