1. HTTP協(xié)議簡(jiǎn)介
HTTP全稱超文本傳輸協(xié)議(HTTP,HyperText Transfer Protocol),是互聯(lián)網(wǎng)上應(yīng)用最為廣泛的一種網(wǎng)絡(luò)協(xié)議。所有的WWW文件都必須遵守這個(gè)標(biāo)準(zhǔn)。
HTTP是應(yīng)用層網(wǎng)絡(luò)協(xié)議,在最上層,HTTP通常承載與TCP/IP協(xié)議之上,有時(shí)也承載于TLS或SSL協(xié)議層之上,這就成了我們常說(shuō)的HTTPS。
HTTP是一個(gè)應(yīng)用層協(xié)議,由請(qǐng)求和響應(yīng)構(gòu)成,是一個(gè)標(biāo)準(zhǔn)的客戶端服務(wù)器模型。HTTP是一個(gè)無(wú)狀態(tài)的協(xié)議。
HTTP默認(rèn)的端口號(hào)為80,HTTPS的端口號(hào)為443。
HTTP是基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等),簡(jiǎn)單的說(shuō),HTTP會(huì)把數(shù)據(jù)以流的形式傳給TCP層,TCP把數(shù)據(jù)切成一小段一小段的數(shù)據(jù)塊,有次序的傳遞給IP層(服務(wù)器IP地址就在此處),IP層可以按照順序一塊塊接收數(shù)據(jù)組合起來(lái)就到后端服務(wù)器了。

2. HTTP協(xié)議工作流程
1. 用戶在瀏覽器中輸入一個(gè)url,或者點(diǎn)擊一個(gè)網(wǎng)址或者用請(qǐng)求工具發(fā)送一次請(qǐng)求
2.?瀏覽器根據(jù)URL中的域名,通過(guò)DNS解析出目標(biāo)網(wǎng)頁(yè)的IP地址;然后將上面結(jié)合本機(jī)自己的信息,封裝成一個(gè)http請(qǐng)求數(shù)據(jù)包
? ?DNS服務(wù)器解析域名,先在本地緩存中查找域名對(duì)應(yīng)IP,沒(méi)找到之后再DNS服務(wù)器上找
3.?在HTTP開始工作前,客戶端首先會(huì)通過(guò)TCP/IP協(xié)議來(lái)和服務(wù)端建立鏈接(TCP三次握手)
4. 建立連接后,客戶機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符、客戶機(jī)信息和內(nèi)容。
5.?服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息,其格式為一個(gè)狀態(tài)行,包括信息的協(xié)議版本號(hào)、一個(gè)成功或錯(cuò)誤的代碼,后邊是MIME信息包括服務(wù)器信息、實(shí)體信息和內(nèi)容。
6.?一般情況下,一旦Web服務(wù)器向?yàn)g覽器發(fā)送了請(qǐng)求數(shù)據(jù),它就要關(guān)閉TCP連接,然后如果瀏覽器或者服務(wù)器在其頭信息加入了這行代碼:Connection:keep-alive,TCP連接在發(fā)送后將仍然保持打開狀態(tài),于是,瀏覽器可以繼續(xù)通過(guò)相同的連接發(fā)送請(qǐng)求。保持連接節(jié)省了為每個(gè)請(qǐng)求建立新連接所需的時(shí)間,還節(jié)約了網(wǎng)絡(luò)帶寬。
? ? 詳細(xì)過(guò)程:

3. HTTP 請(qǐng)求報(bào)文
由3大部分組成:請(qǐng)求行、請(qǐng)求頭、請(qǐng)求體,響應(yīng)同樣的3大部分。如下圖:
請(qǐng)求行 - 通用信息頭 - 請(qǐng)求頭 - 實(shí)體頭 - 報(bào)文主體
狀態(tài)行 - 通用信息頭 - 響應(yīng)頭 - 實(shí)體頭 - 報(bào)文主體

以下示例:



? ??響應(yīng)行
? ? (HTTP/1.1)表明HTTP版本為1.1版本,狀態(tài)碼為200,狀態(tài)消息為(ok)
響應(yīng)頭
? ? Date:生成響應(yīng)的日期和時(shí)間;
? ? Content-Type:指定了MIME類型的HTML(text/html),編碼類型是ISO-8859-1
響應(yīng)體

以上是請(qǐng)求和響應(yīng)的報(bào)文結(jié)構(gòu)。
HTTP另外一個(gè)重點(diǎn)在于請(qǐng)求頭的一些字段,和一些響應(yīng)嗎代表的狀態(tài)
1xx? 代表information 信息屬性狀態(tài)碼
2xx? 代表success ,具體如下
200:?( OK 客戶端發(fā)過(guò)來(lái)的數(shù)據(jù)被正常處理 )
204:? (?Not Content 正常響應(yīng),沒(méi)有實(shí)體? )
206: ( Partial Content 范圍請(qǐng)求,返回部分?jǐn)?shù)據(jù),響應(yīng)報(bào)文中由Content-Range指定實(shí)體內(nèi)容 )
3xx? 代表重定向,具體如下:
301: (Moved Permanently) 永久重定向
302: (Found) 臨時(shí)重定向,規(guī)范要求,方法名不變,但是都會(huì)改變
303: (See Other) 和302類似,但必須用GET方法
304: (Not Modified) 狀態(tài)未改變, 配合(If-Match、If-Modified-Since、If-None_Match、If-Range、If-Unmodified-Since)
307: (Temporary Redirect) 臨時(shí)重定向,不該改變請(qǐng)求方法
4xx: 代表客戶端錯(cuò)誤,具體如下:
400:(Bad Request) 請(qǐng)求報(bào)文語(yǔ)法錯(cuò)誤
401 :(unauthorized) 需要認(rèn)證
403:(Forbidden) 服務(wù)器拒絕訪問(wèn)對(duì)應(yīng)的資源
404:(Not Found) 服務(wù)器上無(wú)法找到資源
5xx:服務(wù)端錯(cuò)誤,具體:
500:(Internal Server Error)服務(wù)器故障
503:(Service Unavailable) 服務(wù)器處于超負(fù)載或正在停機(jī)維護(hù)
首部字段列表
1.? 通用首部字段:
Cache-Control : 控制緩存行為。
Connection : 連接的管理。
Date : 報(bào)文日期。
Pragma:報(bào)文指令。
Trailer:報(bào)文尾部的首部。
Trasfer-Encoding:制定報(bào)文主題的傳輸編碼方式。
Upgrade:升級(jí)為其他協(xié)議。
Via:代理服務(wù)信息。
Warning:錯(cuò)誤通知。
2.請(qǐng)求首部字段
Accept:用戶代理可以處理的媒體類型。
Accept-Charset:優(yōu)先的字符集。
Accept-Encoding:優(yōu)先的編碼。
Accept-Langulage:優(yōu)先的語(yǔ)言。
Authorization:Web認(rèn)證信息。
Expect:期待服務(wù)器的特定行為。
From:用戶的電子郵箱地址。
Host:請(qǐng)求資源所在的服務(wù)器。
if-Match:比較實(shí)體標(biāo)記。
if-Modified-Since:比較資源的更新時(shí)間
If-Range:資源未更新時(shí)發(fā)送實(shí)體Byte的范圍請(qǐng)求。
Max-Forwards:最大傳輸跳數(shù)。
Proxy-Authorization:代理服務(wù)器需要客戶端認(rèn)證。
Range:實(shí)體字節(jié)范圍請(qǐng)求。
Referer:請(qǐng)求中的URI的原始獲取方。
TE:傳輸編碼的優(yōu)先級(jí)。
User-Agent:HTTP客戶端程序的信息。
3 響應(yīng)首部字段
Accept-Ranges:是否接受字節(jié)范圍。
Age:資源的創(chuàng)建時(shí)間。
ETag:資源的匹配信息。
Location:客戶端重定向至指定的URI。
Proxy-Authenticate:代理服務(wù)器對(duì)客戶端的認(rèn)證信息。
Retry-After:再次發(fā)送請(qǐng)求的時(shí)機(jī)。
Server:服務(wù)器的信息。
Vary:代理服務(wù)器緩存的管理信息。
www-Authenticate:服務(wù)器對(duì)客戶端的認(rèn)證。
4. 實(shí)體首部字段
Allow:資源可支持的HTTP方法。
Content-Encoding : 實(shí)體的編碼方式。
Content-Language : 實(shí)體的自然語(yǔ)言。
Content-length : 實(shí)體的內(nèi)容大小。
Content-location: 替代對(duì)應(yīng)資源的url。
Content-MD5 : 實(shí)體的報(bào)文摘要。
Conten-range : 實(shí)體主體的位置范圍。
Content-Type : 實(shí)主體的媒體類型。
Expires : 實(shí)體過(guò)期時(shí)間。
Last-Modified :資源的最后修改時(shí)間。