浏览器与服务器响应流程-----(转)
一. 解析域名地址為IP地址
瀏覽器DNS緩存:以Chrome為例,在瀏覽器窗口中輸入chrome://net-internals/#dns,就可以查看當(dāng)前瀏覽器DNS緩存記錄,chrome的DNS緩存過(guò)期時(shí)間還是比較短的,大約為1分鐘。
本機(jī)DNS緩存:在Windows命令行模式下輸入ipconfig /displaydns,就可以查看本機(jī)DNS緩存記錄。許多主機(jī)在啟動(dòng)時(shí)從本地域名服務(wù)器下載域名和地址的全部數(shù)據(jù)庫(kù),維護(hù)存放自己最近使用的域名的緩存。
本地域名服務(wù)器:在Windows命令行模式下輸入ipconfig /all,就可以查看本地DNS服務(wù)器的IP地址,一般而言本地域名服務(wù)器都是由ISP提供,主機(jī)通過(guò)UDP和本地域名服務(wù)器通信。如果在本地域名服務(wù)器高速緩存中搜索不到要轉(zhuǎn)換的域名,就向更高級(jí)別的域名服務(wù)器發(fā)起迭代查詢,按根域名服務(wù)器(一般查詢根域名服務(wù)器都是遵循就近原則,中國(guó)有3個(gè)根服務(wù)器,位置分別為北京,香港,臺(tái)北)-> 頂級(jí)域名服務(wù)器-> 權(quán)限域名服務(wù)器的順序查詢。假如本地域名服務(wù)器高速緩存中存在頂級(jí)域名服務(wù)器.com的IP地址,那么本地域名服務(wù)器可以不向根域名服務(wù)器進(jìn)行查詢,而是直接向com頂級(jí)域名服務(wù)器發(fā)送UDP請(qǐng)求報(bào)文,這樣就可以大大減輕根域名服務(wù)器的負(fù)荷。維護(hù)本地域名服務(wù)器數(shù)據(jù)庫(kù)的主機(jī)自然應(yīng)該定期地檢查域名服務(wù)器以獲取新的映射信息,而且主機(jī)必須從緩存中刪掉無(wú)效的項(xiàng)。
二. TCP 連接建立
由上一步獲取www.cnblogs.com的IP地址42.121.252.58后,客戶端主機(jī)就會(huì)選擇一個(gè)未使用的端口與42.121.252.58:80通信,在Windows命令行模式下輸入netstat,就可以查看當(dāng)前正在活動(dòng)的TCP連接。
Client首先發(fā)送一個(gè)連接試探,ACK=0 表示確認(rèn)號(hào)無(wú)效,SYN = 1 表示這是一個(gè)連接請(qǐng)求或連接接受報(bào)文,同時(shí)表示這個(gè)數(shù)據(jù)報(bào)不能攜帶數(shù)據(jù),seq = x 表示Client自己的初始序號(hào)。
Server監(jiān)聽到連接請(qǐng)求報(bào)文后,如同意建立連接,則向Client發(fā)送確認(rèn)。TCP報(bào)文首部中的SYN 和 ACK都置1 ,ack = x + 1表示期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)序號(hào)是x+1,同時(shí)表明x為止的所有數(shù)據(jù)都已正確收到,seq = y 表示Server 自己的初始序號(hào)。
Client收到確認(rèn)后還需再次發(fā)送確認(rèn),同時(shí)攜帶要發(fā)送給Server的數(shù)據(jù)。ACK 置1 表示確認(rèn)號(hào)ack= y + 1 有效,Client自己的序號(hào)seq= x + 1。
三. 瀏覽器給服務(wù)器發(fā)送一個(gè)http請(qǐng)求
上一步中有提到Client收到確認(rèn)后還需再次發(fā)送確認(rèn),這時(shí)就可以攜帶要發(fā)送給Server的數(shù)據(jù),這個(gè)數(shù)據(jù)就是HTTP請(qǐng)求報(bào)文。
HTTP請(qǐng)求行:GET http://www.cnblogs.com/? HTTP/1.1
HTTP請(qǐng)求首部:
| Accept: | text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 |
| 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: | Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.21 (KHTML, like Gecko) Chrome/25.0.1354.0 Safari/537.21 |
?
這里重點(diǎn)提一下Connection。
Connection設(shè)置為keep-alive,就是Server在發(fā)送響應(yīng)后仍然在一段時(shí)間內(nèi)保持這條連接,使同一Client可以繼續(xù)在這條連接上傳送后續(xù)的HTTP請(qǐng)求報(bào)文和響應(yīng)報(bào)文。對(duì)于不同的web服務(wù)器,如IIS,Apache,都有不同的keep-alive 過(guò)期時(shí)間,當(dāng)然如果過(guò)期時(shí)間太短,就達(dá)不到重用連接的效果,如果過(guò)期時(shí)間太長(zhǎng),則會(huì)造成占用資源的壞處。
四. 服務(wù)器給瀏覽器發(fā)送一個(gè)http響應(yīng)
當(dāng)Server接收到http請(qǐng)求的時(shí)候,就把請(qǐng)求交給專門的web服務(wù)器處理,并最終把數(shù)據(jù)發(fā)送給Client,這個(gè)數(shù)據(jù)就是HTTP響應(yīng)報(bào)文。
HTTP狀態(tài)行:HTTP/1.1 200 OK
HTTP響應(yīng)首部:
?
| 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.0 |
| X-Powered-By: | ASP.NET |
| X-UA-Compatible: | IE=edge |
?
?
?
???
???? 最后就是HTTP響應(yīng)主體內(nèi)容--html文檔了,如果需要繼續(xù)獲取嵌套在html中的對(duì)象,且這些對(duì)象都存在于同一個(gè)服務(wù)器上時(shí),這些HTTP請(qǐng)求就會(huì)重用現(xiàn)存TCP連接。
五. TCP 連接釋放
在正常情況下,服務(wù)器端的keep-alive過(guò)時(shí)了,就會(huì)主動(dòng)發(fā)出請(qǐng)求釋放這條TCP連接。
?
?
?
Server發(fā)送一個(gè)連接釋放報(bào)文,FIN = 1 表示Server的數(shù)據(jù)已發(fā)送完畢,seq = v ,v等于前面已傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)加1。
Client收到Server的連接釋放請(qǐng)求后,發(fā)送一個(gè)確認(rèn)報(bào)文。ACK = 1 表示確認(rèn)后ack有效,ack = u+1表示期望收到對(duì)方下一個(gè)報(bào)文段的第一個(gè)數(shù)據(jù)字節(jié)序號(hào)是u+1 ,seq = v , v等于前面Client已傳送過(guò)的數(shù)據(jù)的最后一個(gè)字節(jié)加1。
由于HTTP協(xié)議是基于請(qǐng)求-響應(yīng)模型,所以這時(shí)Client再發(fā)送請(qǐng)求數(shù)據(jù)給Server已經(jīng)無(wú)效了,因?yàn)镾erver到Client的TCP連接已關(guān)閉,不會(huì)再發(fā)送響應(yīng)了。這里的Close-Wait大概是等待主機(jī)通知關(guān)閉這次TCP連接。
接下來(lái)Client就發(fā)送一個(gè)連接釋放給Server,FIN=1,ACK=1,ack = u + 1 與之前發(fā)送給Server的確認(rèn)號(hào)一樣。這里的seq = v 也與之前的一樣。(個(gè)人認(rèn)為Close-Wait期間Client不會(huì)再發(fā)送數(shù)據(jù)給Server,所有數(shù)據(jù)序號(hào)并沒有發(fā)生改變,正確與否有待考證)
Server收到連接釋放報(bào)文后,便發(fā)送一個(gè)確認(rèn)報(bào)文。然后進(jìn)入Time-Wait,而不是立即關(guān)閉連接,原因是不保證這個(gè)確認(rèn)報(bào)文沒有丟失,而Client收不到確認(rèn)報(bào)文則執(zhí)行超時(shí)重傳FIN+ACK,這時(shí)Server還未關(guān)閉,就可以重傳ACK。
?
轉(zhuǎn)載于:https://www.cnblogs.com/shao-shao/articles/3489436.html
總結(jié)
以上是生活随笔為你收集整理的浏览器与服务器响应流程-----(转)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: jquery右下角自动弹出关闭层
- 下一篇: HTML左边和右边是固定的宽度但是中间是