1. 程式人生 > >浪裡來浪裡去!網路協議如何成就網上衝浪?

浪裡來浪裡去!網路協議如何成就網上衝浪?

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