天天看點

Http請求全過程簡述Http整個流程:

用戶端擷取URL - > DNS解析 - > TCP連接配接 - >發送HTTP請求 - >伺服器處理請求 - >傳回封包 - >浏覽器解析渲染頁面 - > TCP斷開連接配接

一、 DNS解析

什麼是DNS解析?當使用者輸入一個網址并按下Enter鍵的時候,浏覽器得到了一個域名。而在實際通信過程中,我們需要的是一個IP位址。是以我們需要先把域名轉換成相應的IP位址,這個過程稱作DNS解析。

浏覽器首先搜尋浏覽器自身緩存的DNS記錄。

或許很多人不知道,浏覽器自身也帶有一層DNS緩存。Chrome 緩存1000條DNS解析結果,緩存時間大概在一分鐘左右。

(Chrome浏覽器通過輸入:chrome://net-internals/#dns 打開DNS緩存頁面)

如果浏覽器緩存中沒有找到需要的記錄或記錄已經過期,則搜尋hosts檔案和作業系統緩存。

在Windows作業系統中,可以通過 ipconfig /displaydns 指令檢視本機目前的緩存。

通過hosts檔案,你可以手動指定一個域名和其對應的IP解析結果,并且該結果一旦被使用,同樣會被緩存到作業系統緩存中。

Windows系統的hosts檔案在%systemroot%\system32\drivers\etc下,linux系統的hosts檔案在/etc/hosts下。

3) 如果在hosts檔案和作業系統緩存中沒有找到需要的記錄或記錄已經過期,則向域名解析伺服器發送解析請求。

其實第一台被通路的域名解析伺服器就是我們平時在設定中填寫的DNS伺服器一項,當作業系統緩存中也沒有命中的時候,系統會向DNS伺服器正式發出解析請求。這裡是真正意義上開始解析一個未知的域名。

一般一台域名解析伺服器會被地理位置臨近的大量使用者使用(特别是ISP的DNS),一般常見的網站域名解析都能在這裡命中。

4) 如果域名解析伺服器也沒有該域名的記錄,則開始遞歸+疊代解析。

這裡我們舉個例子,如果我們要解析的是mail.google.com。

首先我們的域名解析伺服器會向根域伺服器(全球隻有13台)送出請求。顯然,僅憑13台伺服器不可能把全球所有IP都記錄下來。是以根域伺服器記錄的是com域伺服器的IP、cn域伺服器的IP、org域伺服器的IP……。如果我們要查找.com結尾的域名,那麼我們可以到com域伺服器去進一步解析。是以其實這部分的域名解析過程是一個樹形的搜尋過程。

Http請求全過程簡述Http整個流程:

根域伺服器告訴我們com域伺服器的IP。

接着我們的域名解析伺服器會向com域伺服器送出請求。根域伺服器并沒有mail.google.com的IP,但是卻有google.com域伺服器的IP。

接着我們的域名解析伺服器會向google.com域伺服器送出請求。…

如此重複,直到獲得mail.google.com的IP位址。

為什麼是遞歸:問題由一開始的本機要解析mail.google.com變成域名解析伺服器要解析mail.google.com,這是遞歸。

為什麼是疊代:問題由向根域伺服器送出請求變成向com域伺服器送出請求再變成向google.com域送出請求,這是疊代。

5) 擷取域名對應的IP後,一步步向上傳回,直到傳回給浏覽器。

Http請求全過程簡述Http整個流程:

二、TCP連接配接

與目的主機進行TCP連接配接(三次握手)

向目的主機發送TCP連接配接請求封包;

  1. 該TCP封包中SYN标志位設為1,表示連接配接請求;
  2. 該TCP封包通過IP(DNS)->MAC(ARP)->網關->目的主機;
  3. 目的主機收到資料幀,通過IP->TCP,TCP協定單元回應請求應答封包;
  4. 該封包中SYN和ACK标志設為1,表示連接配接請求應答;
  5. 該TCP封包通過IP(DNS)->MAC(ARP)->網關->我的主機;
  6. 我的主機收到資料幀,通過IP->TCP,TCP協定單元回應請求确認封包;
  7. 該TCP封包通過IP(DNS)->MAC(ARP)->網關->目的主機;
  8. 目的主機收到資料幀,通過IP->TCP,連接配接建立完成。
Http請求全過程簡述Http整個流程:

發送與收取資料(浏覽器與目的主機開始HTTP通路過程)

隻有建立連接配接後才能開始傳輸資料。

  1. 浏覽器向域名發出GET方法封包(HTTP請求);
  2. 該GET方法封包通過TCP->IP(DNS)->MAC(ARP)->網關->目的主機;
  3. 目的主機收到資料幀,通過IP->TCP->HTTP,HTTP協定單元會回應HTTP協定格式封裝好的HTML形式資料(HTTP響應);[ 從請求資訊中獲得客戶機想通路的主機名。從請求資訊中擷取客戶機想要通路的web應用(web應用程式指提供浏覽器通路的程式,簡稱web應用)。從請求資訊中擷取客戶機要通路的web資源。(web資源,即各種檔案,圖檔,視訊,文本等)讀取相應的主機下的web應用,web資源。用讀取到的web資源資料,建立一個HTTP響應。]
  4. 該HTML資料通過TCP->IP(DNS)->MAC(ARP)->網關->我的主機;
  5. 我的主機收到資料幀,通過IP->TCP->HTTP->浏覽器,浏覽器以網頁形式顯示HTML内容。

三、發送Http請求

隻有建立連接配接後才能開始傳輸資料。

  1. 浏覽器向域名發出GET方法封包(HTTP請求);
  2. 該GET方法封包通過TCP->IP(DNS)->MAC(ARP)->網關->目的主機;
  3. 目的主機收到資料幀,通過IP->TCP->HTTP,HTTP協定單元會回應HTTP協定格式封裝好的HTML形式資料(HTTP響應);[ 從請求資訊中獲得客戶機想通路的主機名。從請求資訊中擷取客戶機想要通路的web應用(web應用程式指提供浏覽器通路的程式,簡稱web應用)。從請求資訊中擷取客戶機要通路的web資源。(web資源,即各種檔案,圖檔,視訊,文本等)讀取相應的主機下的web應用,web資源。用讀取到的web資源資料,建立一個HTTP響應。]
  4. 該HTML資料通過TCP->IP(DNS)->MAC(ARP)->網關->我的主機;
  5. 我的主機收到資料幀,通過IP->TCP->HTTP->浏覽器,浏覽器以網頁形式顯示HTML内容。

HTTP協定

HTTP請求:http請求由三部分組成,分别是:請求行、消息報頭、請求正文

請求行以一個方法符号開頭,以空格分開,後面跟着請求的URI和協定的版本,格式如下:Method Request-URI HTTP-Version CRLF  

其中 Method表示請求方法;Request-URI是一個統一資源辨別符;HTTP-Version表示請求的HTTP協定版本;CRLF表示回車和換行(除了作為結尾的CRLF外,不允許出現單獨的CR或LF字元)。

請求方法(所有方法全為大寫)有多種,各個方法的解釋如下:

  • GET     請求擷取Request-URI所辨別的資源
  • POST    在Request-URI所辨別的資源後附加新的資料
  • HEAD    請求擷取由Request-URI所辨別的資源的響應消息報頭
  • PUT     請求伺服器存儲一個資源,并用Request-URI作為其辨別
  • DELETE  請求伺服器删除Request-URI所辨別的資源
  • TRACE   請求伺服器回送收到的請求資訊,主要用于測試或診斷
  • CONNECT 保留将來使用
  • OPTIONS 請求查詢伺服器的性能,或者查詢與資源相關的選項和需求

HTTP響應也是由三個部分組成,分别是:狀态行、消息報頭、響應正文

狀态行格式如下:HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示伺服器HTTP協定的版本;Status-Code表示伺服器發回的響應狀态代碼;Reason-Phrase表示狀态代碼的文本描述。

狀态代碼有三位數字組成,第一個數字定義了響應的類别,且有五種可能取值:

  • 1xx:訓示資訊--表示請求已接收,繼續處理
  • 2xx:成功--表示請求已被成功接收、了解、接受
  • 3xx:重定向--要完成請求必須進行更進一步的操作
  • 4xx:用戶端錯誤--請求有文法錯誤或請求無法實作
  • 5xx:伺服器端錯誤--伺服器未能實作合法的請求

常見狀态代碼、狀态描述、說明:

  • 200 OK      //用戶端請求成功
  • 400 Bad Request  //用戶端請求有文法錯誤,不能被伺服器所了解
  • 401 Unauthorized //請求未經授權,這個狀态代碼必須和WWW-Authenticate報頭域一起使用 
  • 403 Forbidden  //伺服器收到請求,但是拒絕提供服務
  • 404 Not Found  //請求資源不存在,eg:輸入了錯誤的URL
  • 500 Internal Server Error //伺服器發生不可預期的錯誤
  • 503 Server Unavailable  //伺服器目前不能處理用戶端的請求,一段時間後可能恢複正常

eg:HTTP/1.1 200 OK (CRLF)

消息報頭:

常用的請求報頭

Accept

Accept請求報頭域用于指定用戶端接受哪些類型的資訊。eg:Accept:image/gif,表明用戶端希望接受GIF圖象格式的資源;Accept:text/html,表明用戶端希望接受html文本。

Accept-Charset

Accept-Charset請求報頭域用于指定用戶端接受的字元集。eg:Accept-Charset:iso-8859-1,gb2312.如果在請求消息中沒有設定這個域,預設是任何字元集都可以接受。

Accept-Encoding

Accept-Encoding請求報頭域類似于Accept,但是它是用于指定可接受的内容編碼。eg:Accept-Encoding:gzip.deflate.如果請求消息中沒有設定這個域伺服器假定用戶端對各種内容編碼都可以接受。

Accept-Language

Accept-Language請求報頭域類似于Accept,但是它是用于指定一種自然語言。eg:Accept-Language:zh-cn.如果請求消息中沒有設定這個報頭域,伺服器假定用戶端對各種語言都可以接受。

Authorization

Authorization請求報頭域主要用于證明用戶端有權檢視某個資源。當浏覽器通路一個頁面時,如果收到伺服器的響應代碼為401(未授權),可以發送一個包含Authorization請求報頭域的請求,要求伺服器對其進行驗證。

Host(發送請求時,該報頭域是必需的)

Host請求報頭域主要用于指定被請求資源的Internet主機和端口号,它通常從HTTP URL中提取出來的,eg:

我們在浏覽器中輸入:http://www.guet.edu.cn/index.html

浏覽器發送的請求消息中,就會包含Host請求報頭域,如下:

Host:www.guet.edu.cn

此處使用預設端口号80,若指定了端口号,則變成:Host:www.guet.edu.cn:指定端口号

User-Agent

User-Agent請求報頭域允許用戶端将它的作業系統、浏覽器和其它屬性告訴伺服器。這個報頭域不是必需的。

常用的響應報頭

Location

Location響應報頭域用于重定向接受者到一個新的位置。Location響應報頭域常用在更換域名的時候。

Server

Server響應報頭域包含了伺服器用來處理請求的軟體資訊。與User-Agent請求報頭域是相對應的。下面是

Server響應報頭域的一個例子:

Server:Apache-Coyote/1.1

WWW-Authenticate

WWW-Authenticate響應報頭域必須被包含在401(未授權的)響應消息中,用戶端收到401響應消息時候,并發送Authorization報頭域請求伺服器對其進行驗證時,服務端響應報頭就包含該報頭域。

eg:WWW-Authenticate:Basic realm="Basic Auth Test!"  //可以看出伺服器對請求資源采用的是基本驗證機制。

四、TCP斷開連接配接

與目的主機斷開TCP連接配接(四次揮手)

TCP連接配接釋放過程:

浏覽器向目的主機發出TCP連接配接結束請求封包,此時進入FIN WAIT狀态;

該封包FIN标志位設為1,表示結束請求;

TCP結束請求封包通過IP(DNS)->MAC(ARP)->網關->目的主機;

目的主機收到資料幀,通過IP->TCP,TCP協定單元回應結束應答封包;

目前隻是進行回應,因為目的主機可能還有資料要傳,并不急着斷開連接配接;

該封包中ACK标志位設為1,表示收到結束請求;

目的資料發送完所有資料後,向我的主機發出TCP連接配接結束請求封包;

該封包FIN标志位設為1,表示結束請求;

TCP結束請求封包通過IP(DNS)->MAC(ARP)->網關->我的主機;

我的主機收到資料幀,通過IP->TCP,TCP協定單元回應結束應答封包,此時進入TIME WAIT狀态,因為不相信網絡是可靠的,如果目的主機沒收到還可以重發;

該封包中的FIN标志位均設為1,表示結束應答;

該TCP回應封包通過IP(DNS)->MAC(ARP)->網關->目的主機;

目的主機關閉連接配接;

TIME WAIT等待結束後,沒有收到回複,說明目的正常關閉了,我的主機也關閉連接配接。

Http整個流程:

Http請求全過程簡述Http整個流程:

以上文章片段原創來源于以下幾個部落格文章:

https://blog.csdn.net/g291976422/article/details/88984859

https://blog.csdn.net/qq_40085084/article/details/81220631

https://blog.csdn.net/u012862311/article/details/78753232

繼續閱讀