天天看點

通路一個網頁的全過程正文總結

# 引言

打開浏覽器,在位址欄輸入URL,回車,出現網頁内容。整個過程發生了什麼?其中的原理是什麼?以下進行整理和總結。

整個過程可以概括為幾下幾個部分:

域名解析成IP位址;

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

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

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

正文

下面詳細介紹其中的原理:

1. 域名解析成IP位址

通路目标位址有兩種方式:

  ①使用目标IP位址通路。由于IP位址是一堆數字不友善記憶,于是有了域名這種字元型辨別。

  ②使用域名通路。域名解析就是域名到IP位址的轉換過程,域名的解析工作由DNS伺服器完成。

DNS域名解析時用的是UDP協定。整個域名解析的過程如下:

  1. 浏覽器向本機DNS子產品發出DNS請求,DNS子產品生成相關的DNS封包;
  2. DNS子產品将生成的DNS封包傳遞給傳輸層的UDP協定單元;
  3. UDP協定單元将該資料封裝成UDP資料報,傳遞給網絡層的IP協定單元;
  4. IP協定單元将該資料封裝成IP資料包,其目的IP位址為DNS伺服器的IP位址;
  5. 封裝好的IP資料包将傳遞給資料鍊路層的協定單元進行發送;
  6. 發送時在ARP緩存中查詢相關資料,如果沒有,就發送ARP廣播(包含待查詢的IP位址,收到廣播的主機檢查自己的IP,符合條件的主機将含有自己MAC位址的ARP包發送給ARP廣播的主機)請求,等待ARP回應;
  7. 得到ARP回應後,将IP位址與路由的下一跳MAC位址對應的資訊寫入ARP快取記錄;
  8. 寫入緩存後,以路由下一跳的位址填充目的MAC位址,以資料幀形式轉發;
  9. 轉發可能進行多次;
  10. DNS請求到達DNS伺服器的資料鍊路層協定單元;
  11. DNS伺服器的資料鍊路層協定單元解析資料幀,将内部的IP資料包傳遞給網絡層IP協定單元;
  12. DNS伺服器的IP協定單元解析IP資料包,将内部的UDP資料報傳遞給傳輸層UDP協定單元;
  13. DNS伺服器的UDP協定單元解析收到的UDP資料報,将内部的DNS封包傳遞給DNS服務單元;
  14. DNS服務單元将域名解析成對應IP位址,産生DNS回應封包;
  15. DNS回應封包->UDP->IP->MAC->我的主機;
  16. 我的主機收到資料幀,将資料幀->IP->UDP->浏覽器;
  17. 将域名解析結果以域名和IP位址對應的形式寫入DNS緩存表。
    通路一個網頁的全過程正文總結

與目的主機進行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通路過程)

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

  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請求由三部分組成,分别是:請求行、消息報頭、請求正文

請求行以一個方法符号開頭,以空格分開,後面跟着請求的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, eg:HTTP/1.1 200 OK (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 //伺服器目前不能處理用戶端的請求,一段時間後可能恢複正常

消息報頭

常用的請求報頭

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!” //可以看出伺服器對請求資源采用的是基本驗證機制。

HTTP協定詳解,可閱讀:添加連結描述http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

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

TCP連接配接釋放過程:

  1. 浏覽器向目的主機發出TCP連接配接結束請求封包,此時進入FIN WAIT狀态;
  2. 該封包FIN标志位設為1,表示結束請求;
  3. TCP結束請求封包通過IP(DNS)->MAC(ARP)->網關->目的主機;
  4. 目的主機收到資料幀,通過IP->TCP,TCP協定單元回應結束應答封包;
  5. 目前隻是進行回應,因為目的主機可能還有資料要傳,并不急着斷開連接配接;
  6. 該封包中ACK标志位設為1,表示收到結束請求;
  7. 目的資料發送完所有資料後,向我的主機發出TCP連接配接結束請求封包;
  8. 該封包FIN标志位設為1,表示結束請求;
  9. TCP結束請求封包通過IP(DNS)->MAC(ARP)->網關->我的主機;
  10. 我的主機收到資料幀,通過IP->TCP,TCP協定單元回應結束應答封包,此時進入TIME WAIT狀态,因為不相信網絡是可靠的,如果目的主機沒收到還可以重發;
  11. 該封包中的FIN标志位均設為1,表示結束應答;
  12. 該TCP回應封包通過IP(DNS)->MAC(ARP)->網關->目的主機;
  13. 目的主機關閉連接配接;
  14. TIME WAIT等待結束後,沒有收到回複,說明目的正常關閉了,我的主機也關閉連接配接。

總結

URL通路網站時的網絡傳輸全過程,可以歸納為:

  首先通過域名找到IP,如果緩存裡沒有就要請求DNS伺服器;得到IP後開始與目的主機進行三次握手來建立TCP連接配接;連接配接建立後進行HTTP通路,傳輸并擷取網頁内容;傳輸完後與目的主機四次揮手來斷開TCP連接配接。

繼續閱讀