當我們在瀏覽器中輸入了乙個url位址(如www.cnblogs.com),從等待到頁面顯示的過程中,後台究竟發生了什麼處理呢?
一. 解析網域名稱位址為ip位址
瀏覽器dns快取:以chrome為例,在瀏覽器視窗中輸入chrome://net-internals/#dns,就可以檢視當前瀏覽器dns快取記錄,chrome的dns快取過期時間還是比較短的,大約為1分鐘。
本地網域名稱伺服器:在windows命令列模式下輸入ipconfig /all,就可以檢視本地dns伺服器的ip位址,一般而言本地網域名稱伺服器都是由isp提供,主機通過udp和本地網域名稱伺服器通訊。如果在本地網域名稱伺服器快取記憶體中搜尋不到要轉換的網域名稱,就向更高階別的網域名稱伺服器發起迭代查詢,按根網域名稱伺服器(一般查詢根網域名稱伺服器都是遵循就近原則,中國有3個根伺服器,位置分別為北京,香港,台北)-> 頂級網域名稱伺服器-> 許可權網域名稱伺服器的順序查詢。假如本地網域名稱伺服器快取記憶體中存在頂級網域名稱伺服器.com的ip位址,那麼本地網域名稱伺服器可以不向根網域名稱伺服器進行查詢,而是直接向com頂級網域名稱伺服器傳送udp請求報文,這樣就可以大大減輕根網域名稱伺服器的負荷。維護本地網域名稱伺服器資料庫的主機自然應該定期地檢查網域名稱伺服器以獲取新的對映資訊,而且主機必須從快取中刪掉無效的項。
二. tcp 連線建立
由上一步獲取www.cnblogs.com的ip位址42.121.252.58後,客戶端主機就會選擇乙個未使用的埠與42.121.252.58:80通訊,在windows命令列模式下輸入netstat,就可以檢視當前正在活動的tcp連線。
client首先傳送乙個連線試探,ack=0 表示確認號無效,syn = 1 表示這是乙個連線請求或連線接受報文,同時表示這個資料報不能攜帶資料,seq = x 表示client自己的初始序號。
server監聽到連線請求報文後,如同意建立連線,則向client傳送確認。tcp報文首部中的syn 和 ack都置1 ,ack = x + 1表示期望收到對方下乙個報文段的第乙個資料位元組序號是x+1,同時表明x為止的所有資料都已正確收到,seq = y 表示server 自己的初始序號。
client收到確認後還需再次傳送確認,同時攜帶要傳送給server的資料。ack 置1 表示確認號ack= y + 1 有效,client自己的序號seq= x + 1。
三. 瀏覽器給伺服器傳送乙個http請求
上一步中有提到client收到確認後還需再次傳送確認,這時就可以攜帶要傳送給server的資料,這個資料就是http請求報文。
http請求行:get http/1.1
http請求首部:
accept:
accept-charset:
gbk,utf-8;q=0.7,*;q=0.3
accept-encoding:
gzip,deflate,sdch
accept-language:
zh-cn,zh;q=0.8
connection:
keep-alive
cookie:
省略host:
www.cnblogs.com
if-modified-since:
mon, 22 apr 2013 09:12:11 gmt
user-agent:
這裡重點提一下connection。
connection設定為keep-alive,就是server在傳送響應後仍然在一段時間內保持這條連線,使同一client可以繼續在這條連線上傳送後續的http請求報文和響應報文。對於不同的web伺服器,如iis,apache,都有不同的keep-alive 過期時間,當然如果過期時間太短,就達不到重用連線的效果,如果過期時間太長,則會造成占用資源的壞處。
四. 伺服器給瀏覽器傳送乙個http響應
當server接收到http請求的時候,就把請求交給專門的web伺服器處理,並最終把資料傳送給client,這個資料就是http響應報文。
http狀態行:http/1.1 200 ok
http響應首部:
cache-control:
public, max-age=62
connection:
keep-alive
content-encoding:
gzip
content-type:
text/html; charset=utf-8
date:
wed, 24 apr 2013 08:14:03 gmt
expires:
wed, 24 apr 2013 08:15:04 gmt
last-modified:
wed, 24 apr 2013 08:13:04 gmt
server:
tengine
transfer-encoding:
chunked
vary:
accept-encoding
x-aspnet-version:
4.0.30319
x-aspnetmvc-version:
3.0x-powered-by:
asp.net
x-ua-compatible:
ie=edge
最後就是http響應主體內容--html文件了,如果需要繼續獲取巢狀在html中的物件,且這些物件都存在於同乙個伺服器上時,這些http請求就會重用現存tcp連線。
五. tcp 連線釋放
在正常情況下,伺服器端的keep-alive過時了,就會主動發出請求釋放這條tcp連線。
server傳送乙個連線釋放報文,fin = 1 表示server的資料已傳送完畢,seq = v ,v等於前面已傳送過的資料的最後乙個位元組加1。
client收到server的連線釋放請求後,傳送乙個確認報文。ack = 1 表示確認後ack有效,ack = u+1表示期望收到對方下乙個報文段的第乙個資料位元組序號是u+1 ,seq = v , v等於前面client已傳送過的資料的最後乙個位元組加1。
由於http協議是基於請求-響應模型,所以這時client再傳送請求資料給server已經無效了,因為server到client的tcp連線已關閉,不會再傳送響應了。這裡的close-wait大概是等待主機通知關閉這次tcp連線。
接下來client就傳送乙個連線釋放給server,fin=1,ack=1,ack = u + 1 與之前傳送給server的確認號一樣。這裡的seq = v 也與之前的一樣。(個人認為close-wait期間client不會再傳送資料給server,所有資料序號並沒有發生改變,正確與否有待考證)
server收到連線釋放報文後,便傳送乙個確認報文。然後進入time-wait,而不是立即關閉連線,原因是不保證這個確認報文沒有丟失,而client收不到確認報文則執行超時重傳fin+ack,這時server還未關閉,就可以重傳ack。
瀏覽器與伺服器
瀏覽器是安裝在電腦裡面的乙個軟體,能夠將頁面內容渲染出來呈現給使用者檢視,並讓使用者與網頁互動的一種軟體。常見主流瀏覽器 internet explorer,chrome,firefox,safari,opera 瀏覽器核心 瀏覽器所採用的渲染引擎。渲染引擎決定了瀏覽器如何顯示網頁的內容,以及網頁格...
瀏覽器訪問伺服器的流程
1 瀏覽器輸上網域名稱,例如www.baidu.com 2 瀏覽器會先訪問dns伺服器,把網域名稱解析成ip位址,在返回給瀏覽器 2 dns的解析原理 原理步驟 1 系統首先會查詢本地的dns快取和hosts檔案資訊,確認其中是否有與,網域名稱www.baidu.com所對應的ip位址。如果有,就直...
WEB 伺服器 與 瀏覽器
http協議通訊,是連線瀏覽器和伺服器的橋梁。兩者之間的資訊流,使它們真正的活力。這中間,瀏覽器連著使用者 伺服器連著資料庫 等其他的服務。伺服器能提供給瀏覽器,什麼樣的資訊呢?這些資訊,遵循著http通訊的格式。也許,瀏覽器只是 的乙個視窗,通過使用瀏覽器我們訪問 而真正的 技術,卻被掩蓋掉了。技...