作者: 張小云的博客
出處:https://www.cnblogs.com/zhangweicheng/p/13388701.html
我們網上沖浪也沖了這么多年,也該上岸好好看看這些浪的形狀了。
1. 從一個網址了解浪來浪去#
我們知道計算機之間的通過其實都是通過IP+端口的形式,但是我們平時訪問的時候根本就沒涉及到這兩個東西,還是能訪問到資源,為啥呢?這得問問我們神奇的DNS。
- 首先,舉個例子,我們輸入www.bilibili.com,這個時候需要通過DNS將其轉化為IP地址才能繼續訪問,其流程大概是這樣的:
從當前的瀏覽器中查詢是否存在當前域名,如果有則返回其對應的IP地址,否則的話向本機操作系統中查詢。操作系統如果有,則返回,瀏覽器將其緩存起來之后返回;如果操作系統查詢不到的話,那么則向路由器緩存上查詢。同上,有返回并且緩存到操作系統,操作系統返回并緩存到瀏覽器;無則向本地服務器請求。本地服務器就是運營商,比如說電信或者移動。操作過程同上,還沒有的話就要向根服務器請求了。根服務器就是終點站了,操作跟上面一樣,如果還沒有的話,服務器就要請你檢查你的域名了。
okay,上面繞了一圈之后我們現在拿到了B站的IP:假設為139.159.246.60,接下來就可以訪問了。
是不是還少點了什么?哦,是了,少了端口,那端口咋辦呢?不用辦,每個協議都有默認的端口,如果你不輸入端口號的話就會使用默認的,例如http協議默認80,而https默認443,所以實際上輸入www.bilibili.com實際上請求的是139.159.246.60:80,也就是機器IP地址為139.159.246.60上的80端口的程序,所以B站服務器的服務要占用監聽80端口,當然那邊肯定還做了負載均衡,這就不扯了。
- 現在知道具體地址地址還需要做什么呢,還需要建立連接,要保證等下進行數據傳輸的時候是okay的,所以這邊會跟服務器建立TCP連接,完成之后進入下一步。
- 連接okay了,瀏覽器這邊就組裝好請求頭準備發送請求,請求頭包含了一些重要的信息如請求的方式、代理、請求格式,接收格式等,組裝完成后發送。
- 服務器收到請求解析之后包裝所需信息返回。
- 客戶端(一般是瀏覽器或者App)這邊接收到之后進行渲染,然后就是我們平時看到的圖形界面了。
- 最后根據是否保持連接來決定是否關閉。
這樣一次對B站的訪問就完成了。但是這都是表面,我們甚至都不知道浪里的是水還是鹽,計算機究竟是如何通過網絡來通信的,接下來讓我們走進《網絡》。
Top
2. 網絡協議#
上面說到一個請求的完整路徑,但那只是站在應用層的角度來看的,而在網絡中應用層只是屬于某個模型的一部分。
平時所說的網絡模型有三種:OSI七層、TCP/IP五層、TCP/IP四層。這三種模型都是概念模型,注意是概念模型,也就是說實現的方式并不是固定的,三兄弟來亮個相吧。
這幾層背起來還不用一分鐘,但那沒用,就跟名字一樣,需要的是靈魂,而不是枯燥的文字,所以需要理解。
七層模型#
七層懂了,四、五層還難嗎。
我們知道數據在計算機底層最終都會變成0和1,那么可能有人問了,現在計算機那么牛逼,底層給整個2或者3出來總可以吧,老是糾結0和1干嘛?說實話,實在是辦不到。
計算機通過電纜的電信號來實現通信,而電信號只有高低兩種,所以也就分別對應計算機數字的1和0,這也是物理層的作用,將數字轉化為電信號發給其他計算機。
物理層:將接收到的數據從1和0轉化成高低信號發送給其他計算機。
但發是發出來了,其他計算機怎么知道你阿巴阿巴在說什么呢,不懂也沒意義啊。所以需要定義一些規則,例如發送32位,前8位是文件信息,后24位才是數據,這樣就知道了,這種規則就叫做協議。但是協議人人都可以定,一千個哈姆雷特就有一千種協議,這么多個哈姆雷特有點滲人,所以需要一個標準來進行統一,這才出現了以太網協議。
以太網協議的內容大致為:
每組信號構成一個數據包,即"幀"。每個數據包都包含兩個部分。head:固定18個字節,包含發送者、接收者和數據類型。數據體data:真正的數據。
有了統一的標準,現在知道發送的是什么了,但是怎么知道要發給誰呢?那就是通過mac地址,每臺計算機都有著世界上獨一無二的mac地址,通過這個地址能夠標識唯一的一臺計算機,將這當做地址再適合不過了。okay,現在發送內容有了,發給誰也知道了,那咋發呢?能不能通過一條準確的通道能夠直達接收者呢?
計算機之間的通信方式是通過原始的廣播來實現的。
什么意思呢?意思就是說,我要發送一條消息,這條消息的頭部包含了是誰發的,發給誰的,那么我將這條消息發給同一個局域網下的所有計算機,他們收到了就看下是不是發給自己的,如果是則進行響應,否則就不管。
可能有人會質疑,"老哥,照你這么說,那全世界的計算機要通信的話不就得都在一個局域網內,這樣的話,不就可以聯機打CS了?" 我沒說過這句話,周樹人也沒說過。確實,如果只按照上面的方式,全世界的計算機需要進行通信的話必須要求在同一個局域網內,但這是不可能的,即便可能也是一種災難。所以需要更好的方法,這時候網絡層的IP協議就登場了,IP協議的主要作用有兩個:
給每臺計算機分配IP地址和路由。判斷兩臺計算機是否在同一局域網內:計算的方式大致為兩個IP地址跟子網掩碼做于(&)運算,如果結果相同就在同一子網內,否則則不在。(子網掩碼有興趣可以自己搜一下)
嗯?你說的這個IP,它跟通信所需要的mac有關系嗎?計算機之間是通過mac地址識別的,現在只有IP地址是對不上號的,所以我們需要一個轉換器,這個轉換器叫做ARP協議(OSI七層中屬于鏈路層),ARP協議的作用就是將IP地址轉化為mac地址。有了這個協議,加上之前的那些,全世界的計算機都可以進行通信啦。鼓掌!鼓掌!鼓掌!
但是!不好意思,我還是得說但是,這樣的話計算機之間貌似只能一對一,我們平時一臺計算機肯定不止只運行一個程序,像下面這樣都得有幾個了。
肯定還有東西將其拆得更細,從而給程序定位,這時候傳輸層的端口協議TCP和UDP就上線了,TCP和UDP提供了端口的概念,這樣我們通過ip轉mac確定一臺計算機,再通過端口確定具體的一個程序,從而實現端對端的通信,一臺計算機運行多個程序,程序可以跟另一臺計算機的程序進行通信,瞬間形成N×N。到了這一層網絡協議的基本就結束了,往上還有三層可以理解為輔助和加強作用。
會話層:管理TCP連接、流量控制等。
表示層:格式、字符、加密等翻譯工作和轉化。
應用層:展示給用戶的東西,例如HTTP協議就是一個頁面,FTP用于傳輸等。
Top
3. 小結#
本文的敘述方式比較口語化,但如果能簡單理解那就足夠了。首先一開始講輸入一個網址發生的事情,接而引出下方的網絡協議,在網絡協議中從底層物理層的電信號到最上層應用層的http協議,大致的講述模式為:當前的問題—>為了解決當前的問題需要怎么做 的這種模式,相信理解起來并不困難。