1. 程式人生 > >網路程式設計懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?

網路程式設計懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?

1、前言

標題雖然是為了解釋有了 IP 地址,為什麼還要用 MAC 地址,但是本文的重點在於理解為什麼要有 IP 這樣的東西。本文對讀者的定位是知道 MAC 地址是什麼,IP 地址是什麼。

(本文同步釋出於:http://www.52im.net/thread-2067-1-1.html

2、關於作者

翟志軍,個人部落格地址:https://showme.codes/,Github:https://github.com/zacker330。感謝作者的原創分享。

作者的另一篇《即時通訊安全篇(七):如果這樣來理解HTTPS,一篇就夠了》也寫的非常好,有興趣的讀者可以深讀之。

3、系列文章

本文是系列文章中的第9篇,本系列文章的大綱如下:

網路程式設計懶人入門(一):快速理解網路通訊協議(上篇)

網路程式設計懶人入門(二):快速理解網路通訊協議(下篇)

網路程式設計懶人入門(三):快速理解TCP協議一篇就夠

網路程式設計懶人入門(四):快速理解TCP和UDP的差異

網路程式設計懶人入門(五):快速理解為什麼說UDP有時比TCP更有優勢

網路程式設計懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門

網路程式設計懶人入門(七):深入淺出,全面理解HTTP協議

網路程式設計懶人入門(八):手把手教你寫基於TCP的Socket長連線

網路程式設計懶人入門(九):通俗講解,有了IP地址,為何還要用MAC地址?》(本文)

本站的《腦殘式網路程式設計入門》也適合入門學習,本系列大綱如下:

腦殘式網路程式設計入門(一):跟著動畫來學TCP三次握手和四次揮手

腦殘式網路程式設計入門(二):我們在讀寫Socket時,究竟在讀寫什麼?

腦殘式網路程式設計入門(三):HTTP協議必知必會的一些知識

腦殘式網路程式設計入門(四):快速理解HTTP/2的伺服器推送(Server Push)

如果您覺得本系列文章過於基礎,您可直接閱讀《不為人知的網路程式設計》系列文章,該系列目錄如下:

不為人知的網路程式設計(一):淺析TCP協議中的疑難雜症(上篇)

不為人知的網路程式設計(二):淺析TCP協議中的疑難雜症(下篇)

不為人知的網路程式設計(三):關閉TCP連線時為什麼會TIME_WAIT、CLOSE_WAIT

不為人知的網路程式設計(四):深入研究分析TCP的異常關閉

不為人知的網路程式設計(五):UDP的連線性和負載均衡

不為人知的網路程式設計(六):深入地理解UDP協議並用好它

關於移動端網路特性及優化手段的總結性文章請見:

現代移動端網路短連線的優化手段總結:請求速度、弱網適應、安全保障

移動端IM開發者必讀(一):通俗易懂,理解行動網路的“弱”和“慢”

移動端IM開發者必讀(二):史上最全移動弱網路優化方法總結

4、書上說的

基本概念:

如今的網路是分層來實現的,就像是搭積木一樣,先設計某個特定功能的模組,然後把模組拼起來組成整個網路。區域網也不例外,一般來說,在組網上我們使用的是IEEE802參考模型,從下至上分為:物理層、媒體接入控制層(MAC),邏輯鏈路控制層(LLC)。 

標識網路中的一臺計算機,一般至少有三種方法,最常用的是域名地址、IP地址和MAC地址,分別對應應用層、網路層、物理層。網路管理一般就是在網路層針對IP地址進行管理,但由於一臺計算機的IP地址可以由使用者自行設定,管理起來相對困難,MAC地址一般不可更改,所以把IP地址同MAC地址組合到一起管理就成為常見的管理方式。 

什麼是MAC地址?

MAC地址就是在媒體接入層上使用的地址,也叫實體地址、硬體地址或鏈路地址,由網路裝置製造商生產時寫在硬體內部。MAC地址與網路無關,也即無論將帶有這個地址的硬體(如網絡卡、集線器、路由器等)接入到網路的何處,都有相同的MAC地址,它由廠商寫在網絡卡的BIOS裡。MAC地址可採用6位元組(48位元)或2位元組(16位元)這兩種中的任意一種。但隨著區域網規模越來越大,一般都採用6位元組的MAC地址。這個48位元都有其規定的意義,前24位是由生產網絡卡的廠商向IEEE申請的廠商地址,目前的價格是1000美元買一個地址塊,後24位由廠商自行分配,這樣的分配使得世界上任意一個擁有48位MAC 地址的網絡卡都有唯一的標識。另外,2位元組的MAC地址不用網絡卡廠商申請。 

MAC地址通常表示為12個16進位制數,每2個16進位制數之間用冒號隔開,如:08:00:20:0A:8C:6D就是一個MAC地址,其中前6位16進位制數08:00:20代表網路硬體製造商的編號,它由IEEE分配,而後6位16進位制數0A:8C:6D代表該製造商所製造的某個網路產品(如網絡卡)的系列號。每個網路製造商必須確保它所製造的每個乙太網裝置都具有相同的前三位元組以及不同的後三個位元組。這樣就可保證世界上每個乙太網裝置都具有唯一的MAC 地址。

什麼是IP地址?

IP地址是指網際網路協議地址(英語:Internet Protocol Address,又譯為網際協議地址),是IP Address的縮寫。IP地址是IP協議提供的一種統一的地址格式,它為網際網路上的每一個網路和每一臺主機分配一個邏輯地址,以此來遮蔽實體地址的差異。

為什麼要用到MAC地址?

這是由組網方式決定的,如今比較流行的接入Internet的方式(也是未來發展的方向)是把主機通過區域網組織在一起,然後再通過交換機和 Internet相連線。這樣一來就出現瞭如何區分具體使用者,防止盜用的問題。由於IP只是邏輯上標識,任何人都隨意修改,因此不能用來標識使用者;而 MAC地址則不然,它是固化在網卡里面的。從理論上講,除非盜來硬體(網絡卡),否則是沒有辦法冒名頂替的(注意:其實也可以盜用,後面將介紹)。 

基於MAC地址的這種特點,區域網採用了用MAC地址來標識具體使用者的方法。注意:具體實現:在交換機內部通過“表”的方式把MAC地址和IP地址一一對應,也就是所說的IP、MAC繫結。 

具體的通訊方式:接收過程,當有發給本地區域網內一臺主機的資料包時,交換機接收下來,然後把資料包中的IP地址按照“表”中的對應關係對映成MAC地址,轉發到對應的MAC地址的主機上,這樣一來,即使某臺主機盜用了這個IP地址,但由於他沒有這個MAC地址,因此也不會收到資料包。傳送過程和接收過程類似,限於篇幅不敘述。 

綜上可知,只有IP而沒有對應的MAC地址在這種區域網內是不能上網的,於是解決了IP盜用問題。

IP地址與MAC地址的區別是什麼?

IP地址基於邏輯,比較靈活,不受硬體限制,也容易記憶。MAC地址在一定程度上與硬體一致,基於物理,能夠標識具體。這兩種地址各有好處,使用時也因條件而採取不同的地址。 

MAC地址涉及到的安全問題:

從上面的介紹可以知道,這種標識方式只是MAC地址基於的,如果有人能夠更改MAC地址,就可以盜用IP免費上網了,目前網上針對小區寬頻的盜用MAC地址免費上網方式就是基於此這種思路。如果想盜用別人的IP地址,除了IP地址還要知道對應的MAC地址。舉個例子,獲得區域網內某臺主機的MAC地址,比如想得到區域網內名為TARGET主機的MAC地址,先用PING命令:PING TARGET,這樣在我們主機上面的ARP表的快取中就會留下目標地址和MAC對映的記錄,然後通過ARP A命令來查詢ARP表,這樣就得到了指定主機的MAC地址。最後用ARP -s IP 網絡卡MAC地址,命令把閘道器的IP地址和它的MAC地址對映起來就可以了。

如果要得到其它網段內的MAC地址,那麼可以用工具軟體來實現,我覺得Windows優化大 

師中自帶的工具不錯,點選“系統性能優化”→“系統安全優化”→“附加工具”→“叢集Ping”,可以成批的掃出MAC地址並可以儲存到檔案。

小知識:ARP(Address Resolution Protocol)是地址解析協議,ARP是一種將IP地址轉化成實體地址的協議。從IP地址到實體地址的對映有兩種方式:表格方式和非表格方式。ARP 具體說來就是將網路層(IP層,也就是相當於OSI的第三層)地址解析為資料連線層(MAC層,也就是相當於OSI的第二層)的MAC地址。ARP協議是通過IP地址來獲得MAC地址的。

ARP原理:郴鰽要向主機B傳送報文,會查詢本地的ARP快取表,找到B的IP地址對應的MAC地址後就會進行資料傳輸。如果未找到,則廣播A一個 ARP請求報文(攜帶主機A的IP地址Ia——實體地址Pa),請求IP地址為Ib的主機B回答實體地址Pb。網上所有主機包括B都收到ARP請求,但只有主機B識別自己的IP地址,於是向A主機發回一個ARP響應報文。其中就包含有B的MAC地址,A接收到B的應答後,就會更新本地的ARP快取。接著使用這個MAC地址傳送資料(由網絡卡附加MAC地址)。因此,本地快取記憶體的這個ARP表是本地網路流通的基礎,而且這個快取是動態的。ARP表:為了回憶通訊的速度,最近常用的MAC地址與IP的轉換不用依靠交換機來進行,而是在本機上建立一個用來記錄常用主機IP-MAC對映表,即ARP表。

5、最通俗的解釋

看完上一節中各種書籍裡對IP地址、MAC地址的理解介紹和說明,還是很蒙逼,那麼請繼續看完本節吧。

5.1 網路洪荒時代 

一開始時,網路中的機器並不多。大家都連到同一個集線器就可以了,就可以實現互通。這時,機器 A 發訊息到機器 B ,訊息頭裡附上機器 B 的MAC,集線器收到訊息後就廣播給所有連到集線器的機器。

機器 C 收到訊息,發現訊息裡的 MAC 地址和自己的不一樣,就丟棄。機器B發現訊息裡的 MAC 地址和自己一樣,就收到下並解析。

這樣機制帶來問題很明顯:首先每次廣播,給所在網路帶來不必要的浪費。所以,就出現了交換機。它能識別訊息裡的目標 MAC 地址後,直接就訊息丟到機器 B 所連線的埠中。另一個角度,交換機必須記住所有的 MAC 地址和埠之間的關係。

這樣的機制在網路規規模小的時候是高效的。但是當網路規模擴大到全球的時候,不可能讓一臺交換機記錄下全球這麼多的網路裝置,也不可能讓全球的機器連線到一臺交換機上。

5.2 如果是多臺交換機呢?

想像一下,你是斯坦福的學生,你的電腦 x 的網路直連的是學校的交換機,而學校的交換機又連美國國家網路交換機。而美國國家網路交換機又直接的是中國國家網路交換機,中國伺服器 y 直連的是中國國家交換機。

你想訪問中國的伺服器 y 中的資源。你瞭解到伺服器 y 的 MAC 地址是00:0C:29:01:00:12,所以你在訊息裡附上這個 MAC 地址。

學校交換機收到訊息後,拿到 MAC 地址後就愣了,這是要發給誰啊?因為中國伺服器 y 並不是直連學校交換機的。這時,學校交換機有一個選擇,就是收到不明的 MAC 地址時,一律轉發給預設埠。斯坦福交換機就將訊息轉給美國國家交換機。

美國國家交換機同樣發愣了,因為沒有這條 MAC 地址對應的埠。它又直接向預設埠:中國國家網路交換機。

中國國家網路交換機收到訊息,發現自己記錄了 MAC 地址 對應的是伺服器 y。就直接將你這位斯坦福學生的訊息轉發到伺服器 y 所連線的埠。

最終,我們的伺服器 y 終於收到來自美國斯坦福學生的資源訪問請求。

那麼,我們的伺服器 y 如何將相應的資源返回給學生呢?將訊息中的源MAC 地址作為響應訊息的目標 MAC 地址傳送給中國國家交換機不就可以了?同樣的機制,只不過是把源地址和目標地址反一下。

這下,我們是不是完美實現使用交換機組建美國網路和中國網路的互通?

但是美國和中國並不能代表全世界。其他國家也需要加入這個大網路。當日本國家交換機也接入美國國家交換機後,斯坦福學生的訊息從學校到達美國國家交換機後就需要進行廣播所有直連自己的埠了,因為這時,它沒有對外的所謂預設埠了。這裡有點燒腦,容各位同學一點時間思考。

5.3 小結

也就是說,當兩個網路互接時,MAC 地址 + 交換機還能解決問題廣播問題,但是兩個以上的網路互連時,MAC 地址 + 交換機就沒有辦法解決廣播問題了。

這時,我們面臨的問題就是無法使用現有的技術—— MAC 地址 + 交換機——解決多網路互連的問題了。所以,需要發明一種新的技術。

而 IP 協議就是就是解決此問題的一項技術。

事實上,IP協議的產生並不只是為解決上述的“廣播問題”。還解決了很多其他網路傳輸過程會遇到的問題,比如一次傳輸的訊息過大時,如何對訊息進行分組等問題。

好了,如果以上內容你還是沒有完全理解,那麼以下3篇文章你必須好好讀讀(再不懂的話,真沒救了..):

網路程式設計懶人入門(一):快速理解網路通訊協議(上篇)

網路程式設計懶人入門(二):快速理解網路通訊協議(下篇)

網路程式設計懶人入門(六):史上最通俗的集線器、交換機、路由器功能原理入門

6、寫在最後

由於歷史原因,MAC 地址及相關技術先出現,但是後來發現它並不能解決所有(已知)的問題,所以,先驅們發明了 IP 地址及相關技術來解決。

另一個角度,個人認為,由於 MAC 地址沒有辦法表達網路中的子網的概念,而 IP 地址可以。如果網路互換裝置(比如路由器)能從目標 MAC 地址中分析出目標網路,而不是隻是目標主機,IP 地址還會出現嗎?

有另一個有趣的問題:如果歷史反過來,一開始就使用的是 IP 地址,而不是 MAC 地址,我們現在的網路世界會怎麼樣?

附錄:更多網路程式設計方面的文章

[1] 網路程式設計基礎資料:

TCP/IP詳解 - 第11章·UDP:使用者資料報協議

TCP/IP詳解 - 第17章·TCP:傳輸控制協議

TCP/IP詳解 - 第18章·TCP連線的建立與終止

TCP/IP詳解 - 第21章·TCP的超時與重傳

技術往事:改變世界的TCP/IP協議(珍貴多圖、手機慎點)

通俗易懂-深入理解TCP協議(上):理論基礎

通俗易懂-深入理解TCP協議(下):RTT、滑動視窗、擁塞處理

理論經典:TCP協議的3次握手與4次揮手過程詳解

理論聯絡實際:Wireshark抓包分析TCP 3次握手、4次揮手過程

計算機網路通訊協議關係圖(中文珍藏版)

UDP中一個包的大小最大能多大?

P2P技術詳解(一):NAT詳解——詳細原理、P2P簡介

P2P技術詳解(二):P2P中的NAT穿越(打洞)方案詳解

P2P技術詳解(三):P2P技術之STUN、TURN、ICE詳解

通俗易懂:快速理解P2P技術中的NAT穿透原理

技術掃盲:新一代基於UDP的低延時網路傳輸層協議——QUIC詳解

讓網際網路更快:新一代QUIC協議在騰訊的技術實踐分享

現代移動端網路短連線的優化手段總結:請求速度、弱網適應、安全保障

聊聊iOS中網路程式設計長連線的那些事

移動端IM開發者必讀(一):通俗易懂,理解行動網路的“弱”和“慢”

移動端IM開發者必讀(二):史上最全移動弱網路優化方法總結

IPv6技術詳解:基本概念、應用現狀、技術實踐(上篇)

IPv6技術詳解:基本概念、應用現狀、技術實踐(下篇)

從HTTP/0.9到HTTP/2:一文讀懂HTTP協議的歷史演變和設計思路

以網遊服務端的網路接入層設計為例,理解實時通訊的技術挑戰

邁向高階:優秀Android程式設計師必知必會的網路基礎

>> 更多同類文章 ……

[2] NIO非同步網路程式設計資料:

Java新一代網路程式設計模型AIO原理及Linux系統AIO介紹

有關“為何選擇Netty”的11個疑問及解答

開源NIO框架八卦——到底是先有MINA還是先有Netty?

選Netty還是Mina:深入研究與對比(一)

選Netty還是Mina:深入研究與對比(二)

NIO框架入門(一):服務端基於Netty4的UDP雙向通訊Demo演示

NIO框架入門(二):服務端基於MINA2的UDP雙向通訊Demo演示

NIO框架入門(三):iOS與MINA2、Netty4的跨平臺UDP雙向通訊實戰

NIO框架入門(四):Android與MINA2、Netty4的跨平臺UDP雙向通訊實戰

Netty 4.x學習(一):ByteBuf詳解

Netty 4.x學習(二):Channel和Pipeline詳解

Netty 4.x學習(三):執行緒模型詳解

Apache Mina框架高階篇(一):IoFilter詳解

Apache Mina框架高階篇(二):IoHandler詳解

MINA2 執行緒原理總結(含簡單測試例項)

Apache MINA2.0 開發指南(中文版)[附件下載]

MINA、Netty的原始碼(線上閱讀版)已整理髮布

解決MINA資料傳輸中TCP的粘包、缺包問題(有原始碼)

解決Mina中多個同類型Filter例項共存的問題

實踐總結:Netty3.x升級Netty4.x遇到的那些坑(執行緒篇)

實踐總結:Netty3.x VS Netty4.x的執行緒模型

詳解Netty的安全性:原理介紹、程式碼演示(上篇)

詳解Netty的安全性:原理介紹、程式碼演示(下篇)

詳解Netty的優雅退出機制和原理

NIO框架詳解:Netty的高效能之道

Twitter:如何使用Netty 4來減少JVM的GC開銷(譯文)

絕對乾貨:基於Netty實現海量接入的推送服務技術要點

Netty乾貨分享:京東京麥的生產級TCP閘道器技術實踐總結

新手入門:目前為止最透徹的的Netty高效能原理和框架架構解析

>> 更多同類文章 ……

(本文同步釋出於:http://www.52im.net/thread-2067-1-1.html