HTTP協議簡介

現在web發展如火如荼,web開發人員也越來越多,但有幾個對支持web的http協議有了解呢?底層協議基礎不紮實,高層應用是很難做到極致的。帶着好奇心,開始學習吧!

HTTP(Hypertext Transfer Protocol),即超文本傳輸協議,是瀏覽器和服務器之間互相通訊的一種約定,通過互聯網傳送萬維網文檔的數據傳送協議。HTTP協議建立在TCP協議之上,是一種應用層協議。

HTTP協議通訊的雙方分爲服務端(服務器)和客戶端(瀏覽器),通訊由客戶端發起,步驟如下:①客戶端建立到服務端的TCP連接;②客戶端向客戶端發送請求信息;③服務端向客戶端返回響應信息。簡單說,HTTP協議就是請求信息和響應信息所採用的格式約定。

請求信息

Method URI VERSION<CR><LF>
ATTRIBUTE1: VALUE1<CR><LF>
ATTRIBUTE2: VALUE2<CR><LF>
<CR><LF>
BODY
如上圖,客戶端向服務端發出的請求信息包括:請求行,請求頭,空行還有可選的消息體。請求行和請求頭必須以<CR><LF>結尾,空行只包含<CR><LF>,不能有其他任何字符。其中請求行由請求方法,請求URI,和協議版本組成。例如GET / HTTP/1.0表示用GET方法請求URI爲/(根)的資源,協議版本採用HTTP/1.0。請求頭是一些屬性和值組成,例如Host: www.baidu.com表示屬性Host的值是www.baidu.com。順便提一下,這個屬性明確了要訪問哪一個主機。在同一臺服務器的同一端口可能運行多個web服務器實例,可以用域名(如www.baidu.com)進行區分。
下面是一個最簡單的例子,按照字符串表示慣例,用\r表示<CR>,用\n表示<LF>:
GET / HTTP/1.0\r\n
Host: www.baidu.com\r\n
\r\n
第一行是請求行,GET是請求方法,/是URI,HTTP/1.0表明所採用的協議版本;第二行是請求頭,Host這個屬性的值是www.baidu.com,表明要訪問的服務器名;第三行是一個空行;沒有可選的消息體。

響應信息

VERSION STATUS-CODE REASON<CR><LF>
ATTRIBUTE1: VALUE1<CR><LF>
ATTRIBUTE2: VALUE2<CR><LF>
<CR><LF>
BODY
客戶端向服務器發出一個請求,服務器對此進行響應,響應內容包括:狀態行,響應頭,消息體,如上圖。第一行爲狀態行,說明請求是成功了還是失敗了,包括協議版本,狀態碼和原因描述。接下來是響應頭,可以有多行,指定每個屬性的值。接下來是一個空行。空行之後是消息體(內容)。
下面是一個簡化的例子:
HTTP/1.0 200 OK\r\n
Content-Type: text/html; charset=utf-8\r\n
\r\n
<html><head><title>xxx</title></head></html>

例子

下面用Python請求百度首頁爲例子進行說明:
>>> import socket
>>> # 客戶端創建一個TCP套接字用於通訊
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>>
>>> # 客戶端建立到百度服務器的連接,這裏直接採用百度域名
>>> # Python會根據域名幫我們查詢對應的百度服務器IP
>>> s.connect(('www.baidu.com', 80))
>>>
>>> # 客戶端通過TCP向百度服務器發送HTTP請求
>>> s.send('GET / HTTP/1.0\r\nHost: www.baidu.com\r\n\r\n')
39
>>> # 客戶端接收百度服務器的響應,...表示省略一部分HTML文本
>>> s.recv(102400)
'HTTP/1.1 200 OK\r\nDate: Mon, 14 Apr 2014 11:36:23 GMT\r\nContent-Type: text/html; charset=utf-8\r\nConnection: Close\r\nVary: Accept-Encoding\r\nSet-Cookie: BAIDUID=D806458AF8AC5D0C86B1C35680DA5D03:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com\r\nSet-Cookie: BDSVRTM=0; path=/\r\nSet-Cookie: H_PS_PSSID=5696_1445_6053_4759_6018_5857_5918; path=/; domain=.baidu.com\r\nP3P: CP=" OTI DSP COR IVA OUR IND COM "\r\nCache-Control: private\r\nExpires: Mon, 14 Apr 2014 11:35:27 GMT\r\nX-Powered-By: HPHP\r\nServer: BWS/1.1\r\nBDPAGETYPE: 1\r\nBDQID: 0xd7e142f70001fb1d\r\nBDUSERID: 0\r\n\r\n<!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="content-type" content="text/html;charset=utf-8"><link rel="dns-prefetch" href="//s1.bdstatic.com"/><link rel="dns-prefetch" href="//t1.baidu.com"/>...'

可見請求是成功的:HTTP/1.1是協議版本,200是狀態碼(正常);響應頭有多個,其中Content-Type: text/html; charset=utf-8表明該文檔是一個html文本,編碼採用utf-8;空行之後是消息體,也就是文檔內容。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章