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