极客时间已完结课程限时免费阅读

第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?

第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?-极客时间

第4讲 | DHCP与PXE:IP是怎么来的,又是怎么没的?

讲述:刘超

时长13:50大小6.36M

上一节,我们讲了 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。广播包封装了 UDP,UDP 封装了 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 启动起来;然后将权力交给 GRUB,GRUB 加载内核、加载作为根文件系统的 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,能够安装操作系统,这个在云计算领域大有用处。
最后,学完了这一节,给你留两个思考题吧。
PXE 协议可以用来安装操作系统,但是如果每次重启都安装操作系统,就会很麻烦。你知道如何使得第一次安装操作系统,后面就正常启动吗?
现在上网很简单了,买个家用路由器,连上 WIFI,给 DHCP 分配一个 IP 地址,就可以上网了。那你是否用过更原始的方法自己组过简单的网呢?说来听听。
欢迎你留言和我讨论。趣谈网络协议,我们下期见!
分享给需要的人,Ta购买本课程,你将得20
生成海报并分享

赞 137

提建议

上一篇
第3讲 | ifconfig:最熟悉又陌生的命令行
下一篇
第5讲 | 从物理层到MAC层:如何在宿舍里自己组网玩联机游戏?
 写留言

精选留言(250)

  • 袁沛
    2018-05-25
    20年前大学宿舍里绕了好多同轴电缆的10M以太网,上BBS用IP,玩星际争霸用IPX。那时候没有DHCP,每栋楼有个哥们负责分配IP。

    作者回复: 赞

    共 9 条评论
    322
  • xcodeproj
    2018-05-25
    新机器进来申请分配ip地址,老师你说在dhcp request的时候这台机器以0.0.0.0为源地址发出请求,那如果有多台机器同时申请呢?DHCP server如何分辨啊
    共 9 条评论
    148
  • Will王志翔(大象)
    2018-07-07
    以问答写笔记: 1. 正确配置IP? CIDR、子网掩码、广播地址和网关地址。 2. 在跨网段调用中,是如何获取目标IP的mac地址的? 从源IP网关获取所在网关mac, 然后又替换为目标IP所在网段网关的mac, 最后是目标IP的mac地址 3. 手动配置麻烦,怎么办? DHCP!Dynamic Host Configuration Protocol! DHCP, 让你配置IP,如同自动房产中介。 4. 如果新来的,房子是空的(没有操作系统),怎么办? PXE, Pre-boot Execution Environment. "装修队"PXE,帮你安装操作系统。
    展开

    作者回复: 赞

    130
  • ERIC
    2019-03-01
    刘老师你好,文章关于DHCP可能是有两处错误。DHCP Offer 和 DHCP ACK都不是广播包,而是直接发到客户机的网卡上的。这是wiki上的链接: https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_offer https://en.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol#DHCP_acknowledgement 另外我自己也抓了包验证,https://baixiang.oss-cn-shenzhen.aliyuncs.com/dhcp/dhcp.png。
    展开

    作者回复: 这个在答疑环节讲过啦

    共 13 条评论
    86
  • kevinwang527
    2018-06-28
    现在一般电脑的网卡几乎都支持PXE启动, PXE client 就在网卡的 ROM 中,当计算机引导时,BIOS 把 PXE client 调入内存执行。 安装完成后,将提示重新引导计算机。这个时候,在重新引导的过程中将BIOS修改回从硬盘启动就可以了。
    共 2 条评论
    63
  • magict4
    2018-06-16
    请问在 Offer 和 ACK 阶段,为什么 DHCP Server 给新机器的数据包中,MAC 头里用的是广播地址(ff:ff:ff:ff:ff:ff)而不是新机器的 MAC 地址?
    共 7 条评论
    60
  • 机器人
    2018-05-25
    那么跨网段调用中,是如何获取目标IP 的mac地址的?根据讲解推理应该是从源IP网关获取所在网关 mac,然后又替换为目标IP所在网段网关的mac,最后是目标IP的mac地址,不知对否

    作者回复: 是的

    50
  • 天涯囧侠
    2018-05-25
    在一个有dhcp的网络里,如果我手动配置了一个IP,dhcp Server会知道这个信息,并不再分配这个IP吗?会的话具体是怎样交互的呢?

    作者回复: 有可能冲突的,所以办公网里面一般禁止配置静态ip

    45
  • X
    2018-05-27
    进入BIOS设置页面,有一项PXE Boot to LAN,若设置为Enabled则表示计算机从网络启动,从PXE服务端下载配置文件和操作系统内核进行启动;若设置为Disabled则表示从本地启动,启动动BIOS后,会去寻找启动扇区,如果没有安装操作系统,就会找不到启动扇区,这个时候就启动不起来。

    作者回复: 是的,还有一种服务端的配置

    34
  • 约书亚
    2018-05-25
    跨网段的通信,一般都是ip包头的目标地址是最终目标地址,但2层包头的目标地址总是下一个网关的,是么?

    作者回复: 是的

    共 6 条评论
    34
  • penghuster
    2018-06-01
    请教一下,pxe客户端请求的IP,是否最终会直接用于系统

    作者回复: 不会的,系统起来后配置ip是他自己的事情

    32
  • 我是曾经那个少年
    2018-05-25
    看了虽然懂了,但是对于一个做软件开发的,不知道怎么去实战!

    作者回复: 最后会有一个实验管理的搭建,一台机器足以

    33
  • 芋头
    2018-06-01
    要是以前大学老师能够讲得如此精彩,易懂,大学就不会白学了

    作者回复: 谢谢

    28
  • 没心没肺
    2018-05-25
    DHCP Request究竟使用广播还是单播取决于DHCP Offer包中Broadcast位的设置值。该位置1则使用广播发送,置0则使用单播发送。
    28
  • 陈浩佳
    2020-06-07
    我分享一个我最近遇到的问题: 最近我们的设备增加了dhcp自动分配地址的功能。我把几台设备连到同个路由器上,但是发现每台设备最后分配到的ip都是一样的,我登录了路由器里面查看,显示的设备列表确实是ip都是一致的,mac地址是不一致的。。。。所以就觉得有点奇怪。不过这里要说明的是,设备的mac地址是我们自己程序里面设置的,网卡不带mac地址的----最后查看代码发现,我们设备代码是先启动了dhcp客户端,后面再设置了mac地址,这里就有问题了,所以,我把它倒过来,先设置mac地址,再启动dhcp客户端,这样就解决问题了。。。由于原先启动dhcp的时候还未设置mac地址,所以默认的mac地址都是一致的,所以获取的ip都是一致的。但是,这里也说明一个问题,路由器列表上的mac地址不一定就是分配ip时的mac地址,如果分配到ip后再去修改mac地址,也是会同步到路由器上的,但是不会重新分配ip。
    展开

    作者回复: 赞,活学活用

    共 3 条评论
    26
  • 卡卡
    2018-05-25
    pxe要去tftp下载初始文件,那么pxe自己是不是也需要一个tftp客户端?

    作者回复: 是的,不过tftp很轻量

    21
  • 呵呵
    2018-05-25
    pxe客户端是放在哪里的?

    作者回复: bios

    17
  • zhy
    2018-05-25
    之前一直不清楚dhcp是干嘛的→_→终于明白了
    15
  • Tristen陈涛
    2018-05-29
    文章开头,源 IP 地址 16.158.23.6,目标 IP 地址 192.168.1.6 发包的问题,还是不太懂 此种情况下的结果是: 网关收到 16.158.23.6 包后直接拒绝了还是有别的处理?
    共 1 条评论
    10
  • 踢车牛
    2018-09-05
    老师,你好,上面你提到网关至少和当前一个网络的一个网卡在同一个网段内,这么说网关上可以配置多个网卡, 假如网关上有两个网卡,其中一个是192.168.1.6,另一个是 16.158.23.X,这样包可以发出去么?

    作者回复: 可以的,网关上有路由表

    共 3 条评论
    9