1. 程式人生 > >http的一些知識點

http的一些知識點

HTTP(HyperText Transfer Protocol)是一套計算機通過網路進行通訊的規則。 HTTPS是在HTTP基礎上加了SSL,以安全為目標的HTTP通道,簡單講是HTTP的安全版。  HTTP報文分為請求報文和響應報文,都由請求(響應)行、請求(響應)頭和請求(響應)請求正文組成。  HTTP請求報文  當瀏覽器向Web伺服器發出請求時,它向伺服器傳遞了一個數據塊,也就是請求資訊,HTTP請求資訊由3部分組成:

  • 請求行:包含了請求方法 URI協議/版本
  • 請求頭(Request Header) :請求頭包含許多有關的客戶端環境和請求正文的有用資訊
  • 請求正文

下面是一個HTTP請求的例子:

GET/sample.jspHTTP/1.1         ---------------------------------請求行 Accept:image/gif.image/jpeg,*/*                            -------- Accept-Language:zh-cn Connection:Keep-Alive                                          請求頭 Host:localhost User-Agent:Mozila/4.0(compatible;MSIE5.01;Window NT5.0) Accept-Encoding:gzip,deflate                               --------

username=jinqiao&password=1234   -----------------------------請求正文

上面這個例子是get方法的請求報文,get請求也是HTTP預設的請求方法,但其實請求方式有很多種,比如post 、delete 、put等,但是我們常用的也就只有get方式和post方式,那麼我們來比較一下他們之間的區別:  GET和POST的區別:

1、從功能上來講,GET請求一般用來獲取資料,POST請求用來提交資料 2、GET請求將引數拼接到URL上,而POST請求將引數放到請求主體中 3、GET請求的URL會有長度限制(是由於瀏覽器位址列輸入框對於URL有長度限制),而POST 可以傳輸很多資料(POST請求也有長度限制,這是由於為了伺服器安全和穩定瀏覽器會對 Content-length進行限制)。 4、相對來說,POST要比GET安全 HTTP響應報文  HTTP響應報文與HTTP請求相似,HTTP響應也由3個部分構成,分別是:

  • 響應行:包含協議狀態版本程式碼描述
  • 響應頭(Response Header)
  • 響應正文

下面是一個HTTP響應的例子:

HTTP/1.1 200 OK                           ----------------------響應行 Server:Apache Tomcat/5.0.12                               ---------- Date:Mon,6Oct2003 13:23:42 GMT                                 響應頭 Content-Length:112                                        ----------

<html>                                    --------------------響應正文 <head> <title>HTTP響應示例<title> </head> <body> Hello HTTP! </body> </html>

http響應碼

HTTP響應碼響應碼由三位十進位制數字組成,它們出現在由HTTP伺服器傳送的響應的第一行。  響應碼分五種型別,由它們的第一位數字表示:

1XX-資訊類(Information),表示收到Web瀏覽器請求,正在進一步的處理中 2XX-成功類(Successful),表示使用者請求被正確接收,理解和處理例如:200 OK 3XX-重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。 4XX-客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found 意味著請求中所引用的文件不存在。 5XX-伺服器錯誤(Server Error)表示伺服器不能完成對請求的處理:如 500 常用的狀態碼

200   伺服器成功返回內容 301/2 臨時/永久重定向 304   資源未被修改過,重定向到瀏覽器快取 404   請求內容不存在 403   (Forbidden/禁止) 500   伺服器暫時不可用 503   伺服器內部錯誤

具體含義如下:

http頭部資訊

通常HTTP訊息包括客戶機向伺服器的請求訊息和伺服器向客戶機的響應訊息。

從上圖可以看到,頭部資訊包括三部分:

1、通用頭部

2、請求頭部

3、響應頭部

4、查詢字串引數

1、通用頭部 通用頭域包含請求和響應訊息都支援的頭域。

Request URL:請求的URL地址
Request Method: 請求方法,get/post/put/……
Status Code:狀態碼,200 為請求成功
Remote Address:路由地址

2、請求頭部      

1) Accept:  告訴WEB伺服器自己接受什麼介質型別,*/* 表示任何型別,type/* 表示該型別下的所有子型別;
2)Accept-Charset:  瀏覽器申明自己接收的字符集
  Accept-Encoding:瀏覽器申明自己接收的編碼方法,通常指定壓縮方法,是否支援壓縮,
  支援什麼壓縮方法  (gzip,deflate)
3)Accept-Language:  瀏覽器申明自己接收的語言。語言跟字符集的區別:
   中文是語言,中文有多種字符集,比如big5,gb2312,gbk等等。
4)Authorization:  當客戶端接收到來自WEB伺服器的 WWW-Authenticate 響應時,
   該頭部來回應自己的身份驗證資訊給WEB伺服器。
5)Connection:表示是否需要持久連線。close(告訴WEB伺服器或者代理伺服器,
    在完成本次請求的響應後,斷開連線,
     不要等待本次連線的後續請求了)。keep-alive(告訴WEB伺服器或者代理伺服器,
    在完成本次請求的響應後,保持連線,等待本次連線的後續請求)。
6)Referer:傳送請求頁面URL。瀏覽器向 WEB 伺服器表明自己是從哪個 網頁/URL 獲得/點選 
   當前請求中的網址/URL。
7)User-Agent: 瀏覽器表明自己的身份(是哪種瀏覽器)。
8)Host: 傳送請求頁面所在域。
9)Cache-Control:瀏覽器應遵循的快取機制。
   no-cache(不要快取的實體,要求現在從WEB伺服器去取)
   max-age:(只接受 Age 值小於 max-age 值,並且沒有過期的物件) 
   max-stale:(可以接受過去的物件,但是過期時間必須小於 max-stale 值)  
   min-fresh:(接受其新鮮生命期大於其當前 Age 跟 min-fresh 值之和的快取物件)
10)Pramga:主要使用 Pramga: no-cache,相當於 Cache-Control: no-cache。
11)Range:瀏覽器(比如 Flashget 多執行緒下載時)告訴 WEB 伺服器自己想取物件的哪部分。
12)Form:一種請求頭標,給定控制使用者代理的人工使用者的電子郵件地址。
13)Cookie:這是最重要的請求頭資訊之一

3、響應頭部    

1)Age:當代理伺服器用自己快取的實體去響應請求時,用該頭部表明該實體從產生到現在經過多長時間了。
2)Accept-Ranges:WEB伺服器表明自己是否接受獲取其某個實體的一部分(比如檔案的一部分)的請求。
   bytes:表示接受,none:表示不接受。
3) Cache-Control:伺服器應遵循的快取機制。
    public(可以用 Cached 內容迴應任何使用者)
    private(只能用快取內容迴應先前請求該內容的那個使用者)
    no-cache(可以快取,但是隻有在跟WEB伺服器驗證了其有效後,才能返回給客戶端) 
    max-age:(本響應包含的物件的過期時間)  
    ALL:  no-store(不允許快取)  
4) Connection: 是否需要持久連線
    close(連線已經關閉)。
    keepalive(連線保持著,在等待本次連線的後續請求)。
    Keep-Alive:如果瀏覽器請求保持連線,則該頭部表明希望 WEB 伺服器保持連線多長時間(秒)。
    例如:Keep-Alive:300
5)Content-Encoding:WEB伺服器表明自己使用了什麼壓縮方法(gzip,deflate)壓縮響應中的物件。 
    例如:Content-Encoding:gzip 
6)Content-Language:WEB 伺服器告訴瀏覽器自己響應的物件的語言。
7)Content-Length:WEB 伺服器告訴瀏覽器自己響應的物件的長度。
    例如:Content-Length: 26012
8)Content-Range:WEB 伺服器表明該響應包含的部分物件為整個物件的哪個部分。
    例如:Content-Range: bytes 21010-47021/47022
9)Content-Type:WEB 伺服器告訴瀏覽器自己響應的物件的型別。
    例如:Content-Type:application/xml
10)Expired:WEB伺服器表明該實體將在什麼時候過期,對於過期了的物件,
    只有在跟WEB伺服器驗證了其有效性後,才能用來響應客戶請求。
11) Last-Modified:WEB 伺服器認為物件的最後修改時間,比如檔案的最後修改時間
   ,動態頁面的最後產生時間等等。
12) Location:WEB 伺服器告訴瀏覽器,試圖訪問的物件已經被移到別的位置了,
    到該頭部指定的位置去取。
13)Proxy-Authenticate: 代理伺服器響應瀏覽器,要求其提供代理身份驗證資訊。
14)Server: WEB 伺服器表明自己是什麼軟體及版本等資訊。
15)Refresh:表示瀏覽器應該在多少時間之後重新整理文件,以秒計。

http頭部關於快取的欄位

HTTP控制快取的欄位主要包括Cache-Control/Pragma,Expires,Last-Modified/Etag

Cache-Control/Pragma

這個HTTP Head欄位用於指定所有快取機制在整個請求/響應鏈中必須服從的指令,如果知道該頁面是否為快取,不僅可以控制瀏覽器,還可以控制和HTTP相關的快取或代理伺服器。它可以指定下列可選值:     1、Public:所有內容都將被快取,在響應頭中設定     2、Private:內容只快取在私有快取中,在響應頭中設定     3、no-cache:所有內容都不會被快取,在請求頭和響應頭中設定     4、no-store:所有內容都不會被快取在快取或Internet臨時檔案中,在響應頭中設定     5、must-revalidation/proxy-revalidation:如果快取的內容失效,請求必須傳送到服務  器/代理以進行重新驗證,在請求頭中設定     6、max-age=xxx:快取的內容將在xxx秒後失效,這個選項只在HTTP1.1中可用,和Last-Modified一起使用時優先順序較高,在響應頭中設定

    Cache-Control請求欄位可以被個瀏覽器很好的支援,而且優先順序也比較高,它和其他一些請求欄位(如Expires)同時使用時,Cache-Control會覆蓋其他欄位

    Pragma欄位的作用和Cache-Control類似,最常用的Pragma:no-cache,他和Cache-cache的作用是一致的。

Expires

Expires通常的使用格式是Expires:Sat,25 Feb 2012 12:22:17 GMT,後面跟著一個日期和時間,超過這個時間後,快取的內容將失效,瀏覽器在傳送請求之前檢查這個頁面的欄位,看該頁面是否已經過期了,如果過期,就向服務端重新發起請求。 

 Last-Modified/Etag

 Last-Modified欄位一般用於表示一個伺服器上的資源的最後修改時間,資源可以是靜態資源,也可以是動態內容,通過這個最後修改時間可以判斷當前請求的資源是否是最新的。     一般服務端會在響應頭中返回一個Last-Modified欄位,告訴瀏覽器這個頁面的最後修改時間,如Last-Modified:Sat, 25 Feb 2012 12:55:04 GMT,瀏覽器再次請求時在請求頭中增加If-Modified-Since:Sat, 25 Feb 2012 12:55:04 GMT欄位,詢問當前快取的頁面是否是最新。如果是最新的就返回304,告訴瀏覽器是最新的,伺服器也不會傳輸最新的資料     Etag欄位的作用和LastModified欄位作用相同,這個欄位的作用是讓服務端給每個頁面分配一個唯一的編號,然後通過這個編號來區分當前頁面是否最新。這種方式比較靈活,但是當後端的伺服器有多臺時比較難以處理。  

HTTP1.0 HTTP 1.1 HTTP 2.0主要區別

HTTP1.0 HTTP 1.1主要區別

長連線 HTTP 1.0需要使用keep-alive引數來告知伺服器端要建立一個長連線,而HTTP1.1預設支援長連線。

HTTP是基於TCP/IP協議的,建立一個TCP連線是需要經過三次握手的,有一定的開銷,如果每次通訊都要重新建立連線的話,對效能有影響。因此最好能維持一個長連線,可以用個長連線來發多個請求。

節約頻寬 HTTP 1.1支援只發送header資訊(不帶任何body資訊),如果伺服器認為客戶端有許可權請求伺服器,則返回100,否則返回401。客戶端如果接受到100,才開始把請求body傳送到伺服器。

這樣當伺服器返回401的時候,客戶端就可以不用傳送請求body了,節約了頻寬。

另外HTTP還支援傳送內容的一部分。這樣當客戶端已經有一部分的資源後,只需要跟伺服器請求另外的部分資源即可。這是支援檔案斷點續傳的基礎。

HOST域 現在可以web server例如tomat,設定虛擬站點是非常常見的,也即是說,web server上的多個虛擬站點可以共享同一個ip和埠。

HTTP1.0是沒有host域的,HTTP1.1才支援這個引數。

HTTP1.1 HTTP 2.0主要區別

多路複用 HTTP2.0使用了多路複用的技術,做到同一個連線併發處理多個請求,而且併發請求的數量比HTTP1.1大了好幾個數量級。

當然HTTP1.1也可以多建立幾個TCP連線,來支援處理更多併發的請求,但是建立TCP連線本身也是有開銷的。

TCP連線有一個預熱和保護的過程,先檢查資料是否傳送成功,一旦成功過,則慢慢加大傳輸速度。因此對應瞬時併發的連線,伺服器的響應就會變慢。所以最好能使用一個建立好的連線,並且這個連線可以支援瞬時併發的請求。

關於多路複用,可以參看學習NIO 。

資料壓縮 HTTP1.1不支援header資料的壓縮,HTTP2.0使用HPACK演算法對header的資料進行壓縮,這樣資料體積小了,在網路上傳輸就會更快。

伺服器推送 意思是說,當我們對支援HTTP2.0的web server請求資料的時候,伺服器會順便把一些客戶端需要的資源一起推送到客戶端,免得客戶端再次建立連線傳送請求到伺服器端獲取。這種方式非常合適載入靜態資源。

伺服器端推送的這些資源其實存在客戶端的某處地方,客戶端直接從本地載入這些資源就可以了,不用走網路,速度自然是快很多的。