04 從物理層到MAC層以及ARP

目錄:

http://www.itdecent.cn/p/1961df2a1336

第一層(物理層)

我們常說(shuō)的路由器,是在第三層上。

網(wǎng)線有的是電腦連電腦,有的是電腦連網(wǎng)口。

對(duì)于電腦連電腦。這種方式就是一根網(wǎng)線,有兩個(gè)頭。一頭插在一臺(tái)電腦的網(wǎng)卡上,另一頭插在另一臺(tái)電腦的網(wǎng)卡上。水晶頭要做交叉線,用的就是1-3、2-6 交叉接法。

水晶頭的第 1、2 和第 3、6 腳,它們分別起著收、發(fā)信號(hào)的作用。將一端的 1 號(hào)和 3 號(hào)線、2 號(hào)和 6 號(hào)線互換一下位置,就能夠在物理層實(shí)現(xiàn)一端發(fā)送的信號(hào),另一端能收到。

電腦連電腦,除了網(wǎng)線要交叉,還需要配置這兩臺(tái)電腦的 IP 地址、子網(wǎng)掩碼和默認(rèn)網(wǎng)關(guān)。要想兩臺(tái)電腦能夠通信,這三項(xiàng)必須配置成為一個(gè)網(wǎng)絡(luò),可以一個(gè)是 192.168.0.1/24,另一個(gè)是 192.168.0.2/24,否則是不通的。

兩臺(tái)電腦之間的網(wǎng)絡(luò)包,包含 MAC 層,要完整。IP 層要封裝了 MAC 層才能將包放入物理層。

到此為止,兩臺(tái)電腦已經(jīng)構(gòu)成了一個(gè)最小的局域網(wǎng),也即LAN。

怎么把三臺(tái)電腦連在一起呢?

使用集線器(Hub)。這種設(shè)備有多個(gè)口,可以將多臺(tái)電腦連接起來(lái)。但是,和交換機(jī)不同,集線器沒有大腦,它完全在物理層工作。它會(huì)將自己收到的每一個(gè)字節(jié),都復(fù)制到其他端口上去。這是第一層物理層聯(lián)通的方案。

第二層(數(shù)據(jù)鏈路層)

Hub 采取的是廣播的模式,如果每一臺(tái)電腦發(fā)出的包,每個(gè)電腦都能收到,這樣就會(huì)很麻煩。需要解決幾個(gè)問(wèn)題:

  • 這個(gè)包是發(fā)給誰(shuí)的?誰(shuí)應(yīng)該接收?
  • 大家都在發(fā),會(huì)不會(huì)產(chǎn)生混亂?有沒有誰(shuí)先發(fā)、誰(shuí)后發(fā)的規(guī)則?
  • 如果發(fā)送的時(shí)候出現(xiàn)了錯(cuò)誤,怎么辦?

解決的是上面第二個(gè)問(wèn)題

這幾個(gè)問(wèn)題,都是第二層,數(shù)據(jù)鏈路層,也即 MAC 層要解決的問(wèn)題。MAC的全稱是Medium Access Control,即媒體訪問(wèn)控制。就是控制在往媒體上發(fā)數(shù)據(jù)的時(shí)候,誰(shuí)先發(fā)、誰(shuí)后發(fā)的問(wèn)題。防止發(fā)生混亂。這解決的是上面第二個(gè)問(wèn)題。這個(gè)問(wèn)題中的規(guī)則,學(xué)名叫多路訪問(wèn)。有很多算法可以解決這個(gè)問(wèn)題。比如接下來(lái)這三種方式:

  • 方式一:分多個(gè)車道。每個(gè)車一個(gè)車道,你走你的,我走我的。這在計(jì)算機(jī)網(wǎng)絡(luò)里叫作信道劃分;

  • 方式二:今天單號(hào)出行,明天雙號(hào)出行,輪著來(lái)。這在計(jì)算機(jī)網(wǎng)絡(luò)里叫作輪流協(xié)議;

  • 方式三:不管三七二十一,有事兒先出門,發(fā)現(xiàn)特堵,就回去。錯(cuò)過(guò)高峰再出。叫作隨機(jī)接入?yún)f(xié)議。著名的以太網(wǎng),用的就是這個(gè)方式。

解決的是上面第一個(gè)問(wèn)題

這里用到一個(gè)物理地址,叫作鏈路層地址。但是因?yàn)榈诙又饕鉀Q媒體接入控制的問(wèn)題,所以它常被稱為MAC 地址。

解決這個(gè)問(wèn)題就牽扯到第二層的網(wǎng)絡(luò)包格式。對(duì)于以太網(wǎng),第二層的最開始,就是目標(biāo)的 MAC 地址和源的 MAC 地址。

第二層網(wǎng)絡(luò)包格式.png

接下來(lái)是類型,大部分的類型是 IP 數(shù)據(jù)包,然后 IP 里面包含 TCP、UDP,以及 HTTP 等,這都是里層封裝的事情。


有了目標(biāo) MAC 地址,數(shù)據(jù)包在鏈路上廣播,MAC 的網(wǎng)卡才能發(fā)現(xiàn),這個(gè)包是給它的。MAC 的網(wǎng)卡把包收進(jìn)來(lái),然后打開 IP 包,發(fā)現(xiàn) IP 地址也是自己的,再打開 TCP 包,發(fā)現(xiàn)端口是自己,也就是 80,而 nginx 就是監(jiān)聽 80。于是將請(qǐng)求提交給 nginx,nginx 返回一個(gè)網(wǎng)頁(yè)。然后將網(wǎng)頁(yè)需要發(fā)回請(qǐng)求的機(jī)器。然后層層封裝,最后到 MAC 層。因?yàn)閬?lái)的時(shí)候有源 MAC 地址,返回的時(shí)候,源 MAC 就變成了目標(biāo) MAC,再返給請(qǐng)求的機(jī)器。

解決的是上面第三個(gè)問(wèn)題
第二層的最后面是CRC,也就是循環(huán)冗余檢測(cè)。通過(guò) XOR 異或的算法,來(lái)計(jì)算整個(gè)包是否在發(fā)送的過(guò)程中出現(xiàn)了錯(cuò)誤,主要解決發(fā)送錯(cuò)誤的問(wèn)題。

ARP 協(xié)議

一個(gè)廣播的網(wǎng)絡(luò)里面接入了 N 臺(tái)機(jī)器, 我怎么知道每個(gè) MAC 地址是誰(shuí)呢?這就是ARP 協(xié)議, 也就是已知 IP 地址, 求 MAC 地址的協(xié)議。

ARP 協(xié)議.png

在一個(gè)局域網(wǎng)里面,當(dāng)知道了 IP 地址,不知道 MAC 怎么辦呢?靠“吼”。 DHCP也是靠“吼”,新接入一個(gè)網(wǎng)絡(luò)的機(jī)器獲取分配的IP地址。

ARP 協(xié)議流程.png

發(fā)送一個(gè)廣播包,誰(shuí)是這個(gè) IP 誰(shuí)來(lái)回答。具體詢問(wèn)和回答的報(bào)文如下:

ARP 報(bào)文.png

為了避免每次都用 ARP 請(qǐng)求,機(jī)器本地也會(huì)進(jìn)行 ARP 緩存。由于機(jī)器存在不斷上線下線,IP 也可能會(huì)變,所以 ARP 的 MAC 地址緩存過(guò)一段時(shí)間就會(huì)過(guò)期。

交換機(jī)

這種使用HUB組網(wǎng)的方法,對(duì)少數(shù)電腦沒有問(wèn)題,但是一旦機(jī)器數(shù)目增多,問(wèn)題就出現(xiàn)了。Hub 是廣播的,不管某個(gè)接口是否需要,所有的 Bit 都會(huì)被發(fā)送出去,然后讓主機(jī)來(lái)判斷是不是需要。這種方式路上的車少就沒問(wèn)題,車一多,產(chǎn)生沖突的概率就提高了。而且把不需要的包轉(zhuǎn)發(fā)過(guò)去,純屬浪費(fèi)。

二層設(shè)備交換機(jī)可以很好地解決這個(gè)問(wèn)題,會(huì)把 MAC頭拿下來(lái), 檢查一下目標(biāo) MAC 地址, 然后根據(jù)策略轉(zhuǎn)發(fā),而不是傻傻地都轉(zhuǎn)發(fā)。

交換機(jī)通過(guò)學(xué)習(xí),知道每個(gè)口的電腦的 MAC 地址。

交換機(jī)學(xué)習(xí)過(guò)程

一臺(tái) MAC1 電腦將一個(gè)包發(fā)送給另一臺(tái) MAC2 電腦,當(dāng)這個(gè)包到達(dá)交換機(jī)的時(shí)候,一開始交換機(jī)也不知道 MAC2 的電腦在哪個(gè)口,所以沒辦法,它只能將包轉(zhuǎn)發(fā)給出了來(lái)的那個(gè)口之外的其他所有的口。但是,這個(gè)時(shí)候,交換機(jī)會(huì)記住,MAC1 是來(lái)自一個(gè)明確的口。以后有包的目的地址是 MAC1 的,直接發(fā)送到這個(gè)口就可以了。

轉(zhuǎn)發(fā)表

過(guò)了一段時(shí)間之后,就有了整個(gè)網(wǎng)絡(luò)的一個(gè)結(jié)構(gòu)了,這個(gè)時(shí)候,基本上不用廣播了,全部可以準(zhǔn)確轉(zhuǎn)發(fā)。由于每個(gè)機(jī)器的 IP 地址會(huì)變,所在的口也會(huì)變,因而交換機(jī)上的學(xué)習(xí)的結(jié)果(轉(zhuǎn)發(fā)表),是有一個(gè)過(guò)期時(shí)間的。

小結(jié)

第一·, MAC 層是用來(lái)解決多路訪問(wèn)的堵車問(wèn)題的;
第二·, ARP 是通過(guò)吼的方式來(lái)尋找目標(biāo) MAC 地址的, 吼完之后記住一段時(shí)間, 這個(gè)叫作緩存;
第三, 交換機(jī)是有 MAC 地址學(xué)習(xí)能力的, 學(xué)完了它就知道誰(shuí)在哪兒了, 不用廣播了。

參考資料:

趣談網(wǎng)絡(luò)協(xié)議(極客時(shí)間)鏈接:
http://gk.link/a/106nW


GitHub鏈接:
https://github.com/lichangke/LeetCode

知乎個(gè)人首頁(yè):
https://www.zhihu.com/people/lichangke/

簡(jiǎn)書個(gè)人首頁(yè):
http://www.itdecent.cn/u/3e95c7555dc7

歡迎大家來(lái)一起交流學(xué)習(xí)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容