從 IP 到 IP,聊聊計(jì)算機(jī)網(wǎng)絡(luò)中那些“沒用的”知識
web 開發(fā)離不開計(jì)算機(jī)網(wǎng)絡(luò),計(jì)算機(jī)網(wǎng)絡(luò)很重要,但不是所有的網(wǎng)絡(luò)知識對軟件開發(fā)都是有用的。
我們知道,網(wǎng)絡(luò)是分層的,OSI 體系中分了 7 層,但實(shí)際上使用的 TCP/IP 體系中分了 4 層,學(xué)習(xí)的時(shí)候?yàn)榱朔奖悖覀冞€是把物理層、數(shù)據(jù)鏈路層分開學(xué)的,所以是 5 層。
開發(fā)時(shí)我們會用 IP、TCP、HTTP 等協(xié)議來完成計(jì)算機(jī)之間的通信,網(wǎng)頁運(yùn)行時(shí)還會涉及到 DNS 等協(xié)議,這些協(xié)議都是在網(wǎng)絡(luò)層之上的,也就是基于 IP 到 IP 的傳輸來完成各種協(xié)議的數(shù)據(jù)通信。
那之下的部分呢?IP 到 IP 的通信是如何實(shí)現(xiàn)的?
這就涉及到物理層、數(shù)據(jù)鏈路層還有網(wǎng)絡(luò)層的知識了,這些知識對實(shí)際的開發(fā)沒啥用,因?yàn)榇a里已經(jīng)默認(rèn)了 IP 和 IP 之間是可以通信的,但是了解這些可以讓我們對網(wǎng)絡(luò)有一個(gè)全面的理解。這部分涉及到網(wǎng)絡(luò)硬件、涉及到通信原理,還是挺有意思的。
這篇文章就淺談下 IP 和 IP 之間的通信的知識。
不同類型的網(wǎng)絡(luò)
把不同的計(jì)算機(jī)連接起來,可以做數(shù)據(jù)通信,可以共享軟件、硬件,這就叫做計(jì)算機(jī)網(wǎng)絡(luò)。
這種連接方式有很多種,自然也就有不同的網(wǎng)絡(luò)。比如撥號上網(wǎng),是利用電話通信的網(wǎng)絡(luò)來傳輸數(shù)據(jù)的,就像打電話一樣,所以叫撥號,只不過傳輸?shù)臄?shù)據(jù)不是通話數(shù)據(jù)。比如衛(wèi)星上網(wǎng),是利用衛(wèi)星信號來傳輸數(shù)據(jù),這也是一種網(wǎng)絡(luò)。
這兩種都是用的現(xiàn)有的網(wǎng)絡(luò)來實(shí)現(xiàn)計(jì)算機(jī)通信。而我們自己組建的網(wǎng)絡(luò)都是用網(wǎng)線連接的,這種是最常見的網(wǎng)絡(luò)。
比如這樣:
這種通過一根線把所有的計(jì)算機(jī)連接起來的網(wǎng)絡(luò)連接方式叫做以太網(wǎng)。
在講以太網(wǎng)之前,不知道大家是否已經(jīng)感受到了網(wǎng)絡(luò)分層的好處:
不管是利用電信網(wǎng)絡(luò)的撥號上網(wǎng),還是利用衛(wèi)星通信的衛(wèi)星上網(wǎng),或者是用網(wǎng)線連接起來的以太網(wǎng),這些不同結(jié)構(gòu)的網(wǎng)絡(luò)都能很自然的融合在一起,就是因?yàn)樽隽撕芎玫姆謱?,只要?shí)現(xiàn)了 IP 協(xié)議,那么不管網(wǎng)絡(luò)是怎么實(shí)現(xiàn)的,都能實(shí)現(xiàn)更上層協(xié)議的通信。
這就像軟件開發(fā)領(lǐng)域的面向接口編程的思想,只要你能實(shí)現(xiàn) IP 到 IP 的通信,不管你是怎么傳輸?shù)臄?shù)據(jù),都可以。
電信和衛(wèi)星的網(wǎng)絡(luò)不咋用關(guān)注,我們還是繼續(xù)講以太網(wǎng):
多臺計(jì)算機(jī)已經(jīng)用網(wǎng)線連接起來了,那怎么通信呢?
直接通過這條網(wǎng)線傳遞數(shù)據(jù)就行,只不過現(xiàn)在是一個(gè)發(fā)其余的都能接收到,要讓目標(biāo)計(jì)算機(jī)能接收,那就得標(biāo)識下目的地址是啥,所以以太網(wǎng)的數(shù)據(jù)幀格式是這樣的:
除了數(shù)據(jù)外,額外加上了目的地址、原地址等信息。
這樣每臺計(jì)算機(jī)接收到網(wǎng)絡(luò)傳過來的數(shù)據(jù)之后,判斷下是否目的地址是自己,是就接收,否則丟棄。這樣就實(shí)現(xiàn)了網(wǎng)絡(luò)通信。
這就是一個(gè)網(wǎng)絡(luò)了?就這么簡單?
這確實(shí)是一個(gè)小型網(wǎng)絡(luò),但還不完善。如果多臺計(jì)算機(jī)同時(shí)發(fā)消息怎么辦,數(shù)據(jù)不就混在一塊了?
所以要做是否沖突的檢測,現(xiàn)在以太網(wǎng)用的方式是這樣:想要通過網(wǎng)絡(luò)發(fā)消息時(shí),先檢測下網(wǎng)絡(luò)中有沒有電信號,沒有的話就發(fā),有的話就等待 1.x 秒,x 是隨機(jī)的,如果到了時(shí)間還有沖突,那就等待 2.x 秒、4.x 秒、8.x 秒,通過這樣的方式來避免沖突,實(shí)現(xiàn)準(zhǔn)確的通信,這叫做“指數(shù)退避”。
這樣確實(shí)不會沖突了,但是還有問題,如果計(jì)算機(jī)連了很多,雖然能準(zhǔn)確的通信,但時(shí)不時(shí)就沖突的話效率也太低了。
能不能減少沖突呢?
連在一起的以太網(wǎng)的計(jì)算機(jī)因?yàn)槭菑V播通信的,所以可能可能沖突,這叫做一個(gè)“沖突域”。如果能把大的沖突域給拆小,那不就能減少沖突的概率了?
這就是交換機(jī)做的事情了:
幾臺電腦之間加一個(gè)交換機(jī)來隔開,這樣傳輸消息的時(shí)候,如果是同一個(gè)小網(wǎng)段內(nèi)的通信,會直接傳給目標(biāo)計(jì)算機(jī),不會傳到其他網(wǎng)段里去,本網(wǎng)段沒有該 mac 地址的時(shí)候才傳到其他網(wǎng)段,這樣就把大的網(wǎng)絡(luò)分成了一個(gè)個(gè)小的網(wǎng)段,減少了沖突的概率,提高了網(wǎng)絡(luò)傳輸效率,這就是交換機(jī)的意義。
這樣,我們就組建了一個(gè)以太網(wǎng)。
互聯(lián)網(wǎng)
現(xiàn)在一個(gè)個(gè)的網(wǎng)絡(luò)都是分散的,不管是以太網(wǎng),還是用電信網(wǎng)絡(luò)連接的網(wǎng)絡(luò),或者是衛(wèi)星連接的網(wǎng)絡(luò),那自然有需求把這些分散的網(wǎng)絡(luò)給連接起來,這就是互聯(lián)網(wǎng),也就是把網(wǎng)絡(luò)連接起來的網(wǎng)絡(luò)。
互聯(lián)網(wǎng)也有很多,比如軍隊(duì)的各種網(wǎng)絡(luò)會建立一個(gè)互聯(lián)網(wǎng),教育的各種網(wǎng)絡(luò)會建立互聯(lián)網(wǎng),互聯(lián)網(wǎng)和互聯(lián)網(wǎng)之間還可以連接,最大的互聯(lián)網(wǎng)就是因特網(wǎng) internet,大到全世界的很多網(wǎng)絡(luò)都會連入的那種。但也有的互聯(lián)網(wǎng)是不接入 internet 的,比如軍用的互聯(lián)網(wǎng)。
那這些網(wǎng)絡(luò)之間是怎么標(biāo)識和連接的呢?
標(biāo)識網(wǎng)絡(luò)自然就需要編號,并且網(wǎng)絡(luò)內(nèi)的主機(jī)也需要編號,也就是需要指定網(wǎng)絡(luò)號 + 主機(jī)號,這就是 IP 地址。
IP 地址最開始是 32 位的,叫做 IPv4(后來擴(kuò)充成了 132 位的,叫做 IPv6)。
比如這樣就是一個(gè) IPv4 的地址:11010010010010011000110000000100
為了好記,我們把它分為了四段,每段 8 位,就成了這樣:210.73.140.2
這分為 4 段的 32 位地址里有網(wǎng)絡(luò)號也有主機(jī)號。如果把第一段當(dāng)作網(wǎng)絡(luò)號,那剩下的三段就是主機(jī)號,可以標(biāo)識 1600 多萬臺計(jì)算機(jī),如果把前兩段當(dāng)作網(wǎng)絡(luò)號,那可以標(biāo)識 6 萬多臺計(jì)算機(jī),如果把前三段當(dāng)作網(wǎng)絡(luò)號,那只有最后一段用于標(biāo)識主機(jī),可以標(biāo)識 254 臺計(jì)算機(jī)。這樣就分為了 ABC 三類網(wǎng)絡(luò)。
講完了 IP 地址,再回來講最大的互聯(lián)網(wǎng) internet。
internet 是連接全球很多網(wǎng)絡(luò)的互聯(lián)網(wǎng),那自然有個(gè)主干網(wǎng),然后下面接入各個(gè)國家的網(wǎng)絡(luò)。每個(gè)國家都有專門的接入 internet 的網(wǎng)絡(luò)提供商(ISP internet service provider),比如中國有聯(lián)通、移動、鐵通等 ISP,由他們接入 internet,我們再接入他們的網(wǎng)絡(luò)。
那網(wǎng)絡(luò)之間是怎么連接的呢?
就是通過路由器,路由器連接多個(gè)網(wǎng)絡(luò),負(fù)責(zé)根據(jù) IP 地址選擇把數(shù)據(jù)傳到某個(gè)網(wǎng)絡(luò)。
很多同學(xué)分不清路由器和交換機(jī)的區(qū)別,其實(shí)很好區(qū)分:交換機(jī)是網(wǎng)絡(luò)內(nèi)部隔離沖突域、提高網(wǎng)絡(luò)效率用的,根據(jù) mac 地址轉(zhuǎn)發(fā)消息。路由器是負(fù)責(zé)在不同的網(wǎng)絡(luò)之間轉(zhuǎn)發(fā)數(shù)據(jù),根據(jù) IP 地址確定網(wǎng)絡(luò)和主機(jī)然后轉(zhuǎn)發(fā)。
IP 地址里記錄了網(wǎng)絡(luò)號和主機(jī)號,所以根據(jù)網(wǎng)絡(luò)號就能確定是哪個(gè)網(wǎng)絡(luò),那怎么根據(jù)主機(jī)號確定哪臺主機(jī)呢?
在這個(gè)網(wǎng)絡(luò)里廣播一次不就行了?把 IP 地址傳遞給網(wǎng)絡(luò)的每一臺主機(jī),如果是自己的,那就返回自己的 mac 地址,這樣路由器就知道該把消息傳給誰了。這種從 IP 到 mac 地址的查詢過程叫做 ARP(Address Resolution Protocol 地址解析)協(xié)議。
至此,我們就完成了從 IP 到 IP 的通信,再上面的協(xié)議我們就比較熟了,也就是 TCP、HTTP 這些,這些是我們軟件開發(fā)整天用的協(xié)議。
總結(jié)
計(jì)算機(jī)網(wǎng)絡(luò)是分層的,OSI 體系結(jié)構(gòu)分了 7 層,實(shí)際用的 TCP/IP 體系結(jié)構(gòu)分了 4 層,為了學(xué)習(xí)方便我們還是作為 5 層來看。
分層的好處就是每一層都可以靈活的替換實(shí)現(xiàn)方案,比如只要你實(shí)現(xiàn)了 IP 到 IP 的通信,不管你是衛(wèi)星連接的網(wǎng)絡(luò)、電信連接的網(wǎng)絡(luò)還是以太網(wǎng),都可以,對上層的各種協(xié)議沒影響。
衛(wèi)星、電話網(wǎng)絡(luò)等都是已有的網(wǎng)絡(luò),我們自己組建的網(wǎng)絡(luò)一般都是按照以太網(wǎng)的方式,也就是一根網(wǎng)線連接所有計(jì)算機(jī)的方式,叫做總線式。
以太網(wǎng)內(nèi)是廣播通信的,為了避免沖突,會通過指數(shù)退避的方式來發(fā)消息,但這會降低傳輸效率,所以引入了交換機(jī)來隔離沖突域,也就把網(wǎng)絡(luò)分成了不同的網(wǎng)段,交換機(jī)遇到同一網(wǎng)段的通信是不會傳遞到其他網(wǎng)段的,這樣就減少了沖突的概率。
網(wǎng)絡(luò)和網(wǎng)絡(luò)之間連接起來就叫做互聯(lián)網(wǎng),互聯(lián)網(wǎng)有很多種,全球最大的互聯(lián)網(wǎng)是 internet,但也不是所有的互聯(lián)網(wǎng)都在 internet 里,比如軍用互聯(lián)網(wǎng)就不會連入 internet。
internet 有主干網(wǎng)來連接各個(gè)國家和地區(qū)的網(wǎng)絡(luò),每個(gè)國家都有負(fù)責(zé)接入 internet 的互聯(lián)網(wǎng)服務(wù)提供商 ISP,比如中國的聯(lián)通、移動、鐵通等運(yùn)營商。
網(wǎng)絡(luò)的標(biāo)識是通過 IP,也就是網(wǎng)絡(luò)號 + 主機(jī)號構(gòu)成,然后由路由器負(fù)責(zé)通過 IP 來做網(wǎng)絡(luò)之間的數(shù)據(jù)轉(zhuǎn)發(fā)。
路由器實(shí)現(xiàn)轉(zhuǎn)發(fā)要先根據(jù) IP 種的主機(jī)號來查出 mac 地址,對應(yīng)的查詢協(xié)議叫做 ARP 協(xié)議,也是通過廣播的方式實(shí)現(xiàn)的。
這樣就實(shí)現(xiàn)了 internet 上任意兩臺主機(jī)的 IP 到 IP 的通信。
我們平時(shí)軟件開發(fā)時(shí)用的 IP、TCP、HTTP、DNS 等協(xié)議,都是在這些基礎(chǔ)之上實(shí)現(xiàn)的。網(wǎng)絡(luò)層之下的知識,確實(shí)對我們開發(fā)沒啥幫助,但了解下還是挺有意思的。