深入学习网络协议4:DHCP与PXE:IP是怎么来的,又是怎么没的?

深入学习网络协议4:DHCP与PXE:IP是怎么来的,又是怎么没的? 引言上一节我们讲了 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会出现什么现象呢不会出现任何现象就是包发不出去呗。为什么发不出去呢我来举例说明。192.168.1.6 就在你这台机器的旁边甚至是在同一个交换机上而你把机器的地址设为了 16.158.23.6。在这台机器上你企图去 ping192.168.1.6你觉得只要将包发出去同一个交换机的另一台机器马上就能收到对不对可是 Linux 系统不是这样的它没你想的那么智能。你用肉眼看到那台机器就在旁边它则需要根据自己的逻辑进行处理。还记得我们在第二节说过的原则吗只要是在网络上跑的包都是完整的可以有下层没上层绝对不可能有上层没下层。所以你看着它有自己的源 IP 地址 16.158.23.6也有目标 IP 地址 192.168.1.6但是包发不出去这是因为 MAC 层还没填。自己的 MAC 地址自己知道这个容易。但是目标 MAC 填什么呢是不是填 192.168.1.6 这台机器的 MAC 地址呢当然不是。Linux 首先会判断要去的这个地址和我是一个网段的吗或者和我的一个网卡是同一网段的吗只有是一个网段的它才会发送 ARP 请求获取 MAC 地址。如果发现不是呢Linux 默认的逻辑是如果这是一个跨网段的调用它便不会直接将包发送到网络上而是企图将包发送到网关。如果你配置了网关的话Linux 会获取网关的 MAC 地址然后将包发出去。对于 192.168.1.6 这台机器来讲虽然路过它家门的这个包目标 IP 是它但是无奈 MAC 地址不是它的所以它的网卡是不会把包收进去的。如果没有配置网关呢那包压根就发不出去。如果将网关配置为 192.168.1.6 呢不可能Linux 不会让你配置成功的因为网关要和当前的网络至少一个网卡是同一个网段的怎么可能 16.158.23.6 的网关是 192.168.1.6 呢所以当你需要手动配置一台机器的网络 IP 时一定要好好问问你的网络管理员。如果在机房里面要去网络管理员那里申请让他给你分配一段正确的 IP 地址。当然真正配置的时候一定不是直接用命令配置的而是放在一个配置文件里面。不同系统的配置文件格式不同但是无非就是 CIDR、子网掩码、广播地址和网关地址。动态主机配置协议DHCP原来配置 IP 有这么多门道儿啊。你可能会问了配置了 IP 之后一般不能变的配置一个服务端的机器还可以但是如果是客户端的机器呢我抱着一台笔记本电脑在公司里走来走去或者白天来晚上走每次使用都要配置 IP 地址那可怎么办还有人事、行政等非技术人员如果公司所有的电脑都需要 IT 人员配置肯定忙不过来啊。因此我们需要有一个自动配置的协议也就是动态主机配置协议Dynamic Host Configuration Protocol简称 DHCP。有了这个协议网络管理员就轻松多了。他只需要配置一段共享的 IP 地址。每一台新接入的机器都通过 DHCP 协议来这个共享的 IP 地址里申请然后自动配置好就可以了。等人走了或者用完了还回去这样其他的机器也能用。所以说如果是数据中心里面的服务器IP 一旦配置好基本不会变这就相当于买房自己装修。DHCP 的方式就相当于租房。你不用装修都是帮你配置好的。你暂时用一下用完退租就可以了。解析 DHCP 的工作方式当一台机器新加入一个网络的时候肯定一脸懵啥情况都不知道只知道自己的 MAC 地址。怎么办先吼一句我来啦有人吗这时候的沟通基本靠“吼”。这一步我们称为 DHCP Discover。新来的机器使用 IP 地址 0.0.0.0 发送了一个广播包目的 IP 地址为 255.255.255.255。广播包封装了 UDPUDP 封装了 BOOTP。其实 DHCP 是 BOOTP 的增强版但是如果你去抓包的话很可能看到的名称还是 BOOTP 协议。在这个广播包里面新人大声喊我是新来的Boot request我的 MAC 地址是这个我还没有 IP谁能给租给我个 IP 地址格式就像这样如果一个网络管理员在网络里面配置了 DHCP Server 的话他就相当于这些 IP 的管理员。他立刻能知道来了一个“新人”。这个时候我们可以体会 MAC 地址唯一的重要性了。当一台机器带着自己的 MAC 地址加入一个网络的时候MAC 是它唯一的身份如果连这个都重复了就没办法配置了。只有 MAC 唯一IP 管理员才能知道这是一个新人需要租给它一个 IP 地址这个过程我们称为 DHCP Offer。同时DHCP Server 为此客户保留为它提供的 IP 地址从而不会为其他 DHCP 客户分配此 IP 地址。DHCP Offer 的格式就像这样里面有给新人分配的地址。DHCP Server 仍然使用广播地址作为目的地址因为此时请求分配 IP 的新人还没有自己的 IP。DHCP Server 回复说我分配了一个可用的 IP 给你你看如何除此之外服务器还发送了子网掩码、网关和 IP 地址租用期等信息。新来的机器很开心它的“吼”得到了回复并且有人愿意租给它一个 IP 地址了这意味着它可以在网络上立足了。当然更令人开心的是如果有多个 DHCP Server这台新机器会收到多个 IP 地址简直受宠若惊。它会选择其中一个 DHCP Offer一般是最先到达的那个并且会向网络发送一个 DHCP Request 广播数据包包中包含客户端的 MAC 地址、接受的租约中的 IP 地址、提供此租约的 DHCP 服务器地址等并告诉所有 DHCP Server 它将接受哪一台服务器提供的 IP 地址告诉其他 DHCP 服务器谢谢你们的接纳并请求撤销它们提供的 IP 地址以便提供给下一个 IP 租用请求者。此时由于还没有得到 DHCP Server 的最后确认客户端仍然使用 0.0.0.0 为源 IP 地址、255.255.255.255 为目标地址进行广播。在 BOOTP 里面接受某个 DHCP Server 的分配的 IP。当 DHCP Server 接收到客户机的 DHCP request 之后会广播返回给客户机一个 DHCP ACK 消息包表明已经接受客户机的选择并将这一 IP 地址的合法租用信息和其他的配置信息都放入该广播包发给客户机欢迎它加入网络大家庭。最终租约达成的时候还是需要广播一下让大家都知道。IP 地址的收回和续租既然是租房子就是有租期的。租期到了管理员就要将 IP 收回。如果不用的话收回就收回了。就像你租房子一样如果还要续租的话不能到了时间再续租而是要提前一段时间给房东说。DHCP 也是这样。客户机会在租期过去 50% 的时候直接向为其提供 IP 地址的 DHCP Server 发送 DHCP request 消息包。客户机接收到该服务器回应的 DHCP ACK 消息包会根据包中所提供的新的租期以及其他已经更新的 TCP/IP 参数更新自己的配置。这样IP 租用更新就完成了。好了一切看起来完美。DHCP 协议大部分人都知道但是其实里面隐藏着一个细节很多人可能不会去注意。接下来我就讲一个有意思的事情网络管理员不仅能自动分配 IP 地址还能帮你自动安装操作系统预启动执行环境PXE普通的笔记本电脑一般不会有这种需求。因为你拿到电脑时就已经有操作系统了即便你自己重装操作系统也不是很麻烦的事情。但是在数据中心里就不一样了。数据中心里面的管理员可能一下子就拿到几百台空的机器一个个安装操作系统会累死的。所以管理员希望的不仅仅是自动分配 IP 地址还要自动安装系统。装好系统之后自动分配 IP 地址直接启动就能用了这样当然最好了这事儿其实仔细一想还是挺有难度的。安装操作系统应该有个光盘吧。数据中心里不能用光盘吧想了一个办法就是可以将光盘里面要安装的操作系统放在一个服务器上让客户端去下载。但是客户端放在哪里呢它怎么知道去哪个服务器上下载呢客户端总得安装在一个操作系统上呀可是这个客户端本来就是用来安装操作系统的呀其实这个过程和操作系统启动的过程有点儿像。首先启动 BIOS。这是一个特别小的小系统只能干特别小的一件事情。其实就是读取硬盘的 MBR 启动扇区将 GRUB 启动起来然后将权力交给 GRUBGRUB 加载内核、加载作为根文件系统的 initramfs 文件然后将权力交给内核最后内核启动初始化整个操作系统。那我们安装操作系统的过程只能插在 BIOS 启动之后了。因为没安装系统之前连启动扇区都没有。因而这个过程叫做预启动执行环境Pre-boot Execution Environment简称 PXE。PXE 协议分为客户端和服务器端由于还没有操作系统只能先把客户端放在 BIOS 里面。当计算机启动时BIOS 把 PXE 客户端调入内存里面就可以连接到服务端做一些操作了。首先PXE 客户端自己也需要有个 IP 地址。因为 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 协议告诉 DHCP Server我刚来一穷二白啥都没有。DHCP Server 便租给它一个 IP 地址同时也给它 PXE 服务器的地址、启动文件 pxelinux.0。其次PXE 客户端知道要去 PXE 服务器下载这个文件后就可以初始化机器。于是便开始下载下载的时候使用的是 TFTP 协议。所以 PXE 服务器上往往还需要有一个 TFTP 服务器。PXE 客户端向 TFTP 服务器请求下载这个文件TFTP 服务器说好啊于是就将这个文件传给它。然后PXE 客户端收到这个文件后就开始执行这个文件。这个文件会指示 PXE 客户端向 TFTP 服务器请求计算机的配置信息 pxelinux.cfg。TFTP 服务器会给 PXE 客户端一个配置文件里面会说内核在哪里、initramfs 在哪里。PXE 客户端会请求这些文件。最后启动 Linux 内核。一旦启动了操作系统以后就啥都好办了。小结好了这一节就到这里了。我来总结一下今天的内容DHCP 协议主要是用来给客户租用 IP 地址和房产中介很像要商谈、签约、续租广播还不能“抢单”DHCP 协议能给客户推荐“装修队”PXE能够安装操作系统这个在云计算领域大有用处。