對於咱們用戶來講,只須要在瀏覽器中輸入或者點開一個 url ,咱們就直接能夠看到網頁內容了,可是這背後卻經歷很是複雜的故事,簡單來講主要有下面四大過程:編程
一、瀏覽器根據域名找到對應的 ip 地址(遠程服務器)。
二、瀏覽器與遠程服務器創建鏈接(tcp 鏈接,三次握手)。
三、瀏覽器與遠程服務器發送和接收數據。
四、瀏覽器與遠程服務器斷開鏈接。
複製代碼
接下來咱們再來詳細解釋一遍。瀏覽器
一、域名解析爲ip緩存
ip 即爲網絡爲每一臺電腦分配的一個地址,你能夠簡單的理解爲一個門牌號,要想找到某臺電腦,就須要先知道它的 ip 地址。因爲 ip 地址不方便被記住等緣由,因而有了域名,理論上一個域名對應一個 ip。瀏覽器拿到域名後,第一件事就是要把域名解析成 ip,而後找到這個 ip 對應的機器。安全
一般使用 DNS 解析來幫域名找到對應 ip 地址,爲了讓這個查找過程更高效,瀏覽器和操做系統都會將每次的解析結果緩存起來。bash
即下次再要解析某個域名時,就會先去緩存裏去看下,若是緩存裏沒有對應數據,就再去根域名服務器、頂級域名服務器等查找 ip。服務器
總之在這一過程當中,無論用什麼樣的方式,最終都是爲了把域名解析爲 ip 地址。網絡
二、創建鏈接併發
既然已經了對方的 ip 後,那就要開始創建鏈接了。因爲 http 是基於 tcp 協議的,tcp 創建鏈接須要經歷三次握手。下面模擬一下三次握手的過程:tcp
瀏覽器A:你好,我是瀏覽器A,我想找你玩兒。
遠程服務器B:你好啊,瀏覽器A,那你來吧。
瀏覽器A:好的嘞,我這就去了。
複製代碼
這就是三次握手的大體流程,tcp 的三次握手確保了每個消息都有去有回。一旦某個消息得不到有效迴應 tcp 協議就會重發該消息,直到獲得有效迴應。編程語言
tcp 屬於傳輸層,其實傳輸層還有一種 udp 協議,udp 和 tcp 最大的區別就是不須要創建鏈接,也就是說 udp 無需像 tcp 經過三次握手創建鏈接才能開始通訊,udp 發出包也不用確保可否獲得有效響應,只管發出去就好了。udp 協議一般被用於對實時性要求性比較高的場景,好比直播等。
三、服務器響應和返回
創建鏈接後,就能夠互相傳送數據了。瀏覽器按照 http 協議的格式將數據組裝好向服務器發起請求,服務器接收到請求並將處理結果響應給瀏覽器。
服務端的 http 服務器軟件通常有 Apache 和 Nginx,Apache 或 Nginx 又將請求交由具體的編程語言(Java、Python、PHP 等)去處理。
服務器又將程序處理的結果按照 http 協議格式原路返回給客戶端瀏覽器,瀏覽器則再根據返回的數據渲染頁面和數據。
四、斷開鏈接
在完成了數據通訊以後,就要考慮斷開鏈接了,畢竟任務完成了就要空出系統資源來。tcp 的斷開相對於鏈接來講,實際上是有四次握手的,一般被稱做四次揮手,就是揮手拜拜了。
瀏覽器A:你好,時間不早了,我想回去了。
遠程服務器B:哦哦,我看下幾點了啊。
遠程服務器B:哎呀,確實不早了,那你先回吧,拜拜。
瀏覽器A:好的,拜拜。
複製代碼
在這裏你可能會問,爲何斷開鏈接不能像創建鏈接同樣只需三次揮手呢,即瀏覽器在告訴遠程服務器想要斷開的時候,服務器幹嗎不直接斷開呢?
由於服務器在收到斷開消息的時候,可能還有任務或數據沒有處理完成,在這個時候服務器會再去確認是否全部數據都處理完畢了,若是確實都處理完成了,服務器再告訴瀏覽器能夠斷開了。
好了,瀏覽器打開一個網頁背後差很少就是這些流程了,但其實每個過程都很是複雜。
好比 DNS 解析,是怎麼去查緩存的,若是沒有緩存又是怎麼樣去根域名服務器查詢的,全球那麼多的域名都會去根域名服務器查詢 ip 嗎,根域名服務器又是怎麼應對這種超高併發的請求呢?
本文中講的都是基於 http 的,對一些安全性要求比較高的好比支付等業務咱們一般會使用 https, 那麼 http 和 https 到底是有啥區別呢,https 加密方式是怎樣的一個原理?
關於這些問題,後面我會再單獨詳細講,歡迎關注。原創文章不易,若是文章對你有一點點幫助或啓發,但願能給文章點一個贊,有問題也歡迎留言與我交流。