MAC是Media Access Control Address的縮寫,是大部分IEEE 802網絡設備使用的物理地址格式。這個地址用於物理上直接可達的網絡內的網絡設備之間的通訊,在ISO-OSI七層模型中位於第二層數據鏈路層。
在使用CSMA-CD協議的以太網中,打個比方的話,這個地址的作用是,網卡A大喊網卡B的名字(MAC地址),其它網卡要假裝沒聽到。
注意這個“假裝沒聽到”:只要你打開了網卡的混雜模式(Promiscuous Mode),你就可以收到局域網上傳輸的所有數據包了。
處於這種狀態的計算機被稱為“sniffer”,這是一種偵測局域網故障或者盜取內網數據的常用技術,因此很多公司嚴厲禁止員工把自己的網卡設置到混雜模式。
總之,MAC用於連接在同一個局域網的網卡間的直接通訊;通訊模式是用帶著目標MAC地址的數據報文在網絡中廣播,只有地址正確的那個網卡才會接收這個報文,其它網卡不予理睬(設置為混雜模式除外)。
IP地址是網絡層地址,它屬於ISO-OSI七層協議的第三層網絡層。
IP地址的設計重點在於路由,也就是要考慮如何規劃路徑才能把報文投遞給目標設備。
打個比方的話,IP地址類似於郵政編碼,隱含了國家、地區、城市、街道等信息;攜帶IP地址信息的報文到了路由器之後,路由器要完成分揀工作、按照南來北往東投西遞等不同方向給IP不同的報文分類、投遞到正確的端口——比如,這一批郵件是發往X省的,都給997號班車;另一批郵件是發往Y省的,都給996號班車,等等。
等到了X省,那裡的分揀中心(路由器)要進一步分揀,這一批到YP地區,走8235號班車;那一批到YY地區,走8233號班車,以此類推。
最終,等郵件到了你所在小區(局域網),IP地址就無能為力了。它只管分揀(路由)這一層,不管數據鏈路層。
這時候怎麼辦呢?
轉交給MAC地址,讓它投遞給正確的網卡。
因此,IP協議需要數據鏈路層協議承載才能工作,單靠它是完成不了消息投遞工作的。
但是,互聯網上的IP報文並不攜帶MAC地址啊?它是投遞到小區了,怎麼找到正確的網卡呢?
這時就需要ARP協議來幫忙了。
ARP協議在你家/你公司的出口路由器裡面維護一張ARP表,記錄了本地局域網裡面每一塊網卡的MAC地址和IP地址的對應關係;互聯網過來個報文,一看IP地址是202.11.123.13,ARP表一查,MAC地址FE.AC.12.34.56.78,於是在外面包裝一層,打包成以太網數據,局域網一丟,完事。
注意,這裡是在IP報文外面附加個以太網報頭,並不影響IP報文本身。
換句話說,IP並不在乎自己的承載協議是不是以太網協議、也不在乎物理地址是不是MAC地址——所以才說IP地址和MAC地址毫無關係——你完全可以用另外一套地址協議取代以太網/MAC地址。只要實現個自己特有的ARP體系即可。
舉例來說,你自己玩無線電,自己定了個地址協議,用甲、乙、丙、丁標記不同的接收機(或者用載波頻率90MHZ、94MHZ、96MHZ、104MHZ區分也沒問題);那麼只要你做一個甲、乙、丙、丁和IP的對應表、正確實現了相關地址的翻譯工作,這些接收機就可以通過互聯網訪問,對IP報文沒有絲毫影響。
最後,額外提一提NAT。
我們用的PC、手機往往有一個局域網ip地址,一般是192.168.0.*;這個地址並不能用於互聯網訪問。它和真實的互聯網地址之間可以通過NAT協議相互轉換。
比如,路由器的互聯網地址是202.10.11.123,你的局域網ip地址是192.168.1.16;當你訪問互聯網絡時,路由器會把你的IP地址替換成202.10.11.123然後才發送到互聯網;互聯網服務器迴應你時,也會使用202.10.11.123這個地址(也就是你的路由器的互聯網地址)。
然後,你的路由器會維護一個對外通信端口和內部ip的對應表。比如,它把你的報文通過端口14566和互聯網服務器通訊;那麼當端口14566端口收到報文時,它就會把ip地址202.10.11.123替換成你的局域網ip 192.168.1.16,然後再查ARP表、打包成以太網報文並最終完成通信。
這個過程,就是所謂的NAT(網絡地址轉換)。
如果你所在的公司很大的話,路由器可能僅僅完成局域網IP的翻譯工作,報文仍然需要藉助路由協議投遞到你所在部門的子網,然後再打包成以太網報文,這才能投遞給你。
注意,在公司很大這個場景下,不同部門的子網可能仍然是通過以太網協議接入的;因此,“報文投遞到正確子網”這一步也要打包成以太網報文、投遞給子網網關(此時用的MAC地址是子網網關的MAC);然後子網網關從中解出IP報文、把以太網包頭丟棄,之後再次用你的MAC打包成以太網包,這才能投遞給你。
其中,公司主網關使用部門子網網關MAC打包、投遞這一步,對你來說是不可見的——甚至於,這一步可能在互聯網上就要執行十多次(沒錯,你用trace router追蹤時,看到的每一跳可能都對應著一個重新打包-解包過程)。
由此也可見,IP地址和MAC地址其實是毫無瓜葛的。兩者僅僅是在傳輸過程中偶遇、旋即分開而已——那僅僅是報文投遞過程中的一個實現細節罷了。
網絡上各種設備既是分散在不同位置、不同崗位上的、職責各不相同的一堆個體,又是彼此聯繫、彼此合作的一個整體。
因此,學網絡,一定要搞明白不同階段、不同位置報文的投遞原理以及地址轉換/翻譯的具體機制;同時還要搞明白每個設備的職責以及在報文投遞鏈上的作用和位置;千萬不要膠柱鼓瑟,死板的記憶一堆散亂的名詞——那隻會越學越暈。