肺炎疫情動態是如何實時傳遞到你面前的?
2020 年春節,新型冠狀病毒肺炎肆虐中國。雖然面對的困難很多,但相比于 2002 年 SARS 病毒席卷而來的時候,政府和人民顯然應對得更加及時。在缺乏有效治療手段的艱難時期,信息的高效傳遞成為對抗病毒的有力武器。
這都要感謝移動互聯網的普及和互聯網的誕生。互聯網究竟如何傳遞信息?當你在微信里打開一篇文章,在你看不見的地方究竟發生了什么?
這是一篇《計算機網絡》課程的先導入門文章,也是一篇科普文,考試必考,請同學們做好筆記。
打開一篇微信文章,你會進入到微信內置的瀏覽器,大約兩秒鐘后,當前肺炎的實時數據頁面呈現在你面前。其實你輸入到瀏覽器里的是一個網址,比如下面這個騰訊新聞肺炎數據的網址:
https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&_=5774620

一、從網址到 IP
這是一個 URL(Uniform Resource Locator),統一資源占位符,最初由蒂姆 • 伯納斯 • 李提出,用于指定網頁(或者其他資源)所在地址。它就像是信息在網絡上的門牌。
其中 https 是協議類型,view.inews.qq.com 是服務器地址,/g2/getOnsInfo 是路徑,name=disease_h5 和 _=5774620 為兩個查詢,查詢之間用 & 隔開,查詢與路徑之間用 ? 隔開。在服務器地址和路徑中間還可以加入 :[端口號] 用于指定去往服務器的特定端口。
這個 URL 是如何從你的手機出發,獲取地球某處的一個服務器的信息呢?
首先,瀏覽器會將域名,也就是上文所說的服務器地址 view.inews.qq.com 發送給 DNS 服務器,無論你的域名長成什么樣子,比如ᗣ.com、卐.com、☺.com、t.tt、wufazhuce.com,最終都會被 DNS 服務器解析成一個被點分隔為四個部分,每個部分 8 個 bit,總共 32 位的數字組合,這串數字就是 IP 地址。
當然,現在互聯網上那么多電子設備,這種 IP 地址早就不夠用了,所以你還能見到其他諸如 IPv6 的地址。
二、信息的封裝和傳輸
獲取了地址后,你的手機會先和服務器打個招呼。
張總的手機:您好,我是張總的手機。
騰訊的服務器:您好張總的手機,我是騰訊的服務器。
張總的手機:您好騰訊的服務器。
這被稱作是 TCP 協議的三次握手,因為 HTTP 協議是基于 TCP 協議的,也就是說在上層的 HTTP 協議封裝了請求后一定會經過下層的 TCP 協議,因此要先握手,建立 TCP 連接。
那么問題來了,TCP 協議是如何定位到目標服務器的?
TCP 協議處于傳輸層,它并不會定位目標服務器,自己做不了,就把事情丟給自己的下一層網絡層去做,當然 TCP 協議是要傳輸一些信息的,比如記錄下客戶端的端口號和服務器的端口號。
到達網絡層,IP 協議會記錄上層是 TCP 協議以及版本號等信息,最重要是存放源(設備) IP 地址和目標(服務器) IP 地址。這時你的手機會判斷這個目標 IP 地址和當前機器的 IP 地址是否在同一個網段(是不是本地人)。
顯然,你想訪問的頁面不在本地,而是存放在世界上的某個角落。你需要把這些信息發給網關,網關就類似于你所在的局域網的海關,出了海關才能去往遠方。
網關在哪?如果不經過 MAC 層信息就會迷路。在 MAC 層,通過 ARP 協議可以獲取網關的 MAC 地址。將源 MAC 和網關 MAC 放入 MAC 頭,再加入一些其他信息,就可以發送給網關了。
路由器(俗稱貓),被叫做網關,雖然并不準確,但不妨先這樣理解。
網關會先把 MAC 頭取下來,發現 MAC 符合,是發送給自己的,接著取出 IP 頭,這里存儲著目標服務器的 IP 地址,網關自己存儲著一個轉發信息庫,被稱作路由表,通過目標 IP 地址查詢路由表決定該把信息發向何處,即下一個路由的 IP 地址。路由器再發送 ARP 獲取這個 IP 地址的 MAC 地址。
知道了下一關的 MAC 地址,就可以轉發給下一個路由了,再轉發之前,MAC 層的目標 MAC 地址會更新成下一站的地址,方便校驗。
就這樣,一個請求會被分割成多個小塊,每個小塊都一跳一跳最終到達目標服務器,再以同樣的方式將響應傳回來。
三、分層的意義
你可能會奇怪:傳個頁面為什么要搞這么復雜?設置這么多層和協議的意義是什么?
可以說,分層既是個人的努力,也要考慮歷史的進程。
個人的努力方面:鏈路層(MAC 層)用來處理連接網絡的硬件部分;網絡層(IP 協議屬于網絡層)用來處理在網絡上流動的數據包,規定了通過怎樣的路徑(所謂的傳輸路線)到達目標計算機;TCP 位于傳輸層,提供可靠的字節流服務;最上層即應用層,包括 HTTP, HTTPS, DNS 等協議,直接面向用戶提供服務。
從歷史的進程來看,為復雜的流程分層是必然的:既可以增強系統的可維護性,也讓每一層的設計變得相對簡單了。
當你打開一個頁面時,在你看不見的地方,無數技術協議都在為確保信息及時送達、確保信息準確做出各種努力。在災難面前,信息讓溝通更及時,讓專家的建議更快速地傳達。這是開發者們經年累月付出的結果,每一個程序員都應該善待技術,合理應用技術,在面對挑戰的時候才能更有信心和勇氣。
疫情當前,力扣再次提醒大家做好防護,我們一起努力用科技改變世界,戰勝困難。