1. 程式人生 > >HTTP請求頭部+響應碼

HTTP請求頭部+響應碼

本篇博文主要介紹HTTP請求-響應的系列過程,包括四個部分,是在陸續學習中覺著之間有關聯總結下來的,以便自己今後忘記後可以快速檢視也為各位看到這篇文章的朋友們梳理一下知識。下面,正文開始:

作為一個前端開發人員,我們每天都在與頁面打交道,那麼,當你輸入一個網址的時候,實際究竟會發生什麼呢?下面,就先來解答一下這個問題。

一、當在瀏覽器輸入一個網址後,實際會發生什麼?

回答之前,先摘一段《淘寶技術這十年》中的“你剛才在淘寶上買了一件東西”裡的一段話,對我理解這個問題有啟發。

你發現快過年了,於是想給你的女朋友買一件毛衣,你打開了 www.taobao.com,這時你的瀏覽器首先查詢DNS伺服器,將
www.taobao.com轉換成IP地址。但是,你首先會發現,在不同的地區或者不同的網路下,轉換後的IP地址很可能是不一樣的,這首先涉及負載均衡的第一步,通過DNS解析域名時,將你的訪問分配的不同的入口,同時儘可能的保證你所訪問的入口時所有入口中較快的一個。
你通過這個入口成功的訪問了www.taobao.com實際的入口IP地址,……經過一系列的複雜的邏輯運算和資料處理,用於給你看的淘寶首頁HTML內容便生成了,瀏覽器下一步會載入頁面中用到的CSS /JS/圖片等樣式、指令碼和資原始檔。

扯遠一點,我平時喜歡看書,各種書都看,文學類的居多,最近也在看產品類的設計類的和技術類的,多看書生活愉快,哈哈。

那麼,輸入網址後,實際發生了什麼呢?過程如下:

1、輸入網址。

2、瀏覽器查詢域名的IP地址。

 導航的第一步是通過訪問的域名找出其IP地址。DNS查詢過程如下:
  • 瀏覽器快取 – 瀏覽器會快取DNS記錄一段時間。 有趣的是,作業系統沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存個自固定的一個時間(2分鐘到30分鐘不等)。
  • 系統快取 – 如果在瀏覽器快取裡沒有找到需要的記錄,瀏覽器會做一個系統呼叫(windows裡是gethostbyname)。這樣便可獲得系統快取中的記錄。
  • 路由器快取 – 接著,前面的查詢請求發向路由器,它一般會有自己的DNS快取。
  • ISP DNS 快取 – 接下來要check的就是ISP快取DNS的伺服器。在這一般都能找到相應的快取記錄。

3. 瀏覽器給web伺服器傳送一個HTTP請求

4. 網站服務的永久重定向響應

伺服器給瀏覽器響應一個301永久重定向響應,為什麼伺服器一定要重定向而不是直接發會使用者想看的網頁內容呢?其中一個原因跟搜尋引擎排名有關。如果一個頁面有兩個地址,就像http://www.igoro.com/
http://igoro.com/,搜尋引擎會認為它們是兩個網站,結果造成每一個的搜尋連結都減少從而降低排名。而搜尋引擎知道301永久重定向是什麼意思,這樣就會把訪問帶www的和不帶www的地址歸到同一個網站排名下。還有一個是用不同的地址會造成快取友好性變差。當一個頁面有好幾個名字時,它可能會在快取裡出現好幾次。

5. 瀏覽器跟蹤重定向地址

   現在,瀏覽器知道了要訪問的正確地址,所以它會發送另一個獲取請求。請求頭部一般包括:
   Accept
   Accept-language
   Accept-Encoding
   Connection
   User-Agent
   Cookie
   Host

6. 伺服器“處理”請求

伺服器接收到獲取請求,然後處理並返回一個響應。

7. 伺服器發回一個HTML響應

8. 瀏覽器開始顯示HTML

9. 瀏覽器傳送請求,以獲取嵌入在HTML中的物件

在瀏覽器顯示HTML時,它會注意到需要獲取其他地址內容的標籤。這時,瀏覽器會發送一個獲取請求來重新獲得這些檔案。這些檔案就包括CSS/JS/圖片等資源,這些資源的地址都要經歷一個和HTML讀取類似的過程。所以瀏覽器會在DNS中查詢這些域名,傳送請求,重定向等等…

10. 瀏覽器傳送非同步(AJAX)請求

二、三次握手的過程

這個問題,最初接觸,是在本科學習計算機網路的時候,當時學什麼TCP/IP,各種層,但是,學的不如忘得快啊,很多東西,還是需要常常的使用和回顧才行。
如下圖,建立連線要三次握手,釋放連線要四次握手,下面具體介紹一下:
這裡寫圖片描述

需要說明的資訊:

ACK : TCP協議規定,只有ACK=1時有效,也規定連線建立後所有傳送的報文的ACK必須為1
SYN(SYNchronization) : 在連線建立時用來同步序號。當SYN=1而ACK=0時,表明這是一個連線請求報文。對方若同意建立連線,則應在響應報文中使SYN=1和ACK=1. 因此, SYN置1就表示這是一個連線請求或連線接受報文。
FIN (finis):完,終結的意思, 用來釋放一個連線。當 FIN = 1 時,表明此報文段的傳送方的資料已經發送完畢,並要求釋放連線。

這裡寫圖片描述

三次握手,兩次確認。
首先由Client發出請求連線,即 SYN=1 ACK=0, TCP規定SYN=1時不能攜帶資料,但要消耗一個序號,因此宣告自己的序號是 seq=x
然後 Server 進行回覆確認,即 SYN=1 ACK=1 seq=y, ack=x+1,
再然後 Client 再進行一次確認,但不用SYN 了,這時即為 ACK=1, seq=x+1, ack=y+1.然後連線建立。為什麼要進行三次握手,兩次確認呢?我用我自己的理解來說。

考慮一種情況,A傳送了一個連線請求,但是這個請求因為某種原因而滯留了,一直延誤到連線釋放後才到達B,而B收到連線請求後,就會發送確認資訊,同意建立連線,如果不存在第三次握手的話,這個連線就成功了。而這是一個失效的連線請求,A不會向B傳送資料,這樣B的資源就會白白浪費了,因為B一直在等待A傳送資料。
連線釋放:四次握手
這裡寫圖片描述

當客戶A 沒有東西要傳送時就要釋放 A 這邊的連線,A會發送一個報文(沒有資料),其中 FIN 設定為1, 伺服器B收到後會給應用程式一個信,這時A那邊的連線已經關閉,即A不再發送資訊(但仍可接收資訊)。 A收到B的確認後進入等待狀態,等待B請求釋放連線, B資料傳送完成後就向A請求連線釋放,也是用FIN=1 表示, 並且用 ack = u+1(如圖), A收到後回覆一個確認資訊,並進入 TIME_WAIT 狀態, 等待 2MSL 時間。
當客戶端A沒有資料要傳送時,就要釋放A的連線,A會發送一個FIN報文,然後主動關閉連線(不再發送資訊但仍然可以接收資訊)。伺服器B收到FIN報文後,會給應用程式通訊,並向A傳送一個確認報文。A收到B的確認後進入等待狀態,等待B請求釋放連線。 B的資料傳送完後,會向A傳送FIN報文,請求釋放連線。A收到後會回覆一個確認資訊,然後進入TIME_WAIT狀態。

以上就是7次握手。

三、HTTP頭部資訊

說實話,這個部分是已經工作了的師姐讓我面試前一定要準備一下的問題,說面試官會問道,所以就係統的學習了一下,現在總結如下:

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

登入到CSDN後,隨便點了一個資源,看看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響應碼響應碼由三位十進位制數字組成,它們出現在由HTTP伺服器傳送的響應的第一行。
響應碼分五種型別,由它們的第一位數字表示:
1xx:資訊,請求收到,繼續處理
2xx:成功,行為被成功地接受、理解和採納
3xx:重定向,為了完成請求,必須進一步執行的動作
4xx:客戶端錯誤,請求包含語法錯誤或者請求無法實現
5xx:伺服器錯誤,伺服器不能實現一種明顯無效的請求
具體含義如下:
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述