一、为什么学习网络协议
协议三要素:
人类和计算机之间需要沟通的协议,只有通过这种协议,计算机才知道我们想让它做什么。
可以看得出,计算机语言作为程序员控制一台计算机工作的协议,具备了协议的三要素。
语法,就是这一段内容要符合一定的规则和格式。例如,括号要成对,结束要使用分号
等。
语义,就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本一
般来说就没有意义。
顺序,就是先干啥,后干啥。例如,可以先加上某个数值,然后再减去某个数值。
只有通过网络协议,才能使一大片机器互相协作、共同完成一件事。
那么网络协议长啥样?能干成啥事?
想要买一个商品,常规的做法就是打开浏览器,输入购物网站的地址。浏览器就会给你显示一个缤纷多彩的页面。你有没有深入思考过,浏览器是如何做到这件事情的?它之所以能够显示缤纷多彩的页面,是因为它收到了一段来自 HTTP 协议的“东西”。
拿网易考拉来举例,格式就像下面这样:
首先,符合语法,也就是说,只有按照上面那个格式来,浏览器才认。例如,上来是状态,
然后是首部,然后是内容。
第二,符合语义,就是要按照约定的意思来。例如,状态 200,表述的意思是网页成功返
回。如果不成功,就是我们常见的“404”。
第三,符合顺序,你一点浏览器,就是发送出一个 HTTP 请求,然后才有上面那一串 HTTP
返回的东西。
浏览器显然按照协议商定好的做了,最后一个五彩缤纷的页面就出现在你面前了。
我们常用的网络协议有哪些?
用一个下单的过程,看看互联网世界的运行过程中,都使用了哪些网络协议。
先在浏览器里面输入 https://www.kaola.com ,这是一个URL。
↓
浏览器只知道名字是“www.kaola.com”,但是不知道具体的地点,所以不知道应该如何访问。
↓
它打开地址簿去查找。可以使用一般的地址簿协议DNS去查找,还可以使用另一种更加精准的地址簿查找协议HTTPDNS。
↓
无论用哪一种方法查找,最终都会得到这个地址:106.114.138.24。这个是IP地址,是互联网世界的“门牌号”。
↓
知道了目标地址,浏览器就开始打包它的请求。
知道了目标地址,浏览器就开始打包它的请求。对于普通的浏览请求,往往会使用HTTP协议;
但是对于购物的请求,往往需要进行加密传输,因而会使用HTTPS协议。无论是什么协议,里面都会写明“你要买什么和买多少”。
DNS、HTTP、HTTPS 所在的层我们称为应用层
↓
经过应用层封装后,浏览器会将应用层的包交给下一层去完成,通过 socket 编程来实现。下一层是传输层。
↓
传输层有两种协议,一种是无连接的协议UDP,一种是面向连接的协议TCP。
对于支付来讲,往往使用 TCP 协议。所谓的面向连接就是,TCP 会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达。
↓
TCP 协议里面会有两个端口,一个是浏览器监听的端口,一个是电商的服务器监听的端口。操作系统往往通过端口来判断,它得到的包应该给哪个进程。
↓
传输层封装完毕后,浏览器会将包交给操作系统的网络层。
网络层的协议是 IP 协议。在 IP协议里面会有源 IP 地址,即浏览器所在机器的 IP 地址和目标 IP 地址,也即电商网站所在服务器的 IP 地址。
↓
操作系统既然知道了目标 IP 地址,就开始想如何根据这个门牌号找到目标机器。
↓
操作系统往往会判断,这个目标 IP 地址是本地人,还是外地人。如果是本地人,从门牌号就能看出来,但是显然电商网站不在本地,而在遥远的地方。
↓
如果去国外要去海关,去外地就要去网关。
而操作系统启动的时候,就会被 DHCP 协议配置 IP 地址,以及默认的网关的 IP 地址 192.168.1.1。
↓
操作系统如何将 IP 地址发给网关呢
↓
在本地通信基本靠吼,于是操作系统大吼一声,谁是192.168.1.1 啊?网关会回答它,我就是,我的本地地址在村东头。这个本地地址就是MAC地址,而大吼的那一声是ARP协议。
↓
于是操作系统将 IP 包交给了下一层,也就是MAC 层。
网卡再将包发出去。由于这个包里面是有 MAC 地址的,因而它能够到达网关。
↓
网关往往是一个路由器,到某个 IP 地址应该怎么走,这个叫作路由表。
↓
路由器有点像玄奘西行路过的一个个国家的一个个城关。每个城关都连着两个国家,每个国家相当于一个局域网,在每个国家内部,都可以使用本地的地址 MAC 进行通信。
↓
一旦跨越城关,就需要拿出 IP 头来,里面写着贫僧来自东土大唐(就是源 IP 地址),欲往西天拜佛求经(指的是目标 IP 地址)。路过宝地,借宿一晚,明日启行,请问接下来该怎么走啊?
城关往往是知道这些“知识”的,因为城关和临近的城关也会经常沟通。到哪里应该怎么走,这种沟通的协议称为路由协议,常用的有OSPF和BGP。
↓
城关与城关之间是一个国家,当网络包知道了下一步去哪个城关,还是要使用国家内部的MAC 地址,通过下一个城关的 MAC 地址,找到下一个城关,然后再问下一步的路怎么走,一直到走出最后一个城关。
↓
最后一个城关知道这个网络包要去的地方。于是,对着这个国家吼一声,谁是目标 IP 啊?目标服务器就会回复一个 MAC 地址。网络包过关后,通过这个 MAC 地址就能找到目标服务器。
↓
目标服务器发现 MAC 地址对上了,取下 MAC 头来,发送给操作系统的网络层。发现 IP也对上了,就取下 IP 头。IP 头里会写上一层封装的是 TCP 协议,然后将其交给传输层,即TCP 层。
↓
也就是 MAC 地址对上了,就依次->摘MAC头->摘IP头->摘TCP头
↓
在这一层里,对于收到的每个包,都会有一个回复的包说明收到了。这个回复的包绝非这次下单请求的结果,例如购物是否成功,扣了多少钱等,而仅仅是 TCP 层的一个说明,即收到之后的回复。当然这个回复,会沿着刚才来的方向走回去,报个平安。
↓
因为一旦出了国门,西行路上千难万险,如果在这个过程中,网络包走丢了,例如进了大沙漠,或者被强盗抢劫杀害怎么办呢?因而到了要报个平安。
↓
如果过一段时间还是没到,发送端的 TCP 层会重新发送这个包,还是上面的过程,直到有一天收到平安到达的回复。
↓
这个重试绝非你的浏览器重新将下单这个动作重新请求一次。
↓
对于浏览器来讲,就发送了一次下单请求,TCP 层不断自己闷头重试。除非 TCP 这一层出了问题,例如连接断了,才轮到浏览器的应用层重新发送下单请求。
↓
当网络包平安到达 TCP 层之后,TCP 头中有目标端口号,通过这个端口号,可以找到电商网站的进程正在监听这个端口号,假设一个 Tomcat,将这个包发给电商网站。
↓
电商网站的进程得到 HTTP 请求的内容,知道了要买东西,买多少。
往往一个电商网站最初接待请求的这个 Tomcat 只是个接待员,负责统筹处理这个请求,而不是所有的事情都自己做。
↓
例如,这个接待员要告诉专门管理订单的进程,登记要买某个商品,买多少,要告诉管理库存的进程,库存要减少多少,要告诉支付的进程,应该付多少钱,等等。
↓
如何告诉相关的进程呢?
↓
往往通过 RPC 调用,即远程过程调用的方式来实现。
↓
远程过程调用就是当告诉管理订单进程的时候,接待员不用关心中间的网络互连问题,会由 RPC 框架统一处理。RPC 框架有很多种,有基于 HTTP 协议放在 HTTP 的报文里面的,有直接封装在 TCP 报文里面的。
↓
当接待员发现相应的部门都处理完毕,就回复一个 HTTPS 的包,告知下单成功。这个HTTPS 的包,会像来的时候一样,经过千难万险到达你的个人电脑,最终进入浏览器,显示支付成功。
总结:
二、网络分层的真实含义是什么?
网络为什么要分层?
因为,是个复杂的程序都要分层。
复杂的程序都要分层,这是程序设计的要求。比如,复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层,每一层专注做本层的事情。
程序是如何工作的?
层与层之间的关系:
所有不能表示出层层封装含义的比喻,都是不恰当的。
总经理之间沟通的时候,经理将总经理放在自己兜里,然后组长把经理放自己兜里,员工把组长放自己兜里,像套娃娃一样。那员工直接沟通,不带上总经理,就不恰当了。
在网络世界,应该是总经理说话,经理补充两句,组长补充两句,员工再补充两句。
那 TCP 在三次握手的时候,IP 层和 MAC 层在做什么呢?当然是 TCP 发送每一个消息,都会带着 IP 层和 MAC 层了。因为,TCP 每发送一个消息,IP 层和 MAC 层的所有机制都要运行一遍。而你只看到 TCP 三次握手了,其实,IP 层和 MAC 层为此也忙活好久了。
这里要记住一点:
只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
所以,对 TCP 协议来说,三次握手也好,重试也好,只要想发出去包,就要有 IP 层和
MAC 层,不然是发不出去的。
都知道那台机器的 IP 地址了,直接发给他消息呗,要MAC 地址干啥?这里的关键就是,没有 MAC 地址消息是发不出去的。
所以如果一个 HTTP 协议的包跑在网络上,它一定是完整的。无论这个包经过哪些设备,它都是完整的。
所谓的二层设备、三层设备,都是这些设备上跑的程序不同而已。
一个 HTTP 协议的包经过一个二层设备,二层设备收进去的是整个网络包。这里面 HTTP、TCP、 IP、 MAC 都有。
什么叫二层设备呀,就是只把 MAC 头摘下来,看看到底是丢弃、转发,还是自己留着。
那什么叫三层设备呢?就是把 MAC 头摘下来之后,再把 IP 头摘下来,看看到底是丢弃、转发,还是自己留着。
总结:
始终牢记一个原则:只要是在网络上跑的包,都是完整的。可以有下层没上层,绝对不可能有上层没下层。
三、ifconfig:最熟悉又陌生的命令行
怎么查看 IP 地址:
在 Windows 上是 ipconfig,在 Linux 上是 ifconfig。
你知道在 Linux 上还有什么其他命令可以查看 IP 地址吗?
答案是 ip addr。如果回答不上来这个问题,那你可能没怎么用过 Linux。
你知道 ifconfig 和 ip addr 的区别吗?
暂时不用了解这么细,但这也是一个常考的知识点。
想象一下,你登录进入一个被裁剪过的非常小的 Linux 系统中,发现既没有 ifconfig 命令,也没有 ip addr 命令,你是不是感觉这个系统压根儿没法用?这个时候,你可以自行安装 net-tools 和 iproute2 这两个工具。当然,大多数时候这两个命令是系统自带的。
安装好后,我们来运行一下 ip addr。不出意外,应该会输出下面的内容。
这个命令显示了这台机器上所有的网卡。大部分的网卡都会有一个 IP 地址,当然,这不是必须的。在后面的分享中,我们会遇到没有 IP 地址的情况。
IP 地址是一个网卡在网络世界的通讯地址,相当于我们现实世界的门牌号码。
IP地址的用途:区分地址信息。
既然是门牌号码,不能大家都一样,不然就会起冲突。
如上输出的结果,10.100.122.2 就是一个 IP 地址。这个地址被点分隔为四个部分,每个部分 8 个 bit,所以 IP 地址总共是 32 位。
也就是说:IP地址是由4组8位二进制组成的。
这样产生的 IP 地址的数量很快就不够用了。
因为不够用,于是就有了IPv6,也就是上面输出结果里面 inet6fe80::f816:3eff:fec7:7975/64。这个有 128 位,现在看来是够了,但是未来的事情谁知道呢?
本来 32 位的 IP 地址就不够,还被分成了 5 类。
在网络地址中,至少在当时设计的时候,对于 A、B、 C 类主要分两部分,前面一部分是网络号,后面一部分是主机号。
这很好理解,例如:
大家都是六单元 1001 号,
我是小区 A 的六单元 1001 号,而你是小区 B 的六单元 1001 号。
下面这个表格,详细地展示了 A、B、C 三类地址所能包含的主机的数量。
C 类地址能包含的最大主机数量实在太少了,只有 254 个。
而 B 类地址能包含的最大主机数量又太多了。
6 万多台机器放在一个网络下面,一般的企业基本达不到这个规模,闲着的地址就是浪费。
无类型域间选路(CIDR)
这种方式打破了原来设计的几类地址的做法,将 32 位的 IP 地址一分为二,前面是网络号,后面是主机号。
10.100.122.2/24,这个 IP 地址中有一个斜杠,斜杠后面有个数字 24。这种地址表示形式,就是 CIDR。
24 的意思是,32 位中,前 24位是网络号,后 8 位是主机号。
为了解决分配不合理,诞生了子网掩码。
![]()
![]()
伴随着 CIDR 存在的,一个是广播地址,10.100.122.255。如果发送这个地址,所有10.100.122 网络里面的机器都可以收到。另一个是子网掩码,255.255.255.0。
将子网掩码和 IP 地址进行 AND 计算。
前面三个 255,转成二进制都是 1。1 和任何数值取 AND,都是原来数值,因而前三个数不变,为 10.100.122。
后面一个 0,转换成二进制是 0,0 和任何数值取 AND,都是 0,因而最后一个数变为 0,合起来就是10.100.122.0。
这就是网络号。将子网掩码和 IP 地址按位计算 AND,就可得到网络号。
公有 IP 地址和私有 IP 地址
表格最右列是私有 IP 地址段。
平时我们看到的数据中心里,办公室、家里或学校的 IP 地址,一般都是私有 IP 地址段。
因为这些地址允许组织内部的 IT 人员自己管理、自己分配,而且可以重复。
因此,你学校的某个私有 IP 地址段和我学校的可以是一样的。
公有 IP 地址有个组织统一分配,你需要去买。
如果你搭建一个网站,给你学校的人使用,让你们学校的 IT 人员给你一个 IP 地址就行。但是假如你要做一个类似网易 163 这样的网站,就需要有公有 IP 地址,这样全世界的人才能访问。
表格中的 192.168.0.x 是最常用的私有 IP 地址。你家里有 Wi-Fi,对应就会有一个 IP 地址。一般你家里地上网设备不会超过 256 个,所以 /24 基本就够了。有时候我们也能见到/16 的 CIDR,这两种是最常见的,也是最容易理解的。
不需要将十进制转换为二进制 32 位,就能明显看出 192.168.0 是网络号,后面是主机号。
而整个网络里面的第一个地址 192.168.0.1,往往就是你这个私有网络的出口地址。例如,
你家里的电脑连接 Wi-Fi,Wi-Fi 路由器的地址就是 192.168.0.1,而 192.168.0.255 就是广播地是址。一旦发送这个地址,整个 192.168.0 网络里面的所有机器都能收到。
举例:一个容易“犯错”的 CIDR
我们来看 16.158.165.91/22 这个 CIDR。求一下这个网络的第一个地址、子网掩码和广播地址。
你要是上来就写 16.158.165.1,那就大错特错了。
/22 不是 8 的整数倍,不好办,只能先变成二进制来看。16.158 的部分不会动,它占了前16 位。中间的 165,变为二进制为10100101。
补充变成2进制快速方法:
除了前面的 16 位,还剩 6 位。所以,这8 位中前 6 位是网络号,16.158.<101001>,而 <01>.91 是机器号。
第一个地址是 16.158.<101001><00>.1,即 16.158.164.1。
子网掩码是 255.255.<111111><00>.0,即 255.255.252.0。
广播地址为 16.158.<101001><11>.255,即16.158.167.255。
第一个地址是16.158.164.1。
子网掩码是 255.255.252.0。
广播地址16.158.167.255。
这五类地址中,还有一类 D 类是组播地址。
使用这一类地址,属于某个组的机器都能收到。这有点类似在公司里面大家都加入了一个邮件组。发送邮件,加入这个组的都能收到。组播地址在后面讲述 VXLAN 协议的时候会提到。
在 IP 地址的后面有个 scope,对于 eth0 这张网卡来讲,是 global,说明这张网卡是可以对外的,可以接收来自各个地方的包。对于 lo 来讲,是 host,说明这张网卡仅仅可以供本机相互通信。
lo 全称是loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于
本机通信,经过内核处理后直接返回,不会在任何网络中出现。
MAC 地址
在 IP 地址的上一行是 link/ether fa:16:3e:c7:79:75 brd ff:ff:ff:ff:ff:ff,这个被称为MAC 地址,是一个网卡的物理地址,用十六进制,6 个 byte 表示。
MAC 地址号称全局唯一,不会有两个网卡有相同的 MAC 地址,而且网卡自生产出来,就带着这个地址。
既然这样,整个互联网的通信,全部用 MAC 地址好了,这样当然是不行的。 一个网络包要从一个地方传到另一个地方,除了要有确定的地址,还需要有定位功能。 而有门牌号码属性的 IP 地址,才是有远程定位功能的。
MAC 地址更像是身份证,是一个唯一的标识。它的唯一性设计是为了组网的时候,不同的网卡放在一个网络里面的时候,可以不用担心冲突。从硬件角度,保证不同的网卡有不同的标识。
互联网的通信相当于你去杭州市网商路 599 号 B 楼 6 层找刘超,你在路上问路,可能被问的人不知道 B楼是哪个,但是可以给你指网商路怎么去。但是如果你问一个人,你知道这个身份证号的人在哪里吗?可想而知,没有人知道。
MAC 地址是有一定定位功能的,只不过范围非常有限。
你可以根据 IP 地址,找到杭州市网商路 599 号 B 楼 6 层,但是依然找不到我,你就可以靠吼了,大声喊身份证 XXXX 的是哪位?我听到了,我就会站起来说,是我啊。但是如果你在上海,到处喊身份证 XXXX 的是哪位,我不在现场,当然不会回答,因为我在杭州不在上海
所以,MAC 地址的通信范围比较小,局限在一个子网里面。例如,从 192.168.0.2/24 访问 192.168.0.3/24 是可以用 MAC 地址的。一旦跨子网,即从 192.168.0.2/24 到192.168.1.2/24,MAC 地址就不行了,需要 IP 地址起作用了。
网络设备的状态标识
解析完了 MAC 地址,我们再来看 <BROADCAST,MULTICAST,UP,LOWER_UP> 是干什么的?这个叫作net_device flags,网络设备的状态标识。
UP 表示网卡处于启动的状态;
BROADCAST 表示这个网卡有广播地址,可以发送广播包;
MULTICAST 表示网卡可以发送多播包;
LOWER_UP 表示 L1 是启动的,也即网线插着呢。
MTU1500 是指什么意思呢?是哪一层的概念呢?最大传输单元 MTU 为 1500,这是以太网的默认值。
MTU 是二层 MAC 层的概念。MAC 层有 MAC的头,以太网规定连 MAC 头带正文合起来,不允许超过 1500 个字节。正文里面有 IP 的头、TCP 的头、HTTP 的头。如果放不下,就需要分片来传输。
qdisc pfifo_fast
qdisc pfifo_fast 是什么意思呢?qdisc 全称是queueing discipline,中文叫排队规则。
内核如果需要通过某个网络接口发送数据包,它都需要按照为这个接口配置的 qdisc(排队规则)把数据包加入队列。
最简单的 qdisc 是 pfifo,它不对进入的数据包做任何的处理,数据包采用先入先出的方式通过队列。pfifo_fast 稍微复杂一些,它的队列包括三个波段(band)。在每个波段里面,使用先进先出规则。
三个波段(band)的优先级也不相同。band 0 的优先级最高,band 2 的最低。如果band 0 里面有数据包,系统就不会处理 band 1 里面的数据包,band 1 和 band 2 之间也是一样。
数据包是按照服务类型(Type of Service,TOS)被分配到三个波段(band)里面的。
TOS 是 IP 头里面的一个字段,代表了当前的包是高优先级的,还是低优先级的。
总结:
通过这一节,希望能记住以下的知识点,后面都能用得上:
IP 是地址,有定位功能;MAC 是身份证,无定位功能;
CIDR 可以用来判断是不是本地人;
IP 分公有的 IP 和私有的 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 地址自己知道,但是目标 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 地址,那可怎么办?
我们需要有一个自动配置的协议,也就是称动态主机配置协议(Dynamic HostConfiguration 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 协议。
如果一个网络管理员在网络里面配置了DHCP Server的话,他就相当于这些 IP 的管理员。
他立刻能知道来了一个“新人”。这个时候,我们可以体会 MAC 地址唯一的重要性了。当一台机器带着自己的 MAC 地址加入一个网络的时候,MAC 是它唯一的身份,如果连这个都重复了,就没办法配置了。只有 MAC 唯一,IP 管理员才能知道这是一个新人,需要租给它一个 IP 地址,这个过程我们称为DHCP Offer。同时,DHCP Server 为此客户保留为它提供的 IP 地址,从而不会为其他 DHCP 客户分配此 IP 地址。
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 租用更新就完成了。
网络管理员不仅能自动分配 IP地址,还能帮你自动安装操作系统!
预启动执行环境(PXE)
首先,启动 BIOS。这是一个特别小的小系统,只能干特别小的一件事情。其实就是读取硬盘的 MBR 启动扇区,将 GRUB 启动起来;然后将权力交给 GRUB,GRUB 加载内核、加载作为根文件系统的 initramfs 文件;然后将权力交给内核;最后内核启动,初始化整个操作系统。
那我们安装操作系统的过程,只能插在 BIOS 启动之后了。因为没安装系统之前,连启动扇区都没有。因而这个过程叫做预启动执行环境(Pre-boot Execution Environment),简称PXE。
PXE 协议分为客户端和服务器端,由于还没有操作系统,只能先把客户端放在 BIOS 里面。当计算机启动时,BIOS 把 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,能够安装操作系统,这个在云计算领域大有用处。