1. 程式人生 > >網路協議 2 - IP 是怎麼來,又是怎麼沒的?

網路協議 2 - IP 是怎麼來,又是怎麼沒的?

瞭解完網路協議,我們會發現,網路通訊的五層模型裡,有兩個很重要的概念:IP 地址和 MAC 地址。

那麼 IP 地址是怎麼來的,又是怎麼沒的?MAC 地址與 IP 地址又有什麼區別?

這回答上面問題前,先熱下身,大家知道如何檢視本機的 IP 嗎?這個問題,即便是沒有專業學過計算機的人,只要折騰過電腦,重灌過系統,大多都會知道答案:在 Windows 下是 ipconfig,在 linux 下是 ifconfig。

在 Windows 下輸入 ipconfig,我們會看到這個介面:
861679-20181030165734160-2053570721.png

在 linux 下輸入 ifconfig,我們會看到這個介面:
861679-20181030165755322-934432138.png

IP 地址

可以看到,無論是在 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 類,主要分兩部分,前面一部分是網路號,後面一部分是主機號。
861679-20181030165845943-1138936572.png

下圖是 A、B、C 三類地址所能包含的主機數量。
861679-20181030165857569-1223148974.png

這裡面有個問題,C 類地址包含的主機數量太少,而 B 類地址包含的主機數量又太多,於是就有了一個折中的方式叫做無型別域間選路

無型別域間選路

顧名思義,無型別域間選路(CIDR)基本思想是取消地址的分類結構,取而代之的是允許以可變長分界的方式分配網路數。192.168.1.73/24 就是無型別域間選路格式的 IP 地址。這種格式的 IP 地址,將 32 位的 IP 地址一分為二,前面是網路號,後面是主機號。從哪裡分呢?如果注意觀察的話可以看到,上面地址中有一個斜槓,斜槓後一個數字 24。這個 24 的含義就是,前24 位是網路號,後 8 位是主機號。

公有 IP 地址和私有 IP 地址

861679-20181030165910003-2041184349.png

繼續看上面的表格。表格最右列是私有 IP 地址段。平時我們在一個區域網內,看到的 IP 地址都是私有 IP 地址。因為這些地址允許組織內部的 IT 人員自己管理和分配,而且還可以重複。所以會出現你區域網的私有 IP 地址段和我區域網的是一樣的。

就像我們上面說的,小明在自己家裡給同單元的小夥伴說自己是五單元 101 號,小夥伴能理解,但是他如果這樣和小紅說,小紅就會問,你是哪個小區的?這裡的小區實際上就是公有 IP 地址,而五單元 101 號就是私有 IP 地址。

表格中的 192.168.0.x 是最常見的私有 IP 地址段。就像我們家裡的路由器地址一般是 192.168.0.1 一樣。

IP 分配與釋放

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 地址?格式就像下面這樣:
861679-20181030170020219-2141282496.png

這時候,網路裡的 DHCP Server 就相當於這個區域網的管理員。他知道來了一個"新人",需要給它分配一個 IP 地址,這個過程就是 DHCP Offer。同時,DHCP Server 保留為此機器提供的 IP 地址,從而不會再將相同的 IP 地址分配給其它的機器。而 DHCP Offer 的格式就像下圖,裡面有給新人分配的地址。
861679-20181030170042933-2023439288.png

DHCP Server 仍然使用廣播地址作為目的地址,因為,此時請求分配的新人還沒有自己的 IP 地址。如果一個區域網中有多個 DHCP Server,這臺新機器會收到多個 DHCP Offer。

它會選擇其中一個 DHCP Offer,一般是最先到達的那個,並且會向網路傳送一個 DHCP Request 廣播資料表,包中包含客戶端的 MAC 地址、接受分配的 IP 地址、提供此 IP 的 DHCP 伺服器地址等,並告訴所有的 DHCP Server 它將接受哪一臺伺服器提供的 IP 地址,告訴其他 DHCP 伺服器撤銷它們提供的 IP 地址,以便提供給下一個 IP 請求分配者。新人廣播包格式如下:
861679-20181030170128080-1631829146.png

此時,由於還沒有得到 DHCP Server 的最後確認,新機器仍然使用 0.0.0.0 為源 IP 地址、255.255.255.255 為目標地址進行廣播。

當 DHCP Server 接收到新機器的 DHCP Request 之後,會廣播返回給新機器一個 DHCP ACK 訊息包,表明已經接受新機器的選擇,並將這一 IP 地址分配資訊和其他配置資訊都放入該廣播包,發給新機器。DHCP ACK 格式如下:
861679-20181030170151917-2050620167.png

新機器收到 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 地址申請過程。

MAC 地址

在我們查詢 IP 地址的輸出結果中,有一行:

Link encap:Ethernet HWaddr 28:d2:44:ce:77:51

這個被稱為 MAC 地址,是一個網絡卡的實體地址,用十六進位制,6 個 byte 表示。

MAC 地址是一個很容易讓人誤解的地址。因為 MAC 地址號稱全球唯一,不會存在有相同 MAC 地址的網絡卡。這就很容易讓我們想,既然全球唯一,那網路通訊直接用 MAC 地址不行嗎?為什麼要加個 IP 地址,多封裝一層,再去通訊呢?

當然是不行的。我們想把一個網路包從一個地方傳到另一個地方,除了有確定的地址外,還需要有定位功能。就像你去廣州找博主一樣,我只告訴你我的身份證號,你能在廣州找到我嗎?這種尋找無異於大海撈針。但是如果我告訴你我的詳細地址,你就可以直接通過導航找到對應的地址,然後再找到我。

IP 地址在一定程度上就承擔了詳細地址這種遠端地位的功能。MAC 地址更像是身份證號,是一個唯一的標識。它的唯一性設計是為了組網的時候,不同的網絡卡放在一個網路裡面,不用擔心衝突。

當然,MAC 地址也有一定的定位功能。就像你來到了博主所在的辦公室,你可以在辦公室喊身份證號是 XXX 的是哪位?博主聽到了,就會站起來回答你。但是如果你在博主聽不到的地方喊,那肯定不會有人應你。這就說明,MAC 地址的通訊範圍比較小,僅僅侷限在一個子網內。

參考:

  1. 劉超-趣談網路協議系列課;
  2. 百度百科-DHCP 詞條;
  3. 百度百科-CIDR 詞條;