【問題描述】
在瀏覽器輸入www.baidu.com,然后,瀏覽器顯示相應的百度頁面,這個過程究竟發生了什么呢?
【第一步,解析域名,找到主機】
正常情況下,瀏覽器會緩存DNS一段時間,一般2分鍾到30分鍾不等。如果有緩存,直接返回IP。
緩存中如果沒有查到IP,瀏覽器會做系統調用,讀取主機的hosts文件,如果找到,直接返回IP。
hosts文件里面還是沒有找到,則直接去路由器中尋找DNS緩存,一般這個時候都能找到對應的IP。
如果還是沒有找到,ISP的DNS服務器就開始從根域名服務器開始遞歸搜索,從.com頂級域名服務器開始,一直到baidu的域名服務器。
這個時候,瀏覽器就獲取到了對應的IP。在解析的過程中,常常會解析出不通的IP,這是根據不同的用戶,不同的網絡供應商,所在的地域,等等等等進行計算給出的最優的IP地址。
劫持DNS,可以屏蔽掉很多網點的訪問。
【第二步,瀏覽器與網站建立TCP連接】
瀏覽器利用IP直接與網站主機通信。
瀏覽器發出TCP(SYN=1,ACK=0)連接請求,主機返回TCP(SYN=1,ACK=1)應答報文,瀏覽器收到應答報文發現ACK標志位為1,表示連接請求確認。
瀏覽器返回TCP(ACK=1)確認報文,主機收到確認報文,三次握手,TCP鏈接建立完成。
【第三步,瀏覽器發起get請求】
瀏覽器向主機發起一個HTTP-GET方法報文請求。
請求中包含訪問的URL,也就是http://www.baidu.com ,還有User-Agent用戶瀏覽器操作系統信息,編碼等。
值得一提的是Accep-Encoding和Cookies項。
Accept-Encoding一般采用gzip,壓縮之后傳輸html文件。
Cookies如果是首次訪問,會提示服務器建立用戶緩存信息,如果不是,可以利用Cookies對應鍵值,找到相應緩存,緩存里面存放着用戶名,密碼和一些用戶設置項。
【最后一步,顯示頁面】
返回狀態碼,表示服務器已經成功響應后正常返回。
在報文頭里面Content-type為"test/html",瀏覽器以HTML形式呈現。
不過,對於大型網站,一般都存在兩個乃至上百個主機站點,往往都不會直接返回請求頁面,而是重定向。
這時候,返回的狀態碼就不再是200,而是"301,302"等以3開頭的重定向碼。
瀏覽器在獲取了重定向響應后,在響應報文中Location項找到重定向地址,瀏覽器重新第一步訪問即可。
最后再補充一點。
重定向是為了負載均衡或者導入流量,提高SEO排名。
利用一個前端服務器接受請求,然后負載到不同的主機上,可以大大提高站點的業務並發處理能力;
重定向也可將多個域名的訪問,集中到一個站點,
由於baidu.com,www.baidu.com會被搜索引擎認為是兩個網站,造成每個的鏈接數都會減少從而降低排名,永久重定向會將兩個地址關聯起來,搜索引擎會認為是同一個網站,從而提高排名。