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)