有了 IP 地址,為什麼還要用 MAC 地址?

估計很多人都有這個疑問,但沒見哪本書上解釋清楚,都只是描述IP是什麼,MAC是什麼。當數據包到達區域網後,完全可以直接送到對應的IP地址主機,為什麼還要詢問一下對應IP主機的MAC地址?
一個郵遞員拿著地址詳細到教室的一封信,收件人是小明,教室里沒有重名的,郵遞員問「小明的學號是多少?」,小明站起來回答「150807」,然後小明坐下,然後郵遞員說「學號150807的過來拿信」,小明站起拿信。哎,好像重複了點什麼。


長話短說,理由有三點。

一. 整體與局部

信息傳遞時候,需要知道的其實是兩個地址:

  • 終點地址(Final destination address)
  • 下一跳的地址(Next hop address)

IP地址本質上是終點地址,它在跳過路由器(hop)的時候不會改變,而MAC地址則是下一跳的地址,每跳過一次路由器都會改變。

這就是為什麼還要用MAC地址的原因之一,它起到了記錄下一跳的信息的作用。

註:一般來說IP地址經過路由器是不變的,不過NAT(Network address translation)例外,這也是有些人反對NAT而支持IPV6的原因之一。

二. 分層實現

如果在IP包頭(header)中增加了」下一跳IP地址「這個欄位,在邏輯上來說,如果IP地址夠用,交換機也支持根據IP地址轉發(現在的二層交換機不支持這樣做),其實MAC地址並不是必要的。

但用MAC地址和IP地址兩個地址,用於分別表示物理地址和邏輯地址是有好處的。這樣分層可以使網路層與鏈路層的協議更靈活地替換,網路層不一定非要用『IP』協議,鏈路層也不一定非用『乙太網』協議。

這就像OSI七層模型,TCP/IP五層模型其實也不是必要的,用雙層模型甚至單層模型實現網路也不是不可以的,只是那樣做很蛋疼罷了。

三. 早期的『乙太網』實現

早期的乙太網只有集線器(hub),沒有交換機(switch),所以發出去的包能被乙太網內的所有機器監聽到,因此要附帶上MAC地址,每個機器只需要接受與自己MAC地址相匹配的包。


這個問題很有趣,但一部分朋友的回答是基於有了二層三層再進行討論的,我從另外個角度來理解下。
這個問題可以引申為網路為什麼要分這幾層,基於TCP/IP來說,傳輸介質不同,物理層一定要存在的。應用程序需要大量埠,上層的應用層也是要存在的,這些都不難理解。那為什麼要分二三層呢?換句話說,如果二三層合二為一會發生什麼呢?我腦洞大開了一下,實現是完全沒有問題的,但引發的後果就是子網網段包含大量主機,接入層的設備就需要消耗大量cpu維護相關協議,而且可以相到的就是設計困難,難以規範。
所以,我以為分為二三層的目的是為了簡化設計,並且節省底層資源。還是題中的例子,我們確實可以給所有小明起一個唯一的編號,快遞直接發給這個編號是可實現的,但這樣引發的後果就是郵局拿到編號後要滿世界的找正確編號的小明,費時費力,不如先排個班級,比如說192.168.1.0班1號小明,他的唯一編號是aaaa.aaaa.aaaa,郵局就可以快速定位班級再找到小明,雖有多餘操作,但效率更高更安全,更易於設計。


題主的問題應該和這個問題是等效的:有了 MAC 地址,為什麼還要用 IP 地址?(因為兩個問題的想法都是直接用設備的唯一 ID 來進行路由,只不過題主是把這個 ID 稱作 IP,而我的這個問題是把這個 ID 稱作 MAC 罷了。)

然後我們就發現這個問題變得簡單了:當年設計 IP 地址的目的是什麼呢?當年設計出 IP 地址這個東西,就是因為隨著網路中的設備逐漸增多,人們發現路由(也就是尋找數據包從發送方到接收方的路徑)變得越來越困難了。於是人們想了一個辦法,就是把網路劃分成很多個子網。這樣,在路由的時候,路由器可以把其他子網看成一個整體來進行計算。對於目的地在其他子網的數據包,路由器只需要讓數據包到達那個子網即可,而剩下的工作就由子網內部解決了。雖然這種方法只能讓尋找到的路徑接近最優而不保證最優,不過它大大減少了路由器的計算量,利大於弊,所以被採用了。

那麼為什麼我們需要 IP 地址呢?因為如果我們只用 MAC 地址的話,我們會發現路由器需要記住每個 MAC 地址所在的子網是哪一個(不然每一次收到數據包的時候路由器都要重新滿世界地去找這個 MAC 地址的位置)。而世界上有2^{48}個 MAC 地址,這就意味著即使我們給每個 MAC 地址只留 1 位元組的儲存空間,每個路由器也需要 256 TB 的內存!這顯然是不可能實現的。

這就是我們需要 IP 地址的原因了。和 MAC 不同的是,IP 地址是和地域相關的。對於位於同一個子網上的設備,我們給他們分配的 IP 地址前綴都是一樣的。這個前綴就像郵政編碼一樣。這樣,路由器過 IP 地址的前綴就能知道這個設備在哪個子網上了。現在,路由器只需要記住每個子網的位置即可,大大減少了路由器所需要的內存。

既然 IP 地址不能去掉,那麼能不能去掉 MAC 地址呢?也不能。因為 IP 地址是要設備上線以後,才能根據他進入了哪個子網來分配的,在設備還沒有 IP 地址的時候(或者分配 IP 地址的過程中),我們還需要用 MAC 地址來區分不同的設備。

總之,MAC 地址就像自己的 ID 號,而 IP 地址就像帶著郵政編碼的住址,各有各的用途。所以我們需要兩個地址,缺一不可。


最新版本2.0

經過20天的思考,換一種思路來考慮這個問題,如果網卡的MAC地址沒有了,需要做哪些改變才可以通信?

乙太網幀頭沒有12位元組的MAC地址了,但是還要保留2位元組的ether type 用來協議復用。

三層的IP地址需要下發到網卡,讓網卡來匹配目的IP和自己的IP來決定接收還是拒絕。

沒有傳統的ARP了,但是如何讓二層交換機來預先學習IP和埠號的綁定關係? 可以把ARP進行改造,模仿目前的gratuitous ARP,目的地址是廣播地址,源地址為自己的IP地址。

每台設備一上線就周期性發gratuitous ARP,讓交換機學習 source IP &<-----&> Port number,有包來了,直接查詢IP,來進行交換,這怎麼越來越像路由器了啊? ^_^

本故事純屬虛構,如有雷同,純屬巧合!

---------------------------

原始版本1.0
有一個問題先來面對一下,串列鏈路上的PPP,HDLC協議需要配置數據鏈路層的地址嗎?很顯然不需要,因為串列鏈路是點對點的通信,發送端的數據發送到鏈路上,到達接收端無條件接受,達成了默契,不需要二層地址。

而乙太網是多路訪問,發送的包到達交換機,交換機如何轉發?根據IP地址轉發?那是三層路由器或交換機了!如果採用廣播轉發,那就是最原始的HUB了,除了發送者,這個廣播域里的所有主機網卡都會收到一份數據copy,因為沒有MAC地址,網卡無從知道是否屬於自己主機的包,因為它沒有權利來讀取IP信息,於是這些包會通過中斷的方式來通知CPU來處理,然後告訴IP層取走數據,IP層再檢查IP地址是不是自己的,是就接收,不是的就丟棄。這合理嗎?顯然不合理,因為所有的包都會影響所有的主機,這種網路幾乎不可用,資源都被浪費了。

而有了MAC地址,交換機查詢Mac 轉發表,知道MAC地址和埠的映射關係,只發給接收者,到達目的地網卡,檢查來包的MAC和自己的MAC進行對比,對比一致才會提交給上層,這個轉發過程彼此不會影響,顯然要合理的多。


問題的核心在於網路上的分層概念。IP地址是不區分傳播介質的,他的作用是在internet網中能夠投遞到邊界。在網路邊界的區域網,有可能使用不同的層二網路,以太、wifi、ppp、3g、wimax等等。

在這個區域網中,才出現了與介質相關的終端標識。mac地址用於乙太網,imsi用於3g網,線路號用於撥號上網。internet邊界路由器可以在這個特定的介質網中找到特定終端。

如果沒有IP地址,那麼3g網路用戶無法和乙太網用戶通信,因為沒辦法去做這麼複雜的協議讓幾十種協議兩兩對通。即使做了,發起方也需要方法去知道對端用的是什麼層二網。因此,所有網路協議都用IP,只在兩頭網關上做轉換,就是一種設計很先進的奇妙方法。

反過來,為什麼全球只要mac地址不能用於全球通信?問題在於mac地址和IP地址的匯聚性。mac地址是出廠就決定的,不是上網的時候決定的。也就是說intel設備或使用intel晶元的mac地址前面多少位是相同的,然後intel在給晶元分地址的時候保證所有的晶元沒有重號的,這樣才能保證隨便哪個終端接入到同一個區域網中沒有重複的。

這樣問題就來了:網路上希望路由器的轉發規則盡量簡單,所以一般要用ip地址前多少位而不是整個IP地址去做轉發。mac地址顯然沒法匯聚,前面已經講過,工廠決定的。

給每個用戶分配一個只由路由器網關決定的地址,每個網關上附著一個段,例如100.200.x.x,也就是所有以100.200開頭的ip都送到這個網關上來,就可以保證internet轉發規則的簡單化。而且,一個用戶從一個區域網離開,換到另一個區域網中,mac地址不需要變,只需要換個ip地址就行。


我來說說我的理解吧。
舉例說明: 我們知道,出於歷史的原因,世界上出現了很多的國家和民族,他們都使用不同的語言。
比如,要和法國人通信就要學會法語,和日本人通信就要學會日語,同理,要學會德語、義大利語、西班牙語。。。
如果每和一個國家通信就要學會對方的語言,那可要累死了。
所以,最好的辦法,就是大家都用1種語言通信。這樣只要學會一門外語就可以跟所有的國家通信了。
這種「世界通用語言」可以通過2種途徑得到:現成的,和新發明的
工業革命以後,日不落帝國是世界的中心,其直接繼承者美國也是世界的中心,它們都使用英語,於是英語藉助其強勢地位成為世界通用語言。
同時,「世界語」也是一種世界通用語言,與英語不同,世界語是「新發明」的語言(當然也借鑒了其它語言的規則),也就是說,沒有哪個民族是」世界語民族「,也不可能在某處發現一塊1000前的石碑,上刻世界語。。。
因為沒有一個國家的母語是世界語,所以在用世界語交流的時候必須要經過一個「翻譯」的過程:把本國語言,翻譯成世界語。
所以我們可以說,世界語是一種"無根"的語言,是一種「不完備」的語言,它必須依賴於其它的語言才能使用,或者說:運行於其它語言之上。

出於歷史的原因,「電腦網路」是從無到有、從小到大發展起來的。
有很多的網路被發明出來。有些網路只應用於小面積,比如一個家庭,一棟樓房,線路長度按米、百米計算。這類網路叫做「區域網」
有些網路應用於很大的面積,比如我辦理了寬頻,這樣我和電信公司之間就有一條長達N公里線路,或者電信公司和電信公司之間有長達幾十公里的線路。這類網路叫做「廣域網」。這些網路各自使用自己的協議(語言),互不兼容(不同的語言相互不能理解),
網際網路就是「網路世界語」,各種網路都用1種協議:網際網路協議(TCP/IP協議族)交流,所以各種網路都要有個「翻譯」的過程:把本網協議,翻譯成網際網路協議。
正如上文所言,世界語是「不完備」的語言,因為大家使用世界語需要一個翻譯的過程。
網際網路協議也是不完備的協議,其它網路在運行TCP/IP協議族的時候,也需要一個翻譯的過程,這就是MAC地址之所以存在的核心要點,下面詳述。

在網際網路出現之前就已經有很多的網路出現了,而且網際網路並不是第一個全球大網(很明顯,歷史悠久的有線電話網路就是全球大網)
然後,網際網路出現了。
需要注意的是,網際網路誕生之初並沒有想到自己會成為一個全球性的大網,所以沒有針對全球網路的特點進行設計,這就留下了一些短板(比如IP地址不夠,協議有漏洞,想想大名鼎鼎的ARP協議漏洞 。網際網路成功以後,這些漏洞被IPV6彌補)。

設計網際網路的初衷,是為了應付對蘇聯的核戰爭(當時還存在蘇聯)。

你可能聽說過「恐怖平衡」這個概念,說的是美蘇任何一方如果先發制人的向對方發動核戰爭,對方的核報復也會讓自己身處火海,所以誰也不敢首先使用核武器,從而避免了核大戰。

但很明顯,只有「棋逢對手」才會出現「平衡」,如果我方「棋高一著」,有能力取得核戰爭的勝利,那就可以把這種可笑的「平衡」扔進太平洋。

美國國防部在思考:

我往蘇聯扔一顆核彈,蘇聯的軍事指揮通信系統就垮掉了,沒有了指揮,再強大的軍隊也成了無頭蒼蠅,沒有了戰鬥力。

可蘇聯往美國扔核彈,美國也會有同樣的結局。

可是。。。如果我設計一種通信網路結構,這種結構」容災性「很好、很」健壯「、很」高可用「 ,蘇聯的1顆核彈滅不了,2顆核彈滅不了,3顆核彈才可以滅。而我1顆核彈就可以滅了它。這樣我就有了喘息的餘地,我就可能成為核戰爭的勝利者。

網際網路就是在這種思考之下誕生了。

網際網路能抵抗核爆炸?真有這麼神奇么?看看圖就知道了。

先說說傳統的電話網拓撲:

電話網是一個典型的星形網路,用戶A要給用戶F打電話,其路徑就是A-K-F

同理,用戶C要給用戶G打電話,路徑就是C-K-G

也就是說,任何用戶之間要打電話,都必不可免的要經過中央交換機K

所以你知道為何在打仗的時候,電信局是首要攻擊目標了,因為電信局裡面放著電話交換機。如果要破壞這個城市的電話網路,我不用挨家挨戶砸電話,只要破壞掉電信局的電話交換機,就萬事OK了!

那麼該怎樣防止這種情況的發生呢?傳統的戰爭理論是這樣思考的:

方案A,我隱藏交換機的位置所在,讓敵方找不到它在哪。

但現代戰場,天上有衛星,地下有監聽,在嚴密的監視網路面前,想要將自己隱匿起來,已經不容易了。

那就方案B,我在交換機周圍布置重兵,建設防禦工事,就算你發現了也攻不進來。

但現代化的武器威力巨大,再加上核武器,再多的人、再堅固的工事也難以抵擋。

可見由於現代化武器的出現,戰爭理論也要跟著現代化了。

於是思想家們開動腦筋,另闢蹊徑,在網路的拓撲結構上做文章,改「集中式」為」分散式「,造就出了網際網路。

網際網路採取了什麼方法避免核心設備被攻擊,從而讓網路能夠在戰爭中存活更長的時間呢?

方法就是:沒有核心設備!

詳見下圖:

可以看到,網路拓撲由星形網路,變成了網狀網路。

這裡的每個用戶(或稱節點)都是一個電話交換機(對於網際網路,就是路由器)

此時,如果A和H打電話,那路徑可多了:

最短距離當然是A-H,所以優先走A-H。

但如果A-H斷掉了,還可以走A-D-H、A-E-H、A-E-F-B-D-H。。。。

所以,A-H斷了沒事、B-C斷了沒事,C-D斷了沒事、F-G斷了沒事。。。

由此可見,網狀網路的是一種非常「高可用」的網路,容災性很好。

這些節點的地位(功能)都是相同的,不存在某個節點比另外的節點更重要的情況。所以一個節點出了問題,另外的節點就可以取而代之。

而星形網路就不是這樣,很明顯中央節點比其它節點更重要,中央節點失效,其它節點無法替代,整網就失效了。

隨著節點數的增加,節點之間的可用線路的數量呈指數方式增加,函數是N*(N-1)/2。

這個簡單的函數可是有很大的威力的,借用網上的一張圖:

相比於星型的電話網路,如果要破壞這樣的一張網狀網路,又該如何下手呢?

網際網路最初是國防通信網路(APRA-阿帕網),後演變成連接各大學、政府部門和科研機構的教學科研網,最後演變為燒錢的商業化網路。
以上所說的知識面叫做「網際網路的體系結構」。

再說說網際網路協議:TCP/IP協議族
從一開始,網際網路就沒有想過成為世界性大網,所以網際網路的協議從制定之初就是」不完備「的。 也就是說,網際網路必須要基於其它網路之上,依靠其它的網路才能完成自身的功能。
就像是世界語是不完備的,必須要基於其它語言之上,才能實現其自身的功能。
如果世界語運行於漢語之上,那就寫作:
世界語 over 漢語

比如,已經存在一種區域網技術,叫做」乙太網「,那麼好,網際網路就運行於乙太網之上,英文寫作:
TCP/IP over Ethernet
註:TCP/IP是專為網際網路開發的一系列協議當中的2個協議,因這2個協議最重要(同時也最出名),就用這2個協議代言網際網路了。
還有一種城域網技術叫做「令牌環網 」,那麼好,網際網路就運行在令牌環網之上 ,英文寫作:
TCP/IP over Token-ring
還有一種廣域網技術叫做"ATM",那麼好,網際網路就運行於ATM之上,英文寫作:
TCP/IP over ATM
如果你想要網際網路運行於USB呢?自然就是:
TCP/IP over USB
。。。。。。。。。。。

你肯定知道OSI 7層模型,網際網路協議族並沒有覆蓋完整的7層 (只定義了第3層和第4層),很明顯,網際網路沒有定義水晶頭的形狀、網線里有幾根銅線、銅線裡面傳輸的電壓是多少等等參數,這些參數是諸如乙太網這樣的網路定義的。
那麼,為什麼網際網路不定義這些參數呢?
上面說了:「也許」從一開始,網際網路就沒有想到自己會成為一個世界大網,所以就沒有定義得這麼複雜。
但也有另一種可能:其實一種網路技術,不一定要「大而全」,從1層到7層全制定,可以只制定其中幾層。
比如乙太網定義了1~2層(物理層、數據鏈路層),網際網路定義了3~4層(網路層、傳輸層),其它公司定義了5~7層(SQL、JPEG、HTTP)
這樣,不同的網路、不同的協議之間相互配合就可以了。
就像是,我是一家生產火車的廠家,我當然可以生產鐵軌,制定鐵軌的寬度,生產火車車廂。
但既然已經有大量的鐵軌鋪設完畢了,那我就不用管鐵軌的事情了,火車運行於現成的鐵軌之上就可以了。
在這裡,鐵軌就是乙太網(區域網)、ATM(廣域網)或者其它現存的2層網,火車就是網際網路。
所以,從來不存在「純粹的網際網路」,因為網際網路沒有定義底層,只存在TCP/IP over XXX。

經過以上的解釋,你就知道為何一定需要MAC地址了:網際網路並不存粹,還包括乙太網。
因為網際網路是第三層協議,是沒有根基的「空中樓閣」,需要乙太網這樣的2層網具體落地實施,而MAC地址又是2層概念,所以MAC地址就這樣進入了網際網路的體系結構。

乙太網的MAC地址格式是12個16進位數,比如0800200A8C6D
網際網路IP地址格式是4個點分10進位數,比如192.168.201.160
剛才說了,不存在「純粹的網際網路」,所以網際網路必須要基於乙太網之上才能工作,所以就是「同時運行了2個網」
就像是世界語必須要基於中文之上才能工作,所以就是「同時說了2種語言」
所以,就必須要「翻譯」
也就是把乙太網的MAC地址,翻譯成網際網路的IP地址,這就是ARP的作用
假如我的中文名字叫做「劉濤」,如果要翻譯成世界語,就肯定要有個世界語的名字(假設叫LIUTAO)

同樣是名字:
劉濤→翻譯成→LIUTAO
同樣是地址:
21-35-6D-1F-83-9E→翻譯成→202.143.90.8

當然了,如果網際網路從開始制定之初,就定義了從物理層到傳輸層的協議,那麼網際網路就不再依賴於其它任何的網路,這時就不用什麼MAC地址了。

講完了。

我是不是太羅嗦了。。。。


原題:「當數據包到達區域網後,完全可以直接送到對應的IP地址主機,為什麼還要詢問一下對應IP主機的MAC地址?」
真的這樣了還需要費心儘力地搞IPv6幹嘛。

題主:「你的前提是認為交換機是這樣處理的,理所當然認為這樣處理是正確的。交換機處理mac,路由器處理ip,為什麼要這樣設計?交換機為什麼不可以處理ip?為什麼要分層?」
交換機工作在二層,只認識MAC地址。如果交換機要處理IP,把二層砍掉只剩三層?呃,不覺得處理速度會很慢嗎?

網路是過去幾十年一步一步搭建的,兼容性什麼的都要考慮。你不能說現在都有微信了,還要固定電話號碼幹嘛~

---------------------------------------------------------------------------------------------------------------------------
簡單地說兩句:
二層是這樣工作的:每個接入設備口分配一個地址,一般的星形結構的網路,每台設備發出的數據所有其他設備都能收到,然後根據目標地址看是否是發給自己的。這個地址是謂MAC地址,因為身在最底層,沒有設置分配機制或者自動獲取機制,每台設備製作的時候固定寫在裡面,並且確保全球不重複,這樣就不會有衝突。

當然後來也就有了交換機,也就是帶有存儲轉發功能的集線器,可以把包存一下,看一看目標地址,然後選擇某一條線路發出去。怎麼知道哪條線路是哪個MAC?學咯,每條線路發來的包看一下來源地址,然後記到表裡面。

二層還要解決多個設備同時發送衝突的問題,要檢測,要處理,要重發等等。

三層是這樣工作的:每個設備有一個IP地址,也要保證唯一。這個IP地址可以手工分配,也可以通過DHCP獲取。手工分配的時候需要注意保證唯一。區域網內想聯繫一個IP地址,先要知道對應的MAC地址,這時候走二層的ARP全網問一下就可以了。反過來,自己作為新設備想要一個IP地址,要麼RARP要一個,要麼走基於UDP的DHCP要一個,當然都只限於區域網內。

有了這些底層的東東,每台設備都有了自己的IP地址,這樣就可以互相通信。三層的關鍵在於,有了路由器,路由器用於將不同的網段連接在一起,並對兩個網段間的通信進行存儲轉發。比如A網路10.0.0.0/24,B網路10.0.1.0/24,中間有一路由器隔著,兩邊的網關都是.1。10.0.0.2要發信給10.0.1.2,那麼先看子網掩碼,發現不在自己網路內,然後交給10.0.0.1,路由器看到在網路B內,從10.0.1.1發出,然後到達10.0.1.2。

假如這倆網路沒有路由器,直接走二層,那麼多電腦連在一起,廣播包就會佔掉大量的網路帶寬。

路由器,顧名思義就是要找路用的。比如B網路還用一個路由器連接著C網路10.0.2.0/24,那麼A網路一台機器要發包給C網路的一台機器,路由器怎麼知道怎麼走法呢,於是需要路由協議,路由器之間要說說話,了解一下對方的狀態。

再往大了去,就是互聯網了。中國的一台電腦要連接美國微軟,那麼發出的包先到寬頻運營商,然後到北京出口,然後覺得現在走歐洲到美國慢,於是轉到上海,走海底光纜到了美國,再走舊金山,到西雅圖,再到雷德蒙。如果只有MAC地址,是無法支撐起這麼大的網路的,你覺得直接訪問到MAC地址就行了,問題是你讓路由器怎麼給你找到路線呢?

所以,對於原題「都只是描述IP是什麼,MAC是什麼。當數據包到達區域網後,完全可以直接送到對應的IP地址主機,為什麼還要詢問一下對應IP主機的MAC地址?」
你缺乏網路知識,搞不清NAT的含義,只以為公網就是用IP的,區域網就是用MAC地址的。

如果你本身用的公網IP,那麼全部走IP訪問即可。如果是區域網多台電腦共用公網出口,那麼首先要做的是NAT轉換,這個是要在4層TCP和UDP上做的。只在二層無法完成。

你說的東西更像IPv6,這樣不需要再做NAT,所有內網設備都可以分配一個IPv6地址。

不知道題主想的明白不,我猜肯定想不明白,哼哼~


這個問題很有趣,試著回答一下。
我們知道IP地址是可以變化的, 可以通過各種方式分配IP地址給一個設備,比如DHCP, PPP,靜態IP等,但是你的MAC地址是不會變化的, 它唯一標識了一個設備。一個設備的一生中可能擁有過多個IP地址。

如果把封包在網路上的傳遞比作郵件的寄送的話, 我認為比較準確的方式應該是:

一個人的體貌特徵就是MAC, 而通信地址+人名相當於IP地址
可以進一步類比,
通信地址是IP中的網路地址部分,人名相當於IP中的主機號部分

你今天可以到這個國家, 明天可以到那個城市,通信地址(IP網路地址部分)就會變化,也可以到派出所改名字(IP主機號部分), 但一個人的體貌特徵(MAC)永遠不會變, 整容(修改MAC)不在討論之列, 它唯一標識了你這個人。

如果郵件的是寄給「上海市X區Y街道Z幢M室 小明收」,最後郵件送達M室(IP所在網路)的時候, 因為小明家裡可能不止一個人(多台設備在同一個broadcast網路里),快遞員會問, 」誰叫小明, 你有一封信」, 然後小明說"我是小明", 郵遞員把郵件給到小明手中。

還是沒看出這個過程中體貌特徵(MAC)起到了什麼作用?

當小明說「我是小明」的時候, 郵遞員已經把「小明」這個名字和小明這個人體貌特徵聯繫起來了, 所以他會把信交到到小明的手中, 而沒有放到這個家裡的其他人的手中。


可以類比快遞:
北京張三要發快遞給上海李四。
1. 找到北京順豐(default gateway)。
2. 找到北京順豐的公司地址(arp)。
3. 發給北京順豐(line)。
4. 北京順豐發現目的地是上海,需要轉發給上海順豐(route)。
5. 找到上海順豐的公司地址(arp)。
6. 發給上海順豐(line)。
7. 上海順豐發現目的地是李四。
8. 找到李四的地址,利用大喇叭廣播,李四住哪裡?(arp)。
9. 發給李四(line)。

北京=網路地址
張三=主機地址
門牌號=mac地址
全球唯一,如果北京張三和上海李四用同一個門牌號,然後張三有一天搬家到上海,那麼別人發給李四的包裹就會同時發給張三了(乙太網的廣播機制)。


在同一個交換機上面,是通過mac地址來聯繫的,ip不起作用,三層交換機和路由器才能處理ip地址,這是因為協議分層不同


MAC地址存在的一個意義在於網路過濾,就是允許哪些計算機或設備可以連入該區域網,增加網路的安全性,一般公司都需要這要做的。至於什麼標識機器唯一性,人家換個網卡不就變了嗎?沒有多大意義。還有上面說到NAT,其實就是解決ip地址不夠用,和MAC地址真沒有關聯。


我也來說說自己的看法。在不考慮當下即成事實的網路情況而言。
利用IP地址取代MAC之類的鏈路層地址,就功能實現來說是可行的。這就會引出以下問題:
1、鏈路層是否有必要存在?從現實來說還是有必要存在的。鏈路層負責隔離硬體和上層IP,分層劃分其實就是邏輯功能的解耦合。我們無法想像IP層直接與物理層打交道,這是不可能完成的任務。因此鏈路層有必要存在。
2、在鏈路層有必要存在的前途下,此時鏈路層和IP層使用同樣的地址。個人認為就沒有特別的意義了。因為鏈路層的通信範圍相對有限,不能全球路由。此時IP與鏈路層共同地址,其實完全沒有任何意義了。反而產生了大量問題。比如IP地址變更時,需要通知鏈路層驅動程序進行同樣的變更;IP地址結構本身是為了全局路由而設計的,與鏈路層的設計理念存在本質區別,鏈路層在實現自身功能必定會受到影響。
總之:鏈路層有存在必要的前途下,IP地址和鏈路層地址各有不同作用,這是有分層結構特性決定的。


為了實現智能化的鏈路層。所以在接近物理層的地方搞了個地址。

其次,過去tcp/ip並沒有一統江湖,,而且現在一些區域網絡上也未必只承載ip數據報文。


比如你想給你的閨蜜或者男友發個片(逃),首先你需要知道,你男友家中無線路由器的ip地址,而男友家裡的無線wifi上連著不止一個的設備,家裡有熊孩子用手機無線看農夫與蛇,他的父母聚在一起,用ipad連著無線WiFi在看蝸牛與愛情。但是如果你不知道你男友設備的mac地址,你的片片有可能就被隨機發送到男友父母的ipad上,這畫面不要太爽。。。
mac地址需要ip地址,用來告訴設備我的目的地---男友家,IP地址也需要mac地址知道下一步去哪兒,我的信息通過一個個設備到達,不停地跳轉到達,mac用來確認目標設備,路由器根據mac分配去往何方

ip是終點到終點end--end
而Mac 是hop--hop
設備的mac地址是唯一的,不像ip地址,有時候是隨機的

舉例:IP地址192.168.1.53 前面的192.168.1代表你們在一個網路上 後面的53代表其中的一個設備
network adapter之間用來交流Mac地址的

——————————————————————————————————————

2017年4月3日 更新:

同一個網路

ARP協議組成的ARP緩存,相當於一個快遞員,負責一小片區域

ARP協議(地址解析協議Address Resolution Protocol):

ARP協議形成的ARP緩存就好像是郵件分配人,記錄了寄件人和收件人的對應關係(包括地址等),隨時更新

arp協議通過廣播(broadcast)給這個網路上的所有人,你要的哪個人應答了,然後就把自己的mac地址發過去,然後開始交流

不同網路

通過路由器來充當「郵遞員」 完成數據傳輸。路由器裡面有路由表,包含了怎麼去?去哪兒?的信息。這個「郵遞員」相當於一個驛站到另一個驛站的比較廣的快遞員,範圍更大

這個路由器一般指的是網路中的專用路由器(一般是一台專用的電腦構成)

來源:計算機網路 謝希仁

小知識:

1、mac地址被叫為物理地址:因為mac地址是被封裝進適配器的ROM中的,也就是網卡中的,IP地址確實存放在計算機的存儲器里的

見圖:

QA

1、有人說既然有MAC地址,為什麼還要IP地址?

回答:舉個例子就比較好理解:比如一個人需要在一個中學裡找一個叫小明(mac地址名)的同學,如果在全校一個一個找也能找到。但是我們有另一種方式,就是把所有的老師(IP地址)召集起來,問一下你們那個班裡誰有叫小明的人,很快就可以找到小明的老師並找到小明,這樣就節省了大量的時間 ip地址和mac地址是類似的

老師就相當於路由器,老師腦子裡存的是學生的信息和 某些人的聯繫

有了老師就可以分散更高一層-校長的壓力,要不然校長需要記住所有孩子的信息,增加了負擔

2、@張濤 問:

mac是2層的,ip是3層的。上層依賴下層。

回答:mac是處於第二層,IP是處於第三層,我描述的也是指兩者是相互依賴的,mac輸入數據鏈路層 IP輸入網路層

數據的傳輸圖:

數據從主機1開始不停地往下走,每走一步加一點信息進去,讓功能更完備,經過路由器把一些底層數據進行分解加入自己的信息,然後傳入主機2,主機2底層(物理層)到最高層應用層,一層層扒皮,撥開,找到數據,然後顯示到電腦屏幕上。

5:應用層 4:運輸層 3:網路層 2:數據鏈路層 1:物理層

3、@柒年 問:
我覺得說的並不對。比如你女朋友家有兩台路由AB,她父母在A-pc1,女朋友在A-B-pc2,然後pc1和pc2的mac可以相同(mac可以改),並且pc1和pc2的外網ip顯然相同,這樣ip相同mac相同。然而你還是可以和你女朋友通信的,找台中轉伺服器記錄下信息就能hop-hop了,並且mac地址可以不需要。

回答:是可以改,改完了再加個中轉伺服器,這不是多此一舉嗎?有了mac地址就行了嘛。。。 路由器ARP協議已經幫你把信息記錄下來了。


1,ETH在二層,IP在三層,通俗的講就是逐級分揀機制,目的是在一個很大的網路中可以快速的找到對方,通信網路是一個綜合效率和覆蓋範圍等各種因素最後反覆調整成型的東西。
2,歷史原因,ethernet和IP比較好的能契合,兩者共存下來了(命好,ATM羨慕嫉妒恨),其他的協議在網路的比例逐漸消亡了。並不是所有的二層設備都必須是ETH協議,也就不一定有MAC。


分兩種情況討論:
1. 機器沒有固定 ip 地址: 就是現在 ipv4的情況,內網 ip 是復用的,需要用 mac 地址來標識這個網路包是發送給誰的。(嚴格來說是數據鏈路層根據 mac 地址判斷是否要接收這個包,否則丟掉)

2. 假如機器有固定的 ip地址,的確可以不需要 mac 地址了,根據 ip 地址直接發, 當然現有的網路架構要稍微改動一下。

在現有的網路架構下, 機器發的包是經過網路層,找到要發到目標地址時,需要經過哪個路由,得到此 ip 地址,再經過 arp 協議轉換為 mac 地址,數據鏈路層根據 mac 地址發送幀。

路由接收到包後,再依循上述步驟再發幀,一直到到達目標地址。

可以看到無論如何發包最終都是要由數據鏈路層來完成,而數據鏈路層的通信則是靠 mac 地址,設計上就是如此。


首先糾正一下幾位答題者的錯誤,即 MAC 地址並不是燒進 Interface(使用 Interface 而不是設備的原因是一個設備可能有多個 Interface)上的,也不一定就能保證唯一地標識一個 Interface,反而是在啟動的時候填入的,換句話說用戶完全可以根據自己的需求來修改 MAC 地址。

@yskin 同學的答案基本覆蓋了計算機網路的基礎架構,不過話說我覺得題主的疑惑是:能否在區域網內也只使用 IP 地址來標識設備?換句話說如果重新設計新的協議框架,那麼能否去掉 MAC 地址這個概念?

我暫時沒想出為什麼不可以——我指的是將二層砍掉。只要每一個設備都維護恰當的路由表,IP 地址分配不管是靜態還是動態,區域網內的包完全可以根據路由表來找到下一跳的位置。

但是,前邊討論的只是可以或不可以,我們來看一個實際的問題。三層交換機 路由器在收到一個包的時候,需要拆下 IP 頭進行解析,根據路由表找到目標地址所對應的出埠(如果入埠上配置了 NAT,還需要進行地址轉換)。這一步完成後,數據包會被包上新的 IP 頭(更新地址及 TTL 等信息)然後才能發出去。
而二層交換機完全不拆 IP 頭,基本是收一個包就轉發一個包,快的要死。

更一般地說,三層交換機和路由器可以看做是子網與子網之間的樞紐,相當於郵局;而二層交換機只能作為單個子網內的中轉站(因為它完全不知道 IP 是什麼東西)。當子網很大的時候(很大指設備多,此時埠不夠用;或者距離長,衰弱太嚴重),不可避免的需要使用中轉站,此時如果用三層的未免小題大做,而且效率不佳。


題主的例子最後一點描述的不準確。正確的情況應該是這樣的:郵遞員在教室里問誰的學號是150807?小明站起來回答:我。然後郵遞員將郵件遞到150807(即小明)手中。類似的,區域網中主機A廣播方式發送ARP消息詢問哪台主機的IP是192.168.1.2,如果網路中有主機B的IP是192.168.1.2,則主機B回應主機A:「我的IP是192.168.1.2」。然後主機A就可以直接跟主機B進行通信了。


簡單來說,那個例子是有問題的,你憑什麼認為教室里沒有重名的,並且不會改名?
我讀初中的時候,班上有 3 個叫李沛的。遇到這種情況,就必須用全球唯一的標識符來區分(即 MAC 地址)。
此外,在數據鏈路層,設備是不知道 IP 信息的,甚至是還沒分配 IP 地址的,而 MAC 地址是在出廠時就已寫死的。設備可以被綁定到各種 IP,但是 MAC 地址不變,它也因此能知道自己是誰。

===

以下是回復 @長風 的評論。

  1. IP 地址可以是私有的,例如 192.168.1.1,全世界可能有上億台設備的 IP 地址是這個。
  2. 在同一個區域網內部,IP 地址是唯一的,通過 ARP 協議可以轉換成 MAC 地址。你當然可以手動設置 IP 地址和 偽造 MAC 地址,結果就是可能出現衝突,現實中就是這樣。
  3. 假設 IP 地址是無限且免費的,你也不能在出廠時就確定其 IP 地址。因為 IP 地址決定了查詢設備時的路由路徑,你得把同屬一個子網的設備放在一個子網內才能高效地抵達,不然就好像拿身份證號在大街上找人一樣漫無目的。
    因此,設備只能在連接到網路後,才能確定 / 公布其 IP 地址。而在連接的過程中,它不用 MAC 地址如何與網關通信?

你要往外寄快遞,難道只知道對方的地址就行了嗎??

你還得知道快遞小哥的電話丫!!


推薦閱讀:

跪求拯救哥這IT屌絲,嘴笨+情商低+獃子?
為什麼隨著程序技術的進步,遊戲客戶端的大小越來越笨重?
經常用滑鼠,右手手腕下方摩擦變黑,怎麼預防?
現在還有多少人玩IRC?
為什麼有些程序員喜歡在晚上工作?

TAG:程序員 | 編程 | 計算機網路 | IP地址 | TCP |