1. 程式人生 > >訪問一個網頁的全過程

訪問一個網頁的全過程

http訪問過程 個數 開始 image 整理 author ng- 技術分享 所有

引言

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

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

  1. 域名解析成IP地址;
  2. 與目的主機進行TCP連接(三次握手);
  3. 發送與收取數據(瀏覽器與目的主機開始HTTP訪問過程);
  4. 與目的主機斷開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請求: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!" //可以看出服務器對請求資源采用的是基本驗證機制。

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連接。

訪問一個網頁的全過程