趣談網絡協議(十四):HTTP協議

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 幀屬於同一個流。

相關文章
相關標籤/搜索