Http請求報文結構
常用字段描述
請求行
請求行由方法字段、URL 字段 和HTTP 協議版本字段 3 個部分組成,他們之間使用空格隔開。常用的 HTTP 請求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT;
請求頭部
請求頭部由關鍵字/值對組成,每行一對,關鍵字和值用英文冒號“:”分隔。請求頭部通知服務器有關于客戶端請求的信息
典型的請求頭有:
Accept:用于告訴服務器,客戶機支持的數據類型
Accept-Charset:用于告訴服務器,客戶機所采用的編碼
Accept-Encoding:用于告訴服務器,客戶機支持的數據壓縮格式
Accept-Language:客戶機的語言環境
Host:客戶機通過這個頭告訴服務器,想訪問的主機名
If-Modified-Since:客戶機通過這個頭告訴服務器,資源的緩存時間
Referer:客戶機通過這個頭告訴服務器,它是從哪個資源來訪問服務器的(防盜鏈)
User-Agent:客戶機通過這個頭告訴服務器,客戶機的軟件環境
Cookie:客戶機通過這個頭可以向服務器帶數據
空行
最后一個請求頭之后是一個空行,發送回車符和換行符,通知服務器以下不再有請求頭;
請求包體
請求包體不在 GET 方法中使用,而是在POST 方法中使用。POST 方法適用于需要客戶填寫表單的場合。與請求包體相關的最常使用的是包體類型 Content-Type 和包體長度 Content-Length;
Http響應報文結構
常用字段描述
狀態行
狀態行由 HTTP 協議版本字段、狀態碼和狀態碼的描述文本 3 個部分組成,他們之間使用空格隔開;
狀態碼
由三位數字組成,第一位數字表示響應的類型,常用的狀態碼有五大類如下所示:
1xx:表示服務器已接收了客戶端請求,客戶端可繼續發送請求;
2xx:表示服務器已成功接收到請求并進行處理;
3xx:表示服務器要求客戶端重定向;
4xx:表示客戶端的請求有非法內容;
5xx:表示服務器未能正常處理客戶端的請求而出現意外錯誤;
響應頭部:
典型的響應頭部有:
Location:這個頭配合302狀態碼使用,用于告訴客戶找誰
Server:服務器通過這個頭,告訴瀏覽器服務器的類型
Content-Encoding:服務器通過這個頭,數據的壓縮格式
Content-Length:服務器通過這個頭,告訴瀏覽器回送數據的長度
Content-Type:服務器通過這個頭,告訴瀏覽器回送數據的類型
Last-Modified:服務器通過這個頭,告訴瀏覽器當前資源緩存時間
Refresh:服務器通過這個頭,告訴瀏覽器隔多長時間刷新一次
Content-Disposition:服務器通過這個頭,告訴瀏覽器以下載方式打開數據
Transfer-Encoding:服務器通過這個頭,告訴瀏覽器數據的傳送格式
ETag:…
Expires:服務器通過這個頭,告訴瀏覽器把回送的資源緩存多長時間,-1或0,則是不緩存
Cache-Control:no-cache
Pragma:no-cache 服務器通過以上兩個頭,也是控制瀏覽器不要緩存數據
響應包體
服務器返回給客戶端的文本信息;
簡述Http工作原理
HTTP 協議采用請求/響應模型。客戶端向服務器發送一個請求報文,服務器以一個狀態作為響應。
HTTP 請求/響應的步驟:
1.客戶端連接到web服務器:HTTP 客戶端與web服務器建立一個 TCP 連接;
2.客戶端向服務器發起 HTTP 請求:通過已建立的TCP 連接,客戶端向服務器發送一個請求報文;
3.服務器接收 HTTP 請求并返回 HTTP 響應:服務器解析請求,定位請求資源,服務器將資源副本寫到 TCP 連接,由客戶端讀取;
4.釋放 TCP 連接:若connection 模式為close,則服務器主動關閉TCP 連接,客戶端被動關閉連接,釋放TCP 連接;若connection 模式為keepalive,則該連接會保持一段時間,在該時間內可以繼續接收請求;
例如:在瀏覽器地址欄鍵入URL,按下回車之后會經歷以下流程:
1、瀏覽器向DNS 服務器請求解析該 URL 中的域名所對應的 IP 地址;
2、解析出 IP 地址后,根據該 IP 地址和默認端口 80,和服務器建立 TCP 連接;
3、瀏覽器發出讀取文件(URL 中域名后面部分對應的文件)的HTTP 請求,該請求報文作為 TCP 三次握手的第三個報文的數據發送給服務器;
4、服務器對瀏覽器請求作出響應,并把對應的 html 文本發送給瀏覽器;
5、釋放 TCP 連接;
6、瀏覽器將該 html 文本并顯示內容;
HTTP,HTTP2.0,SPDY,HTTPS區別
詳情可以參考這篇文章
HTTP1.0和HTTP1.1的一些區別
1. 緩存處理
在HTTP1.0中主要使用header里的If-Modified-Since,Expires來做為緩存判斷的標準,HTTP1.1則引入了更多的緩存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供選擇的緩存頭來控制緩存策略。
2. 帶寬優化及網絡連接的使用
HTTP1.0中,存在一些浪費帶寬的現象,例如客戶端只是需要某個對象的一部分,而服務器卻將整個對象送過來了,并且不支持斷點續傳功能,HTTP1.1則在請求頭引入了range頭域,它允許只請求資源的某個部分,即返回碼是206(Partial Content),這樣就方便了開發者自由的選擇以便于充分利用帶寬和連接。
3. 錯誤通知的管理
在HTTP1.1中新增了24個錯誤狀態響應碼,如409(Conflict)表示請求的資源與資源的當前狀態發生沖突;410(Gone)表示服務器上的某個資源被永久性的刪除。
4. Host頭處理
在HTTP1.0中認為每臺服務器都綁定一個唯一的IP地址,因此,請求消息中的URL并沒有傳遞主機名(hostname)。但隨著虛擬主機技術的發展,在一臺物理服務器上可以存在多個虛擬主機(Multi-homed Web Servers),并且它們共享一個IP地址。HTTP1.1的請求消息和響應消息都應支持Host頭域,且請求消息中如果沒有Host頭域會報告一個錯誤(400 Bad Request)。
5. 長連接
HTTP 1.1支持長連接(PersistentConnection)和請求的流水線(Pipelining)處理,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲,在HTTP1.1中默認開啟Connection: keep-alive,一定程度上彌補了HTTP1.0每次請求都要創建連接的缺點。
HTTPS與HTTP的一些區別
- HTTPS協議需要到ca申請證書
- HTTP是超文本傳輸協議,信息是明文傳輸,HTTPS 則是具有安全性的ssl加密傳輸協議。
- HTTP和HTTPS使用的是完全不同的連接方式,用的端口也不一樣,前者是80,后者是443。
- HTTPS的連接很簡單,HTTPS協議是由SSL+HTTP協議構建的可進行加密傳輸、身份認證的網絡協議,比http協議安全。
SPDY和HTTP2.0
SPDY
- 降低延遲,針對HTTP高延遲的問題,SPDY優雅的采取了多路復用(multiplexing)。多路復用通過多個請求stream共享一個tcp連接的方式
- 請求優先級(request prioritization)。多路復用帶來一個新的問題是,在連接共享的基礎之上有可能會導致關鍵請求被阻塞。SPDY允許給每個request設置優先級,這樣重要的請求就會優先得到響應。比如瀏覽器加載首頁,首頁的html內容應該優先展示,之后才是各種靜態資源文件,腳本文件等加載,這樣可以保證用戶能第一時間看到網頁內容。
- header壓縮。前面提到HTTP1.x的header很多時候都是重復多余的。選擇合適的壓縮算法可以減小包的大小和數量。
- 基于HTTPS的加密協議傳輸,提高了傳輸數據的可靠性。
- 服務端(server push),采用了SPDY的網頁,例如我的網頁有一個sytle.css的請求,在客戶端收到sytle.css數據的同時,服務端會將sytle.js的文件**給客戶端,當客戶端再次嘗試獲取sytle.js時就可以直接從緩存中獲取到,不用再發請求了.
HTTP2.0
HTTP2.0可以說是SPDY的升級版(其實原本也是基于SPDY設計的),但是,HTTP2.0 跟 SPDY 仍有不同的地方,主要是以下兩點:
? HTTP2.0 支持明文 HTTP 傳輸,而 SPDY 強制使用 HTTPS
? HTTP2.0 消息頭的壓縮算法采用 HPACK,而非 SPDY 采用的 DEFLATE
關于http1.1 和http2.0的詳細區別分析,可以參考這篇文章