咱們知道目前不少應用系統中的內容傳輸協議採用的HTTP協議,所以無論你是前端人員、後端人員、運維人員,甚至是管理人員,都須要掌握HTTP知識!!前端
該版本只有一個命令GET;沒有HEADER等描述數據的信息; 服務器發送完畢,就關閉TCP鏈接。web
該版本增長了不少命令;增長status code 和header;多字符集支持、多部分發送、權限、緩存等。算法
HTTP/1.1後端
該版本增長了持久鏈接、Pipeline,增長host和其餘一些命令。持久鏈接會在HTTP特性中介紹;若是沒有pipeline,那麼Web服務器就須要串行處理請求,而有了pipeline,Web服務器就並行處理請求;而增長host實現了一臺物理設備能夠運行多個web服務。跨域
全部數據以二進制傳輸,以前版本使用字符串進行傳輸;同一個鏈接 裏面發送多個請求再也不須要按照順序來;頭信息壓縮以及推送等提升效率的功能。瀏覽器
爲何要三次握手?由於網絡是有可能延遲的,當客戶端沒有收到服務端的確認包,若是沒有第三次握手,那麼服務端不知道上次傳輸是否是被客戶端正常接收了,若是沒有接收,服務端的這個端口也是打開的,這就比較浪費資源。緩存
HTTP報文分爲請求報文和響應報文,請求報文和響應報文分爲起始行、首部(header)和主體(body),請求報文的首部包括三部分,分別是HTTP方法、資源目錄和協議,而響應報文的首部包括協議版本、狀態碼和狀態嗎對應的意思,好比200狀態的意思是ok。須要注意的是:HTTP header和HTTP body之間以一行分隔。服務器
HTTP方法定義對資源的操做,經常使用的有GET、POST等,這就就不詳細展開了。cookie
HTTP Code用於定義服務器對請求的處理結果,各個區間的code有不用的語義。1xx 表示信息響應類,表示接收到請求而且繼續處理;2xx 表示成功;3xx 表示重定向;4xx 表示客戶端出錯;5xx 表示服務器出錯。網絡
同源策略,也就是說當兩個請求的URL的協議、host和端口都相同的狀況下,咱們才認爲這兩個請求是同域的即同源,而只要協議、host和端口只要有一項是不一樣的,咱們就認爲是不一樣源的,即跨域,例如:
http://www.mukedada.com:80
http://www.mukedada.com:8080
上述兩個請求就是跨域請求。須要注意的是跨域請求不是說瀏覽器限制了發起跨站請求,瀏覽器只是將返回結果攔截下來,最好的例子就是CSRF跨站腳本攻擊。若是咱們想讓瀏覽器放行返回結果,則經過如下方法:
服務端設置Access-Control-Allow-Origin參數爲容許,例如'Access-Control-Allow-Origin' : '*'
<link>
、<img>
和<script>
三標籤中的請求是容許跨域的,這也是JSONP的跨域作法。
對於靜態資源,好比說image、js等,它們是不會常常方式變動的,並且它們的容量比較大,若是咱們每次訪問都要從服務器從獲取相應數據,那麼性能就會變得比較差,所以HTTP協議定義一些和緩存相關的參數。
可緩存性,表示在哪些地方能夠緩存,好比說客戶端瀏覽器、代理服務器等,它有三個經常使用的參數:public、private、no-cache。public 代表響應能夠被任何對象緩存,包括髮送請求的客戶端瀏覽器、代理服務器等等;private 表示響應只能被單個用戶緩存,不能做爲共享緩存,即代理服務器不能緩存它;no-cache代表強制全部緩存了該響應的緩存用戶,在使用已存儲的緩存以前,發送帶驗證器的請求到源始服務器。
到期,max-age=,設置緩存存儲的最大週期,超過這個時間緩存就被認爲過時。s-maxage= 它的做用域僅在共享緩存(好比各個代理)。max-stale= 代表客戶端願意接收一個已過時的資源。
驗證,must-revalidate,緩存必須在使用以前驗證舊資源的狀態,而且不可以使用過時資源。proxy-revalidate,與must-revalidate做用相同,但它僅適用於共享緩存(例如代理),並被私有緩存忽略。
其餘。no-store,客戶端和代理服務器不存儲任何緩存,而是直接從服務器獲取內容。no-transform:不得對資源進行轉換或轉變。Content-Encoding, Content-Range, Content-Type等HTTP頭不能由代理修改。例如,非透明代理能夠對圖像格式進行轉換,以便節省緩存空間或者減小緩慢鏈路上的流量。 no-transform指令不容許這樣作。
服務端經過Set-Cookie將相關數據保存到瀏覽器中,而這些相關數據就是Cookie,那麼,下次在同域的請求中就會帶上這些Cookie,Cookie是鍵值對,能夠設置多個。Cookie中經過max-age和expires設置過時時間,Secure值在https的時候發送,HttpOnly沒法經過document.cookie訪問。具體能夠參考Session 和 Cookie。
在Cache Control中咱們介紹當設置no-cache參數時,代表每次請求都要到服務器驗證,驗證結果代表能夠讀取本地緩存才能夠從本地讀取緩存。只有到數據發生修改時,咱們才須要從服務端讀取最新數據,不然從本地讀取緩存。此時,判斷數據是否發生修改就變得尤其重要,一般咱們採用Last-Modfied和Etag兩個驗證頭來驗證數據是否發生修改。其中Last-Modifed 一般配合If-Modified-Since或者If-UnModified-Since使用,而Etag 一般配合If-Match或者If-Non-Match使用。爲了幫助你們理解,我舉一個栗子。假設咱們訪問mudedada.com返回頭信息包含:
Last-Modified:888
Etag:123
下一次訪問mukedada.com的請求頭中就會包含:
If-Modified-Since:888
If-Non-Match:123
服務器會比較請求頭中的Last-Modified、Etag 和服務器中的對應值是否相同,若是不相同則從新獲取,不然從本地緩存中獲取。
咱們知道一個HTTP須要建立一個TCP鏈接,完成以後就關閉TCP鏈接,這個成本比較高(由於建立一個TCP鏈接須要經過三次握手),因此在HTTP/1.1開始支持長鏈接,請求頭標識是Connection:keep-alive。以下圖所示,同一個Connection ID表示同一個鏈接。須要注意的是同一個鏈接只能是同域請求。
數據協商指的是客戶端向服務端發送請求時,客戶端會聲明它但願服務端返回個格式是什麼?服務端根據客戶端的聲明來判斷返回什麼要的數據。其中客戶端經過Accept、Accept-Encoding等參數進行設置,而服務端經過Content-Type等參數進行設置。
客戶端相關參數:
Accept指定返回數據類型;
Accept-Encoding指定服務端的數據壓縮方式,目前服務端的壓縮算法有gzip, deflate, br等;
Accept-Language指定返回數據的語言,例如 Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,其中q表示的是權重,也就是說瀏覽器更但願服務器返回的是中文;
User-Agent表示瀏覽器的相關信息,它能區分是移動端瀏覽器仍是PC端瀏覽器,從而返回特定的頁面。
服務端相關參數:
Content-Type指的是服務端返回的數據類型;
Content-Encoding對應客戶端的Accept-Encoding,指的是數據壓縮方式;
Content-Language服務端語言。