Jack Jiang

          我的最新工程MobileIMSDK:http://git.oschina.net/jackjiang/MobileIMSDK
          posts - 499, comments - 13, trackbacks - 0, articles - 1

          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



          作者:Jack Jiang (點擊作者姓名進入Github)
          出處:http://www.52im.net/space-uid-1.html
          交流:歡迎加入即時通訊開發交流群 215891622
          討論:http://www.52im.net/
          Jack Jiang同時是【原創Java Swing外觀工程BeautyEye】【輕量級移動端即時通訊框架MobileIMSDK】的作者,可前往下載交流。
          本博文 歡迎轉載,轉載請注明出處(也可前往 我的52im.net 找到我)。


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          Jack Jiang的 Mail: jb2011@163.com, 聯系QQ: 413980957, 微信: hellojackjiang
          主站蜘蛛池模板: 平泉县| 色达县| 吉首市| 鄱阳县| 牡丹江市| 古田县| 突泉县| 丹巴县| 修文县| 吴江市| 徐州市| 沾化县| 江门市| 封开县| 巫山县| 鄱阳县| 扎兰屯市| 四平市| 梁河县| 三门峡市| 铜鼓县| 汤原县| 保山市| 黑龙江省| 博客| 郁南县| 界首市| 天气| 新沂市| 陆河县| 日喀则市| 祁门县| 犍为县| 麦盖提县| 高密市| 隆回县| 东兴市| 凤凰县| 横峰县| 龙泉市| 勃利县|