淺談網絡協議(四) IP的由來--DHCP與PXE

上一節說過,IP就是一臺計算機的通訊地址,要和其他機器通訊,就需要一個通訊地址,就要給網卡配置這麼一個地址。

配置 IP

那如何配置呢?可以使用 ifconfig,也可以使用 ip addr。設置好了之後,用這兩個命令,將網卡 up 一下,就可以開始工作了。

使用 net-tools:

$ sudo ifconfig eth1 10.0.0.1/24
$ sudo ifconfig eth1 up
使用 iproute2:

$ sudo ip addr add 10.0.0.1/24 dev eth1
$ sudo ip link set up eth1

這個配置是不是很簡單?但是如果胡亂配置會怎麼樣?例如,旁邊的機器都是 192.168.1.x,我非得配置一個 16.158.23.6,會出現什麼現象呢?

不會出現任何現象,就是包發不出去。爲什麼發不出去呢?

之前講過,只要是在網絡上的數據包,都是完整的,可以有下層沒上層,絕對不可能有上層沒下層。

所以僅有源 IP 地址 16.158.23.6,也有目標 IP 地址 192.168.1.6,可是沒有目標的 MAC 地址,所以包還是發不出去。
那怎麼獲取目標的 MAC 地址呢?Linux 首先會判斷,要去的地址和本機是不是同一個網段,或者和網卡是不是同一網段。只有是一個網段的,它纔會發送 ARP 請求,獲取 MAC 地址。如果發現不是呢?

Linux 默認的邏輯是,如果這是一個跨網段的調用,它便不會直接將包發送到網絡上,而是企圖將包發送到網關。

如果配置了網關的話,Linux 會獲取網關的 MAC 地址,然後將包發出去。對於 192.168.1.6 這臺機器來講,雖然路過它家門的這個包,目標 IP 是它,但是 MAC 地址不是它的,所以它的網卡是不會把包收進去的。如果沒有配置網關,那包就發不出去了。

如果將網關配置爲 192.168.1.6 呢?不可能,Linux 不會讓你配置成功的,因爲網關要和當前的網絡至少一個網卡是同一個網段。

所以,當需要手動配置一臺機器的網絡 IP 時,一定要向網絡管理員給你分配一段正確的 IP 地址。當然,真正配置的時候,一定不是直接用命令配置的,而是放在一個配置文件裏面。不同系統的配置文件格式不同,但是無非就是 CIDR、子網掩碼、廣播地址和網關地址。

動態主機配置協議(DHCP)

配置了 IP 之後一般不能變的,所以手動配置 IP 會有很大的限制,畢竟經常的客戶端變動等等。因此,需要有一個自動配置的協議來自動化的分配 IP ,也就是動態主機配置協議(Dynamic Host Configuration Protocol)。

配置一段共享的 IP 地址後,每一臺機器新接入時都會通過 DHCP 協議來這個共享的 IP 地址裏申請,然後自動配置好就可以了。機器離線之後,就會把 IP 換回去,別的機器可以再次使用。

解析 DHCP 的工作方式

當一臺機器新加入一個網絡的時候,只知道自己的 MAC 地址,還沒有分配 IP,這個時候就靠吼了。這一步,我們稱爲DHCP Discover。

新來的機器使用 IP 地址 0.0.0.0 發送了一個廣播包,目的 IP 地址爲 255.255.255.255。廣播包封裝在 UDP 裏面,UDP 封裝在 BOOTP 裏面。其實 DHCP 是 BOOTP 的增強版,但是如果你去抓包的話,很可能看到的名稱還是 BOOTP 協議。

廣播的格式就像這樣:

1

如果一個網絡管理員在網絡裏面配置了DHCP Server的話,他就相當於這些 IP 的管理員。他立刻能知道來了一個“新人”。這個時候,我們可以體會 MAC 地址唯一的重要性了。當一臺機器帶着自己的 MAC 地址加入一個網絡的時候,MAC 是它唯一的身份,如果連這個都重複了,就沒辦法配置了。

只有 MAC 唯一,IP 管理員才能知道這是一個新人,就會給他分配一個 IP 地址,這個過程我們稱爲DHCP Offer。同時,DHCP Server 爲此客戶保留爲它提供的 IP 地址,從而不會爲其他 DHCP 客戶分配此 IP 地址。

DHCP Offer 的格式就像這樣:

2

DHCP Server 仍然使用廣播地址作爲目的地址,因爲,此時請求分配 IP 的新人還沒有自己的 IP。除此之外,服務器還發送了子網掩碼、網關和 IP 地址有效期等信息。

如果有多個 DHCP Server,這臺新機器會收到多個 IP 地址,它會選擇其中一個 DHCP Offer,一般是最先到達的那個,並且會向網絡發送一個 DHCP Request 廣播數據包,包中包含客戶端的 MAC 地址、接受的分配中的 IP 地址、提供此 IP 的 DHCP 服務器地址等,並告訴所有 DHCP Server 它將接受哪一臺服務器提供的 IP 地址,告訴其他 DHCP 服務器,並請求撤銷它們提供的 IP 地址,以便提供給下一個 IP 分配請求者。

DHCP Request:
3

此時,由於還沒有得到 DHCP Server 的最後確認,客戶端仍然使用 0.0.0.0 爲源 IP 地址、255.255.255.255 爲目標地址進行廣播。在 BOOTP 裏面,接受某個 DHCP Server 的分配的 IP。

當 DHCP Server 接收到客戶機的 DHCP request 之後,會廣播返回給客戶機一個 DHCP ACK 消息包,表明已經接受客戶機的選擇,並將這一 IP 地址的合法分配信息和其他的配置信息都放入該廣播包,發給客戶機,歡迎它加入網絡大家庭。

DHCP ACK:
4

最終分配達成的時候,還是需要廣播一下,讓大家都知道。

IP 地址的收回和續期

如果不用的話,收回就收回了。就像你租房子一樣,如果還要續租的話,不能到了時間再續租,而是要提前一段時間給房東說。DHCP 也是這樣。

客戶機會在有效期過去 50% 的時候,直接向爲其提供 IP 地址的 DHCP Server 發送 DHCP request 消息包。客戶機接收到該服務器迴應的 DHCP ACK 消息包,會根據包中所提供的新的有效期以及其他已經更新的 TCP/IP 參數,更新自己的配置。這樣,IP 配置更新就完成了。

DHCP 協議大部分人都知道,但是其實裏面隱藏着一個細節,很多人可能不會去注意。接下來,還有一個有意思的事情:網絡管理員不僅能自動分配 IP 地址,還能幫你自動安裝操作系統!

預啓動執行環境(PXE)

一臺沒有操作系統的空機器,很多人還是會安裝系統的。但是如果給你幾百臺的空的機器呢?數據中心的管理員就有可能遇到這種問題。那麼能不能自動安裝系統呢?

仔細一想,還是挺有難度的。
正常安裝操作系統,應該有個光盤,再不濟得有個U盤。數據中心又不能用這些,想了一個辦法就是要安裝的操作系統放在一個服務器上,讓客戶端去下載。那麼如何去實現呢?一開始空機器上面也沒有客戶端,更不知道去哪裏下載。

這個過程和操作系統啓動的過程有點兒像。首先,啓動 BIOS。這是一個特別小的小系統,只能幹特別小的一件事情。其實就是讀取硬盤的 MBR 啓動扇區,將 GRUB 啓動起來;然後將權力交給 GRUB,GRUB 加載內核、加載作爲根文件系統的 initramfs 文件;然後將權力交給內核;最後內核啓動,初始化整個操作系統。

安裝操作系統的過程,只能插在 BIOS 啓動之後了。因爲沒安裝系統之前,連啓動扇區都沒有。因而這個過程叫做預啓動執行環境(Pre-boot Execution Environment),簡稱PXE。

PXE 協議分爲客戶端和服務器端,由於還沒有操作系統,只能先把客戶端放在 BIOS 裏面。當計算機啓動時,BIOS 把 PXE 客戶端調入內存裏面,就可以連接到服務端做一些操作了。

再 PXE 的客戶端啓動起來之後,發送一個 DHCP 的請求,讓 DHCP Server 給它分配一個地址。PXE 客戶端有了自己的地址,那它怎麼知道 PXE 服務器在哪裏呢?對於其他的協議,都好辦,要麼人告訴他。例如,告訴瀏覽器要訪問的 IP 地址,或者在配置中告訴它;例如,微服務之間的相互調用。

但是 PXE 客戶端啓動的時候並沒有那些。所以 DHCP Server 除了分配 IP 地址以外,還可以做一些其他的事情。這裏有一個 DHCP Server 的一個樣例配置:

ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.168.1.0 netmask 255.255.255.0
{
option routers 192.168.1.1;
option subnet-mask 255.255.255.0;
option time-offset -18000;
default-lease-time 21600;
max-lease-time 43200;
range dynamic-bootp 192.168.1.240 192.168.1.250;
filename "pxelinux.0";
next-server 192.168.1.180;
}

默認的 DHCP Server 是需要配置的,無非是我們配置 IP 的時候所需要的 IP 地址段、子網掩碼、網關地址、有效期等。如果想使用 PXE,則需要配置 next-server,指向 PXE 服務器的地址,另外要配置初始啓動文件 filename。

這樣 PXE 客戶端啓動之後,發送 DHCP 請求之後,除了能得到一個 IP 地址,還可以知道 PXE 服務器在哪裏,也可以知道如何從 PXE 服務器上下載某個文件,去初始化操作系統。

解析 PXE 的工作過程

接下來我們來詳細看一下 PXE 的工作過程。

首先,啓動 PXE 客戶端。第一步是通過 DHCP 協議分配一個 IP 地址,同時也給它 PXE 服務器的地址、啓動文件名稱 pxelinux.0。

其次,當 PXE 客戶端知道要去 PXE 服務器地址與下載文件名之後,就會使用 TFTP 協議開始下載。所以 PXE 服務器上,往往還需要有一個 TFTP 服務器。PXE 客戶端向 TFTP 服務器請求下載這個文件。

然後,PXE 客戶端在下載完成後直接開始執行這個文件。這個文件會指示 PXE 客戶端,向 TFTP 服務器請求計算機的配置信息 pxelinux.cfg。TFTP 服務器會給 PXE 客戶端一個配置文件,裏面會說內核、initramfs 的位置。PXE 客戶端會請求這些文件。

最好,啓動 Linux 內核。一旦啓動了操作系統,以後就啥都好辦了。

5

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章