1. 程式人生 > >瀏覽器就會加載出主頁步驟

瀏覽器就會加載出主頁步驟

						<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
						<h2 id="前言"><a name="t0"></a>前言</h2>

當我們在瀏覽器中輸入一個網址,比如www.google.cn,瀏覽器就會加載出百度的主頁。那麼瀏覽器背後完成的具體是怎麼樣的呢?
總結起來大概的流程是這樣的:
(1)瀏覽器本身是一個客戶端,當你輸入URL的時候,首先瀏覽器會去請求DNS伺服器,通過DNS獲取相應的域名對應的IP
(2)然後通過IP地址找到IP對應的伺服器後,要求建立TCP連線
(3)瀏覽器傳送完HTTP Request(請求)包後,伺服器接收到請求包之後才開始處理請求包
(4)在伺服器收到請求之後,伺服器呼叫自身服務,返回HTTP Response(響應)包
(5)客戶端收到來自伺服器的響應後開始渲染這個Response包裡的主體(body),等收到全部的內容隨後斷開與該伺服器之間的TCP連線。
就可以用下面的這幅圖來進行解釋
網址訪問流程

1. DNS解析

在瀏覽器中輸入的是一個網址,是不能直接用來進行連線的,因而就要使用DNS地址解析將輸入的URL網址轉換為IP地址。查詢的流程圖是這樣的
DNS地址解析流程
具體的查詢過程和策略可以分為下面這幾步:
(1)在瀏覽器中輸入www.google.cn域名,作業系統會先檢查自己本地的hosts檔案是否有這個網址對映關係,如果有,就先呼叫這個IP地址對映,完成域名解析。
(2)如果hosts裡沒有這個域名的對映,則查詢本地DNS解析器快取,是否有這個網址對映關係,如果有,直接返回,完成域名解析。
(3)如果hosts與本地DNS解析器快取都沒有相應的網址對映關係,首先會找TCP/IP引數中設定的首選DNS伺服器

,在此我們叫它本地DNS伺服器,此伺服器收到查詢時,如果要查詢的域名,包含在本地配置區域資源中,則返回解析結果給客戶機,完成域名解析,此解析具有權威性。
(4)如果要查詢的域名,不由本地DNS伺服器區域解析,但該伺服器已快取了此網址對映關係,則呼叫這個IP地址對映,完成域名解析,此解析不具有權威性。
(5)如果本地DNS伺服器本地區域檔案與快取解析都失效,則根據本地DNS伺服器的設定(是否設定轉發器)進行查詢,如果未用轉發模式,本地DNS就把請求發至13臺根DNS,根DNS伺服器收到請求後會判斷這個域名(.com)是誰來授權管理,並會返回一個負責該頂級域名伺服器的一個IP。本地DNS伺服器收到IP資訊後,將會聯絡負責.com域的這臺伺服器。這臺負責.com域的伺服器收到請求後,如果自己無法解析,它就會找一個管理.com域的下一級DNS伺服器地址(google.com)給本地DNS伺服器。當本地DNS伺服器收到這個地址後,就會找google.com域伺服器,重複上面的動作,進行查詢,直至找到www.google.com主機。
(6)如果用的是轉發模式,此DNS伺服器就會把請求轉發至上一級DNS伺服器,由上一級伺服器進行解析
,上一級伺服器如果不能解析,或找根DNS或把轉請求轉至上上級,以此迴圈。不管是本地DNS伺服器用是是轉發,還是根提示,最後都是把結果返回給本地DNS伺服器,由此DNS伺服器再返回給客戶機。

2. Socket建立連線

當我們輸入這樣一個請求時,首先要建立一個socket連線,因為socket是通過ip和埠建立的,所以之前還有一個DNS解析過程,把www.google.com變成ip,如果url裡不包含埠號,則會使用該協議的預設埠號。

3. 傳送HTTP請求

連線成功建立後,開始向web伺服器傳送請求,當瀏覽器向Web伺服器發出請求時,它向伺服器傳遞了一個數據塊,也就是請求資訊,HTTP請求資訊由3部分組成:
(1)請求方法URI協議/版本
(2)請求頭(Request Header)
(3)請求正文
下面是一個HTTP請求的例子:

GET /sample.jsp HTTP/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
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3.1 請求方法URI協議/版本

請求的第一行是“方法URL議/版本”:GET/sample.jsp HTTP/1.1``
以上程式碼中“GET”代表請求方法,
/sample.jsp表示URI,HTTP/1.1“`代表協議和協議的版本。
根據HTTP標準,HTTP請求可以使用多種請求方法。例如:HTTP1.1支援7種請求方法:GET、POST、HEAD、OPTIONS、PUT、DELETE和TARCE。在Internet應用中,最常用的方法是GET和POST。
URL完整地指定了要訪問的網路資源,通常只要給出相對於伺服器的根目錄的相對目錄即可,因此總是以“/”開頭,最後,協議版本聲明瞭通訊過程中使用HTTP的版本。

3.2 請求頭(Request Header)

請求頭包含許多有關的客戶端環境和請求正文的有用資訊。例如,請求頭可以宣告瀏覽器所用的語言,請求正文的長度等。

Accept:image/gif.image/jpeg.*/*
Accept-Language:zh-cn
Connection:Keep-Alive
Host:localhost
User-Agent:Mozila/4.0(compatible:MSIE5.01:Windows NT5.0)
Accept-Encoding:gzip,deflate.
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

3.3 請求正文

請求頭和請求正文之間是一個空行,這個行非常重要,它表示請求頭已經結束,接下來的是請求正文。請求正文中可以包含客戶提交的查詢字串資訊:

username=jinqiao&password=1234
  
  • 1

在以上的例子的HTTP請求中,請求的正文只有一行內容。當然,在實際應用中,HTTP請求正文可以包含更多的內容。

3.4 HTTP請求方法:GET方法與POST方法

3.4.1 GET方法

GET方法是預設的HTTP請求方法,我們日常用GET方法來提交表單資料,然而用GET方法提交的表單資料只經過了簡單的編碼,同時它將作為URL的一部分向Web伺服器傳送,因此,如果使用GET方法來提交表單資料就存在著安全隱患上。例如
Http://127.0.0.1/login.jsp?Name=zhangshi&Age=30&Submit=%cc%E+%BD%BB
從上面的URL請求中,很容易就可以辯認出表單提交的內容。(?之後的內容)另外由於GET方法提交的資料是作為URL請求的一部分所以提交的資料量不能太大

3.4.2 POST方法

POST方法是GET方法的一個替代方法,它主要是向Web伺服器提交表單資料,尤其是大批量的資料。POST方法克服了GET方法的一些缺點。通過POST方法提交表單資料時,資料不是作為URL請求的一部分而是作為標準資料傳送給Web伺服器,這就克服了GET方法中的資訊無法保密和資料量太小的缺點。因此,出於安全的考慮以及對使用者隱私的尊重,通常表單提交時採用POST方法。

3.5 各種HTTP請求的含義

GET
通過請求URI得到資源
POST
用於新增新的內容
PUT
用於修改某個內容
DELETE
刪除某個內容
CONNECT
用於代理進行傳輸,如使用SSL
OPTIONS
詢問可以執行哪些方法
PATCH
部分文件更改
PROPFIND
檢視屬性
PROPPATCH
設定屬性
MKCOL
建立集合(資料夾)
COPY
拷貝
MOVE
移動
LOCK
加鎖
UNLOCK
解鎖
TRACE
用於遠端診斷伺服器
HEAD
類似於GET, 但是不返回body資訊,用於檢查物件是否存在,以及得到物件的元資料

4. 伺服器響應

應答 web伺服器收到這個請求,進行處理。從它的文件空間中搜索子目錄mydir的檔案index.html。如果找到該檔案,Web伺服器把該檔案內容傳送給相應的Web瀏覽器。為了告知瀏覽器,Web伺服器首先傳送一些HTTP頭資訊,然後傳送具體內容(即HTTP體資訊),HTTP頭資訊和HTTP體資訊之間用一個空行分開。

4.1 HTTP響應報文頭

HTTP應答與HTTP請求相似,HTTP響應也由3個部分構成,分別是:
(1)協議狀態版本程式碼描述
(2)響應頭(Response Header)
(3)響應正文
下面是一個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>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

協議狀態程式碼描述HTTP響應的第一行類似於HTTP請求的第一行,它表示通訊所用的協議是HTTP1.1伺服器已經成功的處理了客戶端發出的請求(200表示成功):
HTTP/1.1 200 OK
響應頭(Response Header)響應頭也和請求頭一樣包含許多有用的資訊,例如伺服器型別、日期時間、內容型別和長度等:

Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112
  
  • 1
  • 2
  • 3
  • 4
  • 5

響應正文響應正文就是伺服器返回的HTML頁面:

<html>
    <head>
        <title>HTTP響應示例<title>
    </head>
    <body>
        Hello HTTP!
    </body>
</html>
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

響應頭和正文之間也必須用空行分隔。

4.2 HTTP應答碼

HTTP應答碼也稱為狀態碼,它反映了Web伺服器處理HTTP請求狀態。HTTP應答碼由3位數字構成,其中首位數字定義了應答碼的型別
1XX-資訊類(Information),表示收到Web瀏覽器請求,正在進一步的處理中
2XX-成功類(Successful),表示使用者請求被正確接收,理解和處理例如:200 OK
3XX - 重定向類(Redirection),表示請求沒有成功,客戶必須採取進一步的動作。
4XX - 客戶端錯誤(Client Error),表示客戶端提交的請求有錯誤 例如:404 NOT Found,意味著請求中所引用的文件不存在。
5XX - 伺服器錯誤(Server Error)表示伺服器不能完成對請求的處理:如 500
對於我們Web開發人員來說掌握HTTP應答碼有助於提高Web應用程式除錯的效率和準確性。

5. 關閉連線

當應答結束後,Web瀏覽器與Web伺服器必須斷開,以保證其它Web瀏覽器能夠與Web伺服器建立連線。