從頁面輸入網址,回車到顯示內容,這中間到底經歷了什么
寫在前面
阿粉在學習計算機網絡的內容時,腦子里面突然冒出來一個問題:當我們在一個瀏覽器界面輸入網址,回車到界面顯示內容,這中間經歷了什么?
先不要往下看,你能想到什么?
下面是我能想到的過程,有可能不是很準確,如有錯誤之處,還望指出。
計算機網絡大體上可以分為應用層,傳輸層,網絡層,鏈路層和物理層。
當我們在頁面輸入網址,然后回車到顯示內容時,我通過上面的層次依次來說。
詳細過程
應用層
假設我們現在要訪問 google 網站,那么第一步要做的就是打開瀏覽器,在地址欄中輸入 google 的地址,當你點擊回車時,瀏覽器知道你要訪問 google 了,但是對于瀏覽器來說,這只是一個名字,但是具體在哪兒它是不知道的。比如,你知道某位明星的名字,但是他/她具體的地址在哪兒你不清楚,對吧?對于瀏覽器來說也是這樣。
比較好的一點是,想要訪問網站,不像你想見明星那么難。此時瀏覽器通過 DNS 找到你要訪問的具體網站地址。
當然了,如果你想要更準確的找到地址,也可以通過 HTTPDNS 去查找。通過 DNS 或者 HTTPDNS 現在瀏覽器拿到了具體的 IP 地址,隨后它就開始打包你的請求。對于舉的例子來說,你只是想要訪問一下,一般使用 HTTP 協議就可以了;如果有些請求會涉及到你的賬號密碼,就會使用 HTTPS 協議來保證你的數據安全。
傳輸層
到這里, DNS , HTTP , HTTPS 所在的層稱之為應用層。
現在應用層的事情做完了,接下來應用層會將以上相關數據進行封裝,經過 Socket 編程,將應用層的包發送給傳輸層。
如果這個包是使用 HTTP 或者 HTTPS 協議發送過來的,那傳輸層就會使用 TCP 協議來將數據進行封裝;如果是使用 DNS 協議發送過來的,則會使用 UDP 協議來進行封裝。
封裝完畢之后,瀏覽器就會將包交給操作系統的網絡層。
網絡層 + 鏈路層 + 物理層
這一部分會涉及到網絡層 + 鏈路層 + 物理層,我就不分那么詳細了~
網絡層的協議是 IP 協議,在 IP 協議中會有源 IP 地址和目標 IP 地址。源 IP 地址也就是瀏覽器所在機器的 IP 地址,說的再白點兒就是,假設你是使用電腦瀏覽器發出的訪問請求,這個源 IP 地址就是你的電腦 IP 地址 目標 IP 地址就是你想要訪問的網站地址。還記得嘛,在應用層,我們根據 DNS 或 HTTPDNS 已經獲取到了想要訪問網站的具體 IP 地址。
OK ,既然此時操作系統已經知道了目標 IP 地址,接下來它就會想我怎么根據這個目標 IP 地址找到這臺機器呢。首先操作系統會看這個 IP 地址是不是在局域網內,如果是的話,從目標 IP 地址就能看出來。但是很明顯,想要訪問的 google 地址不在本地,在那觸不到的遠方。
操作系統知道要訪問的地址在遠方,但是遠方在哪兒它也不知道。所以它就將這個數據包發給網關( gateway ),但是它不知道網關是哪兒臺機器,這可咋整。
沒事兒,反正大家都在一個地方,吼一嗓子不就得了~所以操作系統就大吼了一聲:咱們的網關是誰來著。網關就會回答它,我就是,我在這兒呢。
上面的那一聲吼,就是 ARP 協議,通過 ARP 協議,就知道了網關的具體地址,也就是 MAC 地址。
接下來這個數據包就到了網關那里。網關一般就是路由器,到某個 IP 地址怎么走,在一個叫做「路由表」中維護著。
出網關就比較復雜了,這里就不詳細說了,具體可以看這篇文章: 想出網關?你需要懂得這些
出了網關之后,就需要拿出源 IP 地址和目標 IP 地址。因為只要出了網關,那就是在外面肉搏,如果沒有源 IP 地址和目標 IP 地址,就不知道這個請求是從哪兒發出的,要往哪兒去。
現在這個數據包經過了重重關卡,終于找到了目標 IP 地址所在的服務器。此時服務器會首先發送一個接收請求,然后再將數據包一層層解析,在 TCP 頭中含有目標端口號,通過這個端口號,就能夠找到哪兒個程序的進程正在監聽這個端口號,進而我們就找到了我們想要訪問的網頁。
但是我怎么知道從我這里發出的數據包有沒有丟失呢?所以此時 TCP 層會隔一段時間發送一次,這并不是說,頁面又發送了一次請求,只是 TCP 自己在悶頭重試,直到收到了接收請求。
在我們找到了想要訪問的網頁之后,接下來就會像來的時候,再原路返回去。
最后:
沒想到吧,一個簡單的打開界面,竟然涉及到了這么多的知識~
當然你會發現在你輸入網址之后敲回車,頁面幾乎是立刻出來了,這就涉及到了緩存,再深入講的話,這篇文章就很長了,如果這篇文章引起了你的興趣,可以繼續向下探究,更歡迎留言討論