瀏覽器輸入url到發起http請求所經歷的過程
使用者輸入url
當用戶輸入url,作業系統會將輸入事件傳遞到瀏覽器中,在這過程中,瀏覽器可能會做一些預處理,比如 Chrome 會根據歷史統計來預估所輸入字元對應的網站,例如輸入goog,根據之前的歷史發現 90% 的概率會訪問「www.google.com 」,因此就會在輸入回車前就馬上開始建立 TCP 連結甚至渲染了。
接著是輸入url之後,點選回車,這時瀏覽器會對 URL 進行檢查,首先判斷協議,如果是 http 就按照 Web 來處理,另外還會對這個 URL 進行安全檢查
安全檢查完成之後,在瀏覽器核心中會先檢視快取,然後設定 UA 等 HTTP 資訊,接著呼叫不同平臺下網路請求的方法。
注意:
瀏覽器和瀏覽器核心是不同的概念,瀏覽器指的是 Chrome、Firefox,而瀏覽器核心則是 Blink、Gecko,瀏覽器核心只負責渲染,GUI 及網路連線等跨平臺工作則是瀏覽器實現的
http網路請求
通過 DNS 查詢 IP;
通過 Socket 傳送資料
dns查詢ip
DNS,英文是Domain Name System,中文叫域名系統,是Internet的一項服務,他將域名和IP地址相互對映的一個分散式資料庫
假設使用者在瀏覽器中輸入的是www.google.com,大概過程:
如果輸入的是域名,則需要進行dns查詢,將域名解析成ip;
進行DNS查詢的主機或軟體叫做DNS解析器,使用者使用的工作站或電腦都屬於解析器。域名解析就是利用DNS解析器得到對應IP過程,解析器會向域名伺服器進行查詢處理。
主要過程如下:
- 從瀏覽器快取中查詢域名www.google.com的IP地址
- 在瀏覽器快取中沒找到,就在作業系統快取中查詢,這一步中也會查詢本機的hosts看看有沒有對應的域名對映(當然已經快取在系統DNS快取中了)
- 在系統中也沒有的話,就到你的路由器來查詢,因為路由器一般也會有自己的DNS快取
如果以上都沒有找到,則繼續往下向dns域名伺服器查詢
- 使用者電腦的解析器向LDNS(也就是LocalDNS,網際網路服務提供商ISP),發起域名解析請求,查詢www.google.com的IP地址,這是一個遞迴查詢過程
- 在快取沒有命中的情況下,LDNS向根域名伺服器.查詢www.google.com的IP地址,LDNS的查詢過程是一個迭代查詢的過程
- 根告訴LDNS,我不知道www.google.com對應的IP,但是我知道你可以問com域的授權伺服器,這個域歸他管
- LDNS向com的授權伺服器問www.google.com對應的IP地址
- com告訴LDNS,我不知道www.google.com對應的IP,但是我知道你可以問google.com域的授權伺服器,這個域歸他管
- LDNS向google.com的授權伺服器問www.google.com對應的IP地址
- google.com查詢自己的ZONE檔案(也稱區域檔案記錄),找到了www.google.com對應的IP地址,返回給LDNS
- LDNS本地快取一份記錄,把結果返回給使用者電腦的解析器
- 在這之後,使用者電腦的解析器拿到結果後,快取在自己作業系統DNS快取中,同時返回給瀏覽器,瀏覽器依舊會快取一段時間。
注意,
域名查詢時有可能是經過了CDN排程器的(如果有cdn儲存功能的話)
而且,需要知道dns解析是很耗時的,因此如果解析域名過多,會讓首屏載入變得過慢,可以考慮dns-prefetch優化
tcp/ip請求
有了 IP 地址,就可以通過 Socket API 來發送資料了,這時可以選擇 TCP 或 UDP 協議。
http本質是tcp協議。
TCP是一種面向有連線的傳輸層協議。他可以保證兩端(傳送端和接收端)通訊主機之間的通訊可達。他能夠處理在傳輸過程中丟包、傳輸順序亂掉等異常情況;此外他還能有效利用寬頻,緩解網路擁堵。
建立TCP連線一開始都要經過三次握手:
第一次握手,請求建立連線,傳送端傳送連線請求報文
第二次握手,接收端收到傳送端發過來的報文,可知傳送端現在要建立聯機。然後接收端會向傳送端傳送一個報文
第三次握手,傳送端收到了傳送過來的報文,需要檢查一下返回的內容是否是正確的;若正確的話,傳送端再次傳送確認包
在TCP連線建立完成之後就可以傳送HTTP請求了。
注意
瀏覽器對同一個域名有連線數限制,大部分是 6,http1.0中往往一個資源下載就需要對應一個tcp/ip請求,而像 HTTP 2.0 協議儘管只使用一個 TCP 連線來傳輸資料,但效能反而更好,而且還能實現請求優先順序。
參考文章:
ofollow,noindex" target="_blank">http://fex.baidu.com/blog/201...
https://blog.csdn.net/dojiang...
https://segmentfault.com/a/11...