所有最新极客时间课程请加QQ群170701297

第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。广播包封装了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,能够安装操作系统,这个在云计算领域大有用处。

最后,学完了这一节,给你留两个思考题吧。

  1. PXE协议可以用来安装操作系统,但是如果每次重启都安装操作系统,就会很麻烦。你知道如何使得第一次安装操作系统,后面就正常启动吗?
  2. 现在上网很简单了,买个家用路由器,连上WIFI,给DHCP分配一个IP地址,就可以上网了。那你是否用过更原始的方法自己组过简单的网呢?说来听听。

欢迎你留言和我讨论。趣谈网络协议,我们下期见!

精选留言

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

    2018-05-25 09:41

  • xcodeproj
    新机器进来申请分配ip地址,老师你说在dhcp request的时候这台机器以0.0.0.0为源地址发出请求,那如果有多台机器同时申请呢?DHCP server如何分辨啊
    2018-05-25 21:30
  • magict4
    请问在 Offer 和 ACK 阶段,为什么 DHCP Server 给新机器的数据包中,MAC 头里用的是广播地址(ff:ff:ff:ff:ff:ff)而不是新机器的 MAC 地址?
    2018-06-16 05:02
  • 机器人
    那么跨网段调用中,是如何获取目标IP 的mac地址的?根据讲解推理应该是从源IP网关获取所在网关
    mac,然后又替换为目标IP所在网段网关的mac,最后是目标IP的mac地址,不知对否
    2018-05-25 08:18
    作者回复

    是的

    2018-05-25 09:40

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

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

    2018-05-25 13:43

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

    是的

    2018-05-25 09:40

  • Will王志翔(大象)
    以问答写笔记:

    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,帮你安装操作系统。
    2018-07-07 06:21
    作者回复

    2018-07-08 00:44

  • kevinwang527
    现在一般电脑的网卡几乎都支持PXE启动, PXE client 就在网卡的 ROM 中,当计算机引导时,BIOS 把 PXE client 调入内存执行。
    安装完成后,将提示重新引导计算机。这个时候,在重新引导的过程中将BIOS修改回从硬盘启动就可以了。
    2018-06-28 15:43
  • 贾志猛
    进入BIOS设置页面,有一项PXE Boot to LAN,若设置为Enabled则表示计算机从网络启动,从PXE服务端下载配置文件和操作系统内核进行启动;若设置为Disabled则表示从本地启动,启动动BIOS后,会去寻找启动扇区,如果没有安装操作系统,就会找不到启动扇区,这个时候就启动不起来。
    2018-05-27 19:00
    作者回复

    是的,还有一种服务端的配置

    2018-05-28 07:50

  • 刘-阿-伟
    看了虽然懂了,但是对于一个做软件开发的,不知道怎么去实战!
    2018-05-25 16:51
    作者回复

    最后会有一个实验管理的搭建,一台机器足以

    2018-05-25 22:24

  • 芋头
    要是以前大学老师能够讲得如此精彩,易懂,大学就不会白学了
    2018-06-01 08:25
    作者回复

    谢谢

    2018-06-01 19:48

  • zhy
    之前一直不清楚dhcp是干嘛的→_→终于明白了
    2018-05-25 08:56
  • Tristen陈涛
    文章开头,源 IP 地址 16.158.23.6,目标 IP 地址 192.168.1.6 发包的问题,还是不太懂
    此种情况下的结果是: 网关收到 16.158.23.6 包后直接拒绝了还是有别的处理?
    2018-05-29 22:32
  • 卡卡
    pxe要去tftp下载初始文件,那么pxe自己是不是也需要一个tftp客户端?
    2018-05-25 19:51
    作者回复

    是的,不过tftp很轻量

    2018-05-26 12:25

  • 呵呵
    pxe客户端是放在哪里的?
    2018-05-25 08:52
    作者回复

    bios

    2018-05-25 10:11

  • geduo4612
    PXE client 只能把整个操作系统放在内存里面里面?因为此时还木有文件系统啥的吧?DHCP,ARP,IP/TCP协议都是BIOS自带的?
    2018-06-03 08:51
  • penghuster
    请教一下,pxe客户端请求的IP,是否最终会直接用于系统
    2018-06-01 16:08
    作者回复

    不会的,系统起来后配置ip是他自己的事情

    2018-06-01 18:09

  • Jason
    大道至简。牛
    2018-05-25 08:13
    作者回复

    谢谢

    2018-05-25 09:41

  • 没心没肺
    DHCP Request究竟使用广播还是单播取决于DHCP Offer包中Broadcast位的设置值。该位置1则使用广播发送,置0则使用单播发送。
    2018-05-25 15:34
  • 王贺
    我印象中10.0.0.1/24是路由器地址,这是把这台机器配成路由器了么?配成10.0.0.2/24也没问题吧?
    2018-05-25 11:25
    作者回复

    没问题,这只是个配置的例子

    2018-05-25 12:10