上一節說過,IP就是一臺計算機的通信地址,要和其餘機器通信,就須要一個通信地址,就要給網卡配置這麼一個地址。linux
那如何配置呢?可使用 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,會出現什麼現象呢?bash
不會出現任何現象,就是包發不出去。爲何發不出去呢?服務器
以前講過,只要是在網絡上的數據包,都是完整的,能夠有下層沒上層,絕對不可能有上層沒下層。網絡
因此僅有源 IP 地址 16.158.23.6,也有目標 IP 地址 192.168.1.6,但是沒有目標的 MAC 地址,因此包仍是發不出去。
那怎麼獲取目標的 MAC 地址呢?Linux 首先會判斷,要去的地址和本機是否是同一個網段,或者和網卡是否是同一網段。只有是一個網段的,它纔會發送 ARP 請求,獲取 MAC 地址。若是發現不是呢?微服務
Linux 默認的邏輯是,若是這是一個跨網段的調用,它便不會直接將包發送到網絡上,而是企圖將包發送到網關。操作系統
若是配置了網關的話,Linux 會獲取網關的 MAC 地址,而後將包發出去。對於 192.168.1.6 這臺機器來說,雖然路過它家門的這個包,目標 IP 是它,可是 MAC 地址不是它的,因此它的網卡是不會把包收進去的。若是沒有配置網關,那包就發不出去了。3d
若是將網關配置爲 192.168.1.6 呢?不可能,Linux 不會讓你配置成功的,由於網關要和當前的網絡至少一個網卡是同一個網段。code
因此,當須要手動配置一臺機器的網絡 IP 時,必定要向網絡管理員給你分配一段正確的 IP 地址。固然,真正配置的時候,必定不是直接用命令配置的,而是放在一個配置文件裏面。不一樣系統的配置文件格式不一樣,可是無非就是 CIDR、子網掩碼、廣播地址和網關地址。router
配置了 IP 以後通常不能變的,因此手動配置 IP 會有很大的限制,畢竟常常的客戶端變更等等。所以,須要有一個自動配置的協議來自動化的分配 IP ,也就是動態主機配置協議(Dynamic Host Configuration Protocol)。
配置一段共享的 IP 地址後,每一臺機器新接入時都會經過 DHCP 協議來這個共享的 IP 地址裏申請,而後自動配置好就能夠了。機器離線以後,就會把 IP 換回去,別的機器能夠再次使用。
當一臺機器新加入一個網絡的時候,只知道本身的 MAC 地址,尚未分配 IP,這個時候就靠吼了。這一步,咱們稱爲DHCP Discover。
新來的機器使用 IP 地址 0.0.0.0 發送了一個廣播包,目的 IP 地址爲 255.255.255.255。廣播包封裝在 UDP 裏面,UDP 封裝在 BOOTP 裏面。其實 DHCP 是 BOOTP 的加強版,可是若是你去抓包的話,極可能看到的名稱仍是 BOOTP 協議。
廣播的格式就像這樣:
若是一個網絡管理員在網絡裏面配置了DHCP Server的話,他就至關於這些 IP 的管理員。他馬上能知道來了一個「新人」。這個時候,咱們能夠體會 MAC 地址惟一的重要性了。當一臺機器帶着本身的 MAC 地址加入一個網絡的時候,MAC 是它惟一的身份,若是連這個都重複了,就沒辦法配置了。
只有 MAC 惟一,IP 管理員才能知道這是一個新人,就會給他分配一個 IP 地址,這個過程咱們稱爲DHCP Offer。同時,DHCP Server 爲此客戶保留爲它提供的 IP 地址,從而不會爲其餘 DHCP 客戶分配此 IP 地址。
DHCP Offer 的格式就像這樣:
DHCP Server 仍然使用廣播地址做爲目的地址,由於,此時請求分配 IP 的新人尚未本身的 IP。除此以外,服務器還發送了子網掩碼、網關和 IP 地址有效期等信息。
若是有多個 DHCP Server,這臺新機器會收到多個 IP 地址,它會選擇其中一個 DHCP Offer,通常是最早到達的那個,而且會向網絡發送一個 DHCP Request 廣播數據包,包中包含客戶端的 MAC 地址、接受的分配中的 IP 地址、提供此 IP 的 DHCP 服務器地址等,並告訴全部 DHCP Server 它將接受哪一臺服務器提供的 IP 地址,告訴其餘 DHCP 服務器,並請求撤銷它們提供的 IP 地址,以便提供給下一個 IP 分配請求者。
DHCP Request:
此時,因爲尚未獲得 DHCP Server 的最後確認,客戶端仍然使用 0.0.0.0 爲源 IP 地址、255.255.255.255 爲目標地址進行廣播。在 BOOTP 裏面,接受某個 DHCP Server 的分配的 IP。
當 DHCP Server 接收到客戶機的 DHCP request 以後,會廣播返回給客戶機一個 DHCP ACK 消息包,代表已經接受客戶機的選擇,並將這一 IP 地址的合法分配信息和其餘的配置信息都放入該廣播包,發給客戶機,歡迎它加入網絡你們庭。
DHCP ACK:
最終分配達成的時候,仍是須要廣播一下,讓你們都知道。
若是不用的話,收回就收回了。就像你租房子同樣,若是還要續租的話,不能到了時間再續租,而是要提早一段時間給房東說。DHCP 也是這樣。
客戶機會在有效期過去 50% 的時候,直接向爲其提供 IP 地址的 DHCP Server 發送 DHCP request 消息包。客戶機接收到該服務器迴應的 DHCP ACK 消息包,會根據包中所提供的新的有效期以及其餘已經更新的 TCP/IP 參數,更新本身的配置。這樣,IP 配置更新就完成了。
DHCP 協議大部分人都知道,可是其實裏面隱藏着一個細節,不少人可能不會去注意。接下來,還有一個有意思的事情:網絡管理員不只能自動分配 IP 地址,還能幫你自動安裝操做系統!
一臺沒有操做系統的空機器,不少人仍是會安裝系統的。可是若是給你幾百臺的空的機器呢?數據中心的管理員就有可能遇到這種問題。那麼能不能自動安裝系統呢?
仔細一想,仍是挺有難度的。
正常安裝操做系統,應該有個光盤,再不濟得有個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 客戶端。第一步是經過 DHCP 協議分配一個 IP 地址,同時也給它 PXE 服務器的地址、啓動文件名稱 pxelinux.0。
其次,當 PXE 客戶端知道要去 PXE 服務器地址與下載文件名以後,就會使用 TFTP 協議開始下載。因此 PXE 服務器上,每每還須要有一個 TFTP 服務器。PXE 客戶端向 TFTP 服務器請求下載這個文件。
而後,PXE 客戶端在下載完成後直接開始執行這個文件。這個文件會指示 PXE 客戶端,向 TFTP 服務器請求計算機的配置信息 pxelinux.cfg。TFTP 服務器會給 PXE 客戶端一個配置文件,裏面會說內核、initramfs 的位置。PXE 客戶端會請求這些文件。
最好,啓動 Linux 內核。一旦啓動了操做系統,之後就啥都好辦了。