Http協議簡介
上一節講解的Socket套接字,它是基於網絡層的TCP、UDP協議的Socket編程接口,它是做用於網絡層,基於端到端的包發送。(它是對TCP/IP的封裝,供程序員作網絡開發所用的接口)javascript
Http協議則是創建於網絡層之上的應用層,它採用Socket編程接口並使用面向鏈接的TCP協議。css
Http是轎車,提供了封裝或者顯示數據的具體形式;Socket則是發動機,提供網絡通訊的能力html
HTTP包格式
http包格式,主要分爲三個部分。請求行,首部,實體,以下圖java
請求行
主要有方法、url、版本。程序員
url:就是瀏覽器的請求地址,例如百度的urlhttp://www.baidu.com編程
方法:有GET、POST、PUT、DELETE四種json
GET:顧名思義,get翻譯爲獲取.就是向服務端獲取資源瀏覽器
POST:向服務端提交數據緩存
PUT:向服務端傳送文本信息等服務器
DELETE:刪除資源
版本:如今的Http協議基本都是1.1 它是串行式的,在響應效率方面相對較低。
新的版本2.0,它是採用並行式。例如一個html頁面,它能夠並行的加載html、js、css。效率顯著提高
首部
首部的信息主要以鍵值對key-value的方式存在,例如:
content-type:text/html; 或application/javascript; 或application/json;他們分別表示返回的文本類型
Connetcion:keep-alive 保持鏈接
Accept-CharSet:utf-8 客戶端接收的文本編碼爲utf-8
Cache-Controller:控制緩存。當值爲max-age=0時,表示不使用緩存直接請求服務端資源。而當max-age不爲0時則資源的緩存時間數值與該值比較,小於就直接使用緩存。 另外If-Modifed-Since也是一個關於緩存的,若是說服務端的資源更新了那客戶端就得從新獲取資源,而沒有變動的話則會返回狀態碼304 Not Modified,客戶端直接加載緩存這樣節省了必定的帶寬
.....
這樣加上實體信息,應用層該乾的事情基本完成,接下來就要把包發給傳輸層.怎麼發給傳輸層呢?無非就是調用Socket,只不過瀏覽器這個程序已經幫你封裝好了
Http請求的發送
HTTP 是基於 TCP 協議的,因此它使用面向鏈接的方式發送請求,經過 stream 二進制流的方式傳給對方。固然,到了 TCP 層,它會把二進制流變成一個的報文段發送給服務器。
在發送給每一個報文段的時候,都須要對方有一個迴應 ACK,來保證報文可靠地到達了對方。若是沒有迴應,那麼 TCP 這一層會進行從新傳輸,直到能夠到達。同一個包有可能被傳了好屢次,可是 HTTP 這一層不須要知道這一點,由於是 TCP 這一層在埋頭苦幹。
HTTP 返回的構建
HTTP 的返回報文也是有必定格式的。這也是基於 HTTP 1.1 的。
狀態行
狀態碼爲200則爲成功、404爲找不到資源、500服務器異常
首部
content-type:指定返回的類型.究竟是一個HTML仍是JSON
HTTP2.0
HTTP目前最新的版本是2.0、它與1.1版本最大的不一樣是解決1.1串行化的問題
在1.1版本中,全部的http請求都是串行加載的,在應用層以純文本的形式進行通訊.每次通訊都要帶完整的 HTTP 的頭。例如請求一個頁面會出發多個HTTP請求:加載html文本、css樣式文本、js腳本。它都是一個個進行的,加載完這個再進行下一個的加載,
而在2.0版本中,它對Request header(請求頭)進行壓縮,他不會每次請求都在請求頭攜帶大量的key-value,而是在兩端創建對應內容的索引,這樣在相同請求頭的請求中只需加上內容索引就OK。
而且2.0是採用並行的方式同時加載html文本、js等文件。HTTP 2.0 協議將一個 TCP 的鏈接中,切分紅多個流,每一個流都有本身獨立的 ID,而且把請求分紅Header幀和Data幀.每一個幀都有請求的惟一標識(ID).這樣只要哪一個請求加載完畢便傳給應用程序。這樣大大提升了頁面的加載響應效率
HTTP 2.0 還將全部的傳輸信息分割爲更小的消息和幀,並對它們採用二進制格式編碼。常見的幀有Header 幀,用於傳輸 Header 內容,而且會開啓一個新的流。再就是Data 幀,用來傳輸正文實體。多個 Data 幀屬於同一個流。