web 開發離不開計算機網絡,計算機網絡很重要,但不是所有的網絡知識對軟件開發都是有用的。

我們知道,網絡是分層的,OSI 體系中分了 7 層,但實際上使用的 TCP/IP 體系中分了 4 層,學習的時候為了方便,我們還是把物理層、數據鏈路層分開學的,所以是 5 層。

開發時我們會用 IP、TCP、HTTP 等協議來完成計算機之間的通信,網頁運行時還會涉及到 DNS 等協議,這些協議都是在網絡層之上的,也就是基于 IP 到 IP 的傳輸來完成各種協議的數據通信。

那之下的部分呢?IP 到 IP 的通信是如何實現的?

這就涉及到物理層、數據鏈路層還有網絡層的知識了,這些知識對實際的開發沒啥用,因為代碼里已經默認了 IP 和 IP 之間是可以通信的,但是了解這些可以讓我們對網絡有一個全面的理解。這部分涉及到網絡硬件、涉及到通信原理,還是挺有意思的。

這篇文章就淺談下 IP 和 IP 之間的通信的知識。

不同類型的網絡

把不同的計算機連接起來,可以做數據通信,可以共享軟件、硬件,這就叫做計算機網絡。

這種連接方式有很多種,自然也就有不同的網絡。比如撥號上網,是利用電話通信的網絡來傳輸數據的,就像打電話一樣,所以叫撥號,只不過傳輸的數據不是通話數據。比如衛星上網,是利用衛星信號來傳輸數據,這也是一種網絡。

這兩種都是用的現有的網絡來實現計算機通信。而我們自己組建的網絡都是用網線連接的,這種是最常見的網絡。

比如這樣:

這種通過一根線把所有的計算機連接起來的網絡連接方式叫做以太網。

在講以太網之前,不知道大家是否已經感受到了網絡分層的好處:

不管是利用電信網絡的撥號上網,還是利用衛星通信的衛星上網,或者是用網線連接起來的以太網,這些不同結構的網絡都能很自然的融合在一起,就是因為做了很好的分層,只要實現了 IP 協議,那么不管網絡是怎么實現的,都能實現更上層協議的通信。

這就像軟件開發領域的面向接口編程的思想,只要你能實現 IP 到 IP 的通信,不管你是怎么傳輸的數據,都可以。

電信和衛星的網絡不咋用關注,我們還是繼續講以太網:

多臺計算機已經用網線連接起來了,那怎么通信呢?

直接通過這條網線傳遞數據就行,只不過現在是一個發其余的都能接收到,要讓目標計算機能接收,那就得標識下目的地址是啥,所以以太網的數據幀格式是這樣的:

除了數據外,額外加上了目的地址、原地址等信息。

這樣每臺計算機接收到網絡傳過來的數據之后,判斷下是否目的地址是自己,是就接收,否則丟棄。這樣就實現了網絡通信。

這就是一個網絡了?就這么簡單?

這確實是一個小型網絡,但還不完善。如果多臺計算機同時發消息怎么辦,數據不就混在一塊了?

所以要做是否沖突的檢測,現在以太網用的方式是這樣:想要通過網絡發消息時,先檢測下網絡中有沒有電信號,沒有的話就發,有的話就等待 1.x 秒,x 是隨機的,如果到了時間還有沖突,那就等待 2.x 秒、4.x 秒、8.x 秒,通過這樣的方式來避免沖突,實現準確的通信,這叫做“指數退避”。

這樣確實不會沖突了,但是還有問題,如果計算機連了很多,雖然能準確的通信,但時不時就沖突的話效率也太低了。

能不能減少沖突呢?

連在一起的以太網的計算機因為是廣播通信的,所以可能可能沖突,這叫做一個“沖突域”。如果能把大的沖突域給拆小,那不就能減少沖突的概率了?

這就是交換機做的事情了:

幾臺電腦之間加一個交換機來隔開,這樣傳輸消息的時候,如果是同一個小網段內的通信,會直接傳給目標計算機,不會傳到其他網段里去,本網段沒有該 mac 地址的時候才傳到其他網段,這樣就把大的網絡分成了一個個小的網段,減少了沖突的概率,提高了網絡傳輸效率,這就是交換機的意義。

這樣,我們就組建了一個以太網。

互聯網

現在一個個的網絡都是分散的,不管是以太網,還是用電信網絡連接的網絡,或者是衛星連接的網絡,那自然有需求把這些分散的網絡給連接起來,這就是互聯網,也就是把網絡連接起來的網絡。

互聯網也有很多,比如軍隊的各種網絡會建立一個互聯網,教育的各種網絡會建立互聯網,互聯網和互聯網之間還可以連接,最大的互聯網就是因特網 internet,大到全世界的很多網絡都會連入的那種。但也有的互聯網是不接入 internet 的,比如軍用的互聯網。

那這些網絡之間是怎么標識和連接的呢?

標識網絡自然就需要編號,并且網絡內的主機也需要編號,也就是需要指定網絡號 + 主機號,這就是 IP 地址。

IP 地址最開始是 32 位的,叫做 IPv4(后來擴充成了 132 位的,叫做 IPv6)。

比如這樣就是一個 IPv4 的地址:

11010010010010011000110000000100

為了好記,我們把它分為了四段,每段 8 位,就成了這樣:

210.73.140.2

這分為 4 段的 32 位地址里有網絡號也有主機號。如果把第一段當作網絡號,那剩下的三段就是主機號,可以標識 1600 多萬臺計算機,如果把前兩段當作網絡號,那可以標識 6 萬多臺計算機,如果把前三段當作網絡號,那只有最后一段用于標識主機,可以標識 254 臺計算機。這樣就分為了 ABC 三類網絡。

講完了 IP 地址,再回來講最大的互聯網 internet。

internet 是連接全球很多網絡的互聯網,那自然有個主干網,然后下面接入各個國家的網絡。每個國家都有專門的接入 internet 的網絡提供商(ISP internet service provider),比如中國有聯通、移動、鐵通等 ISP,由他們接入 internet,我們再接入他們的網絡。

那網絡之間是怎么連接的呢?

就是通過路由器,路由器連接多個網絡,負責根據 IP 地址選擇把數據傳到某個網絡。

很多同學分不清路由器和交換機的區別,其實很好區分:交換機是網絡內部隔離沖突域、提高網絡效率用的,根據 mac 地址轉發消息。路由器是負責在不同的網絡之間轉發數據,根據 IP 地址確定網絡和主機然后轉發。

IP 地址里記錄了網絡號和主機號,所以根據網絡號就能確定是哪個網絡,那怎么根據主機號確定哪臺主機呢?

在這個網絡里廣播一次不就行了?把 IP 地址傳遞給網絡的每一臺主機,如果是自己的,那就返回自己的 mac 地址,這樣路由器就知道該把消息傳給誰了。這種從 IP 到 mac 地址的查詢過程叫做 ARP(Address Resolution Protocol 地址解析)協議。

至此,我們就完成了從 IP 到 IP 的通信,再上面的協議我們就比較熟了,也就是 TCP、HTTP 這些,這些是我們軟件開發整天用的協議。

總結

計算機網絡是分層的,OSI 體系結構分了 7 層,實際用的 TCP/IP 體系結構分了 4 層,為了學習方便我們還是作為 5 層來看。

分層的好處就是每一層都可以靈活的替換實現方案,比如只要你實現了 IP 到 IP 的通信,不管你是衛星連接的網絡、電信連接的網絡還是以太網,都可以,對上層的各種協議沒影響。

衛星、電話網絡等都是已有的網絡,我們自己組建的網絡一般都是按照以太網的方式,也就是一根網線連接所有計算機的方式,叫做總線式。

以太網內是廣播通信的,為了避免沖突,會通過指數退避的方式來發消息,但這會降低傳輸效率,所以引入了交換機來隔離沖突域,也就把網絡分成了不同的網段,交換機遇到同一網段的通信是不會傳遞到其他網段的,這樣就減少了沖突的概率。

網絡和網絡之間連接起來就叫做互聯網,互聯網有很多種,全球最大的互聯網是 internet,但也不是所有的互聯網都在 internet 里,比如軍用互聯網就不會連入 internet。

internet 有主干網來連接各個國家和地區的網絡,每個國家都有負責接入 internet 的互聯網服務提供商 ISP,比如中國的聯通、移動、鐵通等運營商。

網絡的標識是通過 IP,也就是網絡號 + 主機號構成,然后由路由器負責通過 IP 來做網絡之間的數據轉發。

路由器實現轉發要先根據 IP 種的主機號來查出 mac 地址,對應的查詢協議叫做 ARP 協議,也是通過廣播的方式實現的。

這樣就實現了 internet 上任意兩臺主機的 IP 到 IP 的通信。

我們平時軟件開發時用的 IP、TCP、HTTP、DNS 等協議,都是在這些基礎之上實現的。網絡層之下的知識,確實對我們開發沒啥幫助,但了解下還是挺有意思的。

標簽: