了解完網絡協定,我們會發現,網絡通信的五層模型裡,有兩個很重要的概念:IP 位址和 MAC 位址。
那麼 IP 位址是怎麼來的,又是怎麼沒的?MAC 位址與 IP 位址又有什麼差別?
這回答上面問題前,先熱下身,大家知道如何檢視本機的 IP 嗎?這個問題,即便是沒有專業學過計算機的人,隻要折騰過電腦,重裝過系統,大多都會知道答案:在 Windows 下是 ipconfig,在 linux 下是 ifconfig。
在 Windows 下輸入 ipconfig,我們會看到這個界面:

在 linux 下輸入 ifconfig,我們會看到這個界面:
可以看到,無論是在 Windows 還是在 linux 下,輸入相關指令都能顯示出這台機器上所有的網卡。大部分的網卡都會有一個 IP 位址。就像 192.168.1.73 ,就是我本機以太網的 IP 位址。
IP 位址是一個網卡在網絡世界中的通訊位址,相當于我們現實世界的門牌号碼。
注意,IP 位址是網卡的通訊位址,不是一台機器的通訊位址。很多時候,我們會說一個電腦隻有一個 IP 位址,這種說法實質上并不正确,準确的來說,應該是:
一個網卡在同一時段隻能有一個 IP 位址,一台機器可以有多個 IP 位址。
就像我們的筆記本,一般都會有線網卡和無線網卡,則有線網卡有一個 IP 位址,無線網卡也有一個 IP 位址。
一台機器有多個 IP 位址,那 IP 位址會不會重複呢?其實我們應該會碰到 IP 位址重複的情況。有時候我們電腦彈出網絡位址沖突,出現無法上網的情況,那多半就是 IP 位址沖突了。
就像上面輸出的結果,192.168.1.73 就是一個 IP 位址。這個位址被點(.)分割為四個部分,每個部分有 8 個 bit,是以 IP 位址總共是 32 位。顯然,32 位産生的 IP 位址在當今這個網際網路社會,很明顯就是"狼多肉少"。于是就有了 IPv6,也就是上面結果中的 fe80::515d:5483:ff4d:6db9/64。這個有 128 位,能滿足我們現在的需求了。至于後面會不會出現 IPv8 ,那就看後面網際網路世界的發展了。
我們應該都聽說過,IP 位址分為 A、B、C、D、E 五類。對于 A、B、C 類,主要分兩部分,前面一部分是網絡号,後面一部分是主機号。
下圖是 A、B、C 三類位址所能包含的主機數量。
這裡面有個問題,C 類位址包含的主機數量太少,而 B 類位址包含的主機數量又太多,于是就有了一個折中的方式叫做無類型域間選路。
顧名思義,無類型域間選路(CIDR)基本思想是取消位址的分類結構,取而代之的是允許以可變長分界的方式配置設定網絡數。192.168.1.73/24 就是無類型域間選路格式的 IP 位址。這種格式的 IP 位址,将 32 位的 IP 位址一分為二,前面是網絡号,後面是主機号。從哪裡分呢?如果注意觀察的話可以看到,上面位址中有一個斜杠,斜杠後一個數字 24。這個 24 的含義就是,前24 位是網絡号,後 8 位是主機号。
繼續看上面的表格。表格最右列是私有 IP 位址段。平時我們在一個區域網路内,看到的 IP 位址都是私有 IP 位址。因為這些位址允許組織内部的 IT 人員自己管理和配置設定,而且還可以重複。是以會出現你區域網路的私有 IP 位址段和我區域網路的是一樣的。
就像我們上面說的,小明在自己家裡給同單元的小夥伴說自己是五單元 101 号,小夥伴能了解,但是他如果這樣和小紅說,小紅就會問,你是哪個小區的?這裡的小區實際上就是公有 IP 位址,而五單元 101 号就是私有 IP 位址。
表格中的 192.168.0.x 是最常見的私有 IP 位址段。就像我們家裡的路由器位址一般是 192.168.0.1 一樣。
IP 配置設定我們平時應該接觸比較少。還記得在大學的時候,剛入學第一件事就是趕緊交網費。交網費時會有一個步驟,網管會讓你提供 MAC 位址,然後把 IP 位址和 MAC 位址綁定,這也就是部落客在隔壁宿舍無法通過網線上網的原因。
其實,如果你有相關的知識積累,可以用指令行自己配置 IP 位址。當然,能不能通信就看你的知識儲備量了。
除了指令行配置外,我們平時應該對于 IP 配置設定應該都是用的 "拿來主義"。無論是在學校還是在辦公室,都會有網絡管理者把配置設定好的 IP 給你,直接使用就可以了。但是有時候也會好奇,網管是怎麼配置設定 IP 的呢?難不成通過指令行一個個配置?這時候就要用到動态主機配置協定(DHCP)。
動态主機配置協定
這個協定的工作原理是怎樣的呢?我們就拿一台機器新加入一個網絡為例,來走一遍 DHCP 的工作流程。
當一台機器新加入一個網絡時,肯定一臉懵逼,啥情況也不知道,隻知道自己的 MAC 位址。沒人理你怎麼辦?那不管三七二十一,先吼一聲,告訴所有人,我來了,有人嗎?這時候的溝通基本靠"吼"。這一步,我們稱為 DHCP Discover。
新來的機器使用 IP 位址 0.0.0.0 發送了一個廣播包,目的 IP 位址是 255.255.255.255。廣播包封裝在 UDP 裡面,UDP 封裝在 BOOTP 裡面。在這個廣播包裡,新人大喊:我是新來的(Boot Request),我的 MAC 位址是 xxx,我還沒有 IP,誰能給我個 IP 位址?格式就像下面這樣:
這時候,網絡裡的 DHCP Server 就相當于這個區域網路的管理者。他知道來了一個"新人",需要給它配置設定一個 IP 位址,這個過程就是 DHCP Offer。同時,DHCP Server 保留為此機器提供的 IP 位址,進而不會再将相同的 IP 位址配置設定給其它的機器。而 DHCP Offer 的格式就像下圖,裡面有給新人配置設定的位址。
DHCP Server 仍然使用廣播位址作為目的位址,因為,此時請求配置設定的新人還沒有自己的 IP 位址。如果一個區域網路中有多個 DHCP Server,這台新機器會收到多個 DHCP Offer。
它會選擇其中一個 DHCP Offer,一般是最先到達的那個,并且會向網絡發送一個 DHCP Request 廣播資料表,包中包含用戶端的 MAC 位址、接受配置設定的 IP 位址、提供此 IP 的 DHCP 伺服器位址等,并告訴所有的 DHCP Server 它将接受哪一台伺服器提供的 IP 位址,告訴其他 DHCP 伺服器撤銷它們提供的 IP 位址,以便提供給下一個 IP 請求配置設定者。新人廣播包格式如下:
此時,由于還沒有得到 DHCP Server 的最後确認,新機器仍然使用 0.0.0.0 為源 IP 位址、255.255.255.255 為目标位址進行廣播。
當 DHCP Server 接收到新機器的 DHCP Request 之後,會廣播傳回給新機器一個 DHCP ACK 消息包,表明已經接受新機器的選擇,并将這一 IP 位址配置設定資訊和其他配置資訊都放入該廣播包,發給新機器。DHCP ACK 格式如下:
新機器收到 DHCP ACK 後,會檢測配置設定的 IP 位址是否能夠适應,如果不能使用,它就會給 DHCP Server 發出 DHCP Decline 消息,通知 DHCP Server 禁用這個 IP 位址,然後新機器就開始新的位址申請過程。
在新機器使用 IP 租期超過 50% 時,DHCP Client 會以單點傳播形式向 DHCP Server 發送 DHCP Request 封包來續租 IP 位址。如果 DHCP Client 成功收到 DHCP Server 發送的 DHCP ACK 封包,則按相應時間延長 IP 位址租期;如果沒有收到 DHCP Server 發送的 DHCP ACK 封包,則 DHCP Client 繼續使用這個 IP 位址。
在新機器使用 IP 租期超過 87.5% 時,DHCP Client 會以廣播形式向 DHCP Server 發送 DHCPRequest 封包來續租 IP 位址。如果 DHCP Client 成功收到 DHCP Server 發送的 DHCP ACK 封包,則按相應時間延長 IP 位址租期;如果沒有收到 DHCP Server 發送的 DHCP ACK 封包,則 DHCP Client 繼續使用這個IP位址,直到 IP 位址使用租期到期時,DHCP Client 才會向 DHCP Server 發送 DHCP Release 封包來釋放這個 IP 位址,并開始新的 IP 位址申請過程。
在我們查詢 IP 位址的輸出結果中,有一行:
Link encap:Ethernet HWaddr 28:d2:44:ce:77:51
這個被稱為 MAC 位址,是一個網卡的實體位址,用十六進制,6 個 byte 表示。
MAC 位址是一個很容易讓人誤解的位址。因為 MAC 位址号稱全球唯一,不會存在有相同 MAC 位址的網卡。這就很容易讓我們想,既然全球唯一,那網絡通信直接用 MAC 位址不行嗎?為什麼要加個 IP 位址,多封裝一層,再去通信呢?
當然是不行的。我們想把一個網絡包從一個地方傳到另一個地方,除了有确定的位址外,還需要有定位功能。就像你去廣州找部落客一樣,我隻告訴你我的身份證号,你能在廣州找到我嗎?這種尋找無異于大海撈針。但是如果我告訴你我的詳細位址,你就可以直接通過導航找到對應的位址,然後再找到我。
IP 位址在一定程度上就承擔了詳細位址這種遠端地位的功能。MAC 位址更像是身份證号,是一個唯一的辨別。它的唯一性設計是為了組網的時候,不同的網卡放在一個網絡裡面,不用擔心沖突。
當然,MAC 位址也有一定的定位功能。就像你來到了部落客所在的辦公室,你可以在辦公室喊身份證号是 XXX 的是哪位?部落客聽到了,就會站起來回答你。但是如果你在部落客聽不到的地方喊,那肯定不會有人應你。這就說明,MAC 位址的通信範圍比較小,僅僅局限在一個子網内。