应用层——DHCP

刚插上网线,电脑怎么知道自己的 IP 地址的?

如果你知道某台电脑的 IP,就可以向这个 IP 发起连接请求,建立连接后就可以操作收发数据。

要发送的数据,会在网络层里加入 IP 头。

这里面最重要的是发送端和接收端的 IP 地址。有了 IP 地址,数据包就能在网络世界里找到该由谁来接收这个数据包。

所以说上面的网络通信离不开 IP。

假设我有一台新买的电脑,还没联网呢,这时候拿着新买的网线,插入网线口,网线插口亮起来了。

然后就可以开始用它上网了。

那么问题来了。

刚插上网线,电脑怎么知道自己的 IP 是什么?怎么就突然能上网了呢?

这个话题,我们从 DHCP 聊起。

DHCP是什么

插上网线之后,获得 IP 的方式主要有两种。

第一种是,自己手动在电脑里配。在选择手动配置之后,除了 IP 地址还需要配上子网掩码和路由器的地址。

这几个词对于大部分普通人来说,很难理解。大部分人没事都不会去配这玩意。有没有办法可以让这些IP信息自动获得?

有,这就是第二种获取 IP 的方式,DHCP。

通过 DHCP,在联网之后可以自动获取到本机需要的 IP 地址,子网掩码还有路由器地址。

动态主机配置协议 DHCP

动态主机配置协议 DHCP(Dynamic Host Configuration Protocol) 提供了即插即用连网的机制。

这种机制允许一台计算机加入新的网络和获取 IP 地址,而不用手工配置。

DHCP 对运行客户软件和服务器软件的计算机都适用。当运行客户软件的计算机移至一个新的网络时,就可使用 DHCP 获取其配置信息而不需要手工干预。

DHCP 给运行服务器软件、且位置固定的计算机指派一个永久地址,给运行客户端软件的计算机分配一个临时地址。

需要 IP 地址的主机在启动时就向 DHCP 服务器广播发送发现报文(将目的 IP 地址置为全1,即255.255.255.255),这时该主机就成为 DHCP 客户。发送广播报文是因为现在还不知道 DHCP 服务器在什么地方,因此要发现 DHCP 服务器的 IP 地址。

这台主机目前还没有 IP 地址,因此它将 IP 数据报的源 IP 地址设为全 0。这样,在本地网络上的所有主机都能收到此广播报文,但只有 DHCP 服务器才回答此广播报文。

DHCP 服务器先在其数据库中查找该计算机的配置信息。若找到,则返回找到的信息。若找不到,则从服务器的 IP 地址池中取一个地址分配给该计算机。

DHCP 服务器的回答报文叫做提供报文。

DHCP 说白了,就是向某个管 IP 分配的服务器,也就是 DHCP 服务器,申请 IP 地址。其实一般家里用的路由器就自带这个功能。

协议配置

在协议软件中给参数赋值的动作叫做协议配置。

一个软件协议在使用之前必须是已正确配置的。具体的配置信息有哪些则取决于协议栈。

例如,连接到互联网的计算机的协议软件需要配置的参数包括:

  • IP 地址
  • 子网掩码
  • 默认路由器的 IP 地址
  • 域名服务器的 IP 地址

这些信息通常存储在一个配置文件中,计算机在引导过程中可以对这个文件进行存取。

DHCP 工作方式

DHCP 使用客户-服务器方式,采用请求/应答方式工作。

DHCP 基于 UDP 工作,DHCP 服务器运行在 67 号端口, DHCP客户运行在 68 号端口。



DHCP 中继代理

并不是每个网络上都有 DHCP 服务器,这样会使 DHCP 服务器的数量太多。现在是每一个网络至少有一个 DHCP 中继代理,它配置了 DHCP 服务器的 IP 地址信息。

当 DHCP 中继代理收到主机发送的发现报文后,就以单播方式向 DHCP 服务器转发此报文,并等待其回答。收到 DHCP 服务器回答的提供报文后,DHCP 中继代理再将此提供报文发回给主机。

DHCP 中继代理以单播方式转发发现报文。

租用期

DHCP 服务器分配给 DHCP 客户的 IP 地址是临时的,因此 DHCP 客户只能在一段有限的时间内使用这个分配到的 IP 地址。DHCP 协议称这段时间为租用期(默认为 8 天)。

租用期的数值应由 DHCP 服务器自己决定。

DHCP 客户也可在自己发送的报文中(例如,发现报文)提出对租用期的要求。

DHCP 协议的工作过程

  1. DHCP 服务器被动打开 UDP 端口 67,等待客户端发来的报文。
  2. DHCP 客户从 UDP 端口 68 广播发送 DHCP 发现报文DHCP DISCOVER
  3. 凡收到 DHCP 发现报文的 DHCP 服务器收到消息后,会在自己维护的一个 IP 池里拿出一个空闲 IP,通过单播的形式发出 DHCP 提供报文DHCP OFFER,因此 DHCP 客户可能收到多个 DHCP 提供报文 。
  4. DHCP 客户从几个 DHCP 服务器中选择其中的一个,并向所选择的 DHCP 服务器发送 DHCP 请求报文DHCP REQUEST
  5. 被选择的 DHCP 服务器发送确认报文DHCP ACK,进入已绑定状态,并可开始使用得到的临时 IP 地址了。
    DHCP 客户现在要根据服务器提供的租用期 T 设置两个计时器 T1 和 T2,它们的超时时间分别是 0.5T 和 0.875T。当超时时间到就要请求更新租用期。
  6. 租用期过了一半(T1 时间到),DHCP 发送请求报文DHCP REQUEST,要求更新租用期。
  7. DHCP 服务器若同意,则发回确认报文DHCP ACK。DHCP 客户得到了新的租用期,重新设置计时器。
  8. DHCP 服务器若不同意,则发回否认报DHCP NACK。这时 DHCP 客户必须立即停止使用原来的 IP 地址,而必须重新申请 IP 地址(回到步骤 2)。
    若 DHCP 服务器不响应步骤 6 的请求报文DHCP REQUEST,则在租用期过了 87.5% 时,DHCP 客户必须重新发送请求报文DHCP REQUEST(重复步骤 6),然后又继续后面的步骤。
  9. DHCP 客户可随时提前终止服务器所提供的租用期,这时只需向 DHCP 服务器发送释放报文DHCP RELEASE即可。

自动获得 IP 地址和自动获得 DNS 服务器地址就表示是使用 DHCP 协议。

可以发现,DHCP 交互中,全程都是使用 UDP 广播通信。

用的是广播,那如果 DHCP 服务器和客户端不是在同一个局域网内,路由器又不会转发广播包,那不是每个网络都要配一个 DHCP 服务器?

所以,为了解决这一问题,就出现了 DHCP 中继代理。有了 DHCP 中继代理以后,对不同网段的 IP 地址分配也可以由一个 DHCP 服务器统一进行管理。

HCP 客户端会向 DHCP 中继代理发送 DHCP 请求包,而 DHCP 中继代理在收到这个广播包以后,再以单播的形式发给 DHCP 服务器。

服务器端收到该包以后再向 DHCP 中继代理返回应答,并由 DHCP 中继代理将此包广播给 DHCP 客户端 。

因此,DHCP 服务器即使不在同一个链路上也可以实现统一分配和管理IP地址。

为什么要有第三和第四阶段

大家有没有发现,在Offer阶段,就已经拿到了 IP 了,为什么还要有后面的RequestACK呢?

这是因为本地网段内,可能有不止一台 DHCP 服务器,在你广播之后,每个 DHCP 服务器都有可能给你发Offer

本着先到先得的原则,你的机子一般会对第一个到的Offer响应DHCP Request,目的是为了确认Offer,在你确认Offer这段时间内,DHCP 服务器确认这个 IP 还没被分出去,你才可以安心使用这个 IP。

就像你找工作的过程。你海投简历(DHCP Discover),然后拿到了多个offer(DHCP Offer)

这时候事情还没完,你一般会跟 HR 说:”你给我两天时间,我要跟家里人商量下”。

HR 也会对你说:”那你尽快确认,我这边还有不少候选人等着”。

之后你考虑下来觉得不错,跟HR说要接这个Offer(DHCP Request),HR 看了下这个岗位还在,才能确认让你第二天来上班(DHCP ACK)。如果这个公司的岗位已经招到其他候选人了,第四阶段的消息就会改为发DHCP NAK,意思是拒绝了你的接Offer请求。

DHCP抓包

在命令行里执行下面的命令,可以强行让电脑的en0网卡重新走一遍 DHCP 流程。

1
sudo ipconfig set en0 DHCP

en0可以替换成其他网卡,比如eth0啥的。

这时候就可以抓到相关的数据包。

我们可以看到蓝色的四个数据包,分别对应上面提到的四个 DHCP 阶段。

其中第二阶段中的DHCP Offer里会返回给我们需要的 IP、子网掩码、路由器地址以及DNS服务器地址。

另外,通过抓包,我们可以发现 DHCP 是应用层的协议,基于传输层 UDP 协议进行数据传输。

为什么DHCP用UDP,能不能改用TCP?

主要原因还是因为 TCP 是面向连接的,而 UDP 是无连接的。

所谓”连接”,他就只有一个发送端和一个接收端,就跟水管一样。

而 DHCP 由于一开始并不知道要跟谁建立连接,所以只能通过广播的形式发送消息。

同样是在本地网段内发广播消息,UDP 只需要发给255.255.255.255。它实际上并不是值某个具体的机器,而是一个特殊地址,这个地址有特殊含义,只要设了这个目的地址,就会在一定本地网段内进行广播。

而 TCP 却不同,它需要先建立连接,但实际上255.255.255.255对应的机器并不存在,因此也不能建立连接。如果同样要做到广播的效果,就需要先得到本地网段内所有机器的 IP,然后挨个建立连接,再挨个发消息。这就很低效了。

因此 DHCP 选择了 UDP,而不是 TCP。

为什么第二阶段不是广播,而是单播

其实,这是 DHCP 协议的一个小优化。原则上大家在DHCP Offer阶段,都用广播,那肯定是最稳的,目标机器收到后自然就会进入第三阶段DHCP Request。而非目标机器,收到后解包后发现目的机器的 mac 地址跟自己的不同,也会丢掉这个包。

但是问题就出在,这个非目的机器需要每次都在网卡收到包,并解完包,才发现原来这不是给它的消息,这。。。真,有被打扰到。

如果本地网段内这样的包满天飞,也浪费机器性能。

如果能用单播,那当然是最好的。但这时候目的机器其实并没有 IP 地址,有些系统在这种情况下能收单播包,有些则认为不能收,这个跟系统的实现有关。因此,对于能收单播包的系统,会在发DHCP Discover阶段设一个Broadcast flag = 0 (unicast)的标志位,告诉服务器,支持单播回复,于是服务器就会在DHCP Offer阶段以单播的形式进行回复。

是不是每次联网都要经历DHCP四个阶段?

只要想联网,就需要 IP,要用 IP,就得走 DHCP 协议去分配。

但大家也发现了,DHCP 第一阶段和第二阶段都可能会发广播消息。对于家用电脑还好,插个网线,之后就雷打不动。但像手机这样的移动设备,是要带着到处跑的,坐个地铁,进个电梯,公司里到处走走,都可能会涉及到网络切换。

这每次都要来一个完整的四阶段,各种广播消息满天飞,其实对网络环境不太友好。

于是问题叒来了,是不是每次联网都要经历 DHCP 四个阶段?

当然不需要。

我们会发现每次断开wifi再打开wifi时,机子会经历一个从没网到有网的过程。

这时候去抓个包,会发现。

其实只发生了 DHCP 的第三和第四阶段。这是因为机子记录了曾经使用过192.168.31.170这个 IP,重新联网后,会优先再次请求这个 IP,这样就省下了第一第二阶段的广播了。

另外需要注意的是,抓包图里DHCP Request之所以出现两次,是因为第一次Request发出后太久没得到回应,因此重发。

DHCP分配下来的IP一定不会重复吗?

一般来说 DHCP 服务器会在它维护的 IP 池里找到一个没人用的 IP 分配给机子,

这个 IP 如果重复分配了,那本地网段内就会出现两个同样的 IP,这个 IP 下面却对应两个不同的 mac 地址。但其他机器上的 ARP 缓存中却只会记录其中一条 mac 地址到 IP 的映射关系。

于是,数据在传递的过程中就会出错。

因此本地网段内 IP 必须唯一。

那么 DHCP 分配下来的 IP 有没有可能跟别的 IP 是重复的?

都这么问了,那肯定是可能的。

有两个常见的情况会出现 IP 重复。

IP 是可以自己手动配的,自己配的 IP 是有可能跟其他 DHCP 分配下来的 IP 是相同的。解决方案也很简单,尽量不要手动去配 IP,统一走 DHCP。或者在 DHCP 服务器里维护的 IP 范围里,将这条 IP剔除。

一个本地网段内,是可以有多个 DHCP 服务器的,而他们维护的 IP 地址范围是有可能重叠的,于是就有可能将相同的 IP 给到不同的机子。解决方案也很简单,修改两台 DHCP 服务器的维护的 IP 地址范围,让它们不重叠就行了。

不过吧,上面的解决方案,都需要有权限去修改 DHCP 服务器。

得到DHCP ACK之后立马就能使用这个 IP 了吗?

不。

在得到DHCP ACK之后,机子不会立刻就用这个 IP。

而是会先发三条 ARP 消息。

大家知道 ARP 消息的目的是通过 IP 地址去获得 mac 地址。所以普通的 ARP 消息里,是填了 IP 地址,不填 mac 地址的。

但这三条 ARP 协议,比较特殊,它们叫无偿 ARP,特点是它会把 IP 和 mac 地址都填好了,而且填的还是自己的 IP 和 mac 地址。

目的有两个。

一个是为了告诉本地网段内所有机子,从现在起,xx IP 地址属于 xx mac 地址,让大家记录在 ARP 缓存中。

另一个就是看下本地网段里有没有其他机子也用了这个 IP,如果有冲突的话,那需要重新再走一次 DHCP 流程。

在三次无偿 ARP 消息之后,确认没有冲突了,才会开始使用这个 IP 地址进行通信。

总结

电脑插上网线,联网后会通过 DHCP 协议动态申请一个 IP,同时获得子网掩码,路由器地址等信息。

DHCP 分为四个阶段,分别是Discover,Offer,RequestACK。如果曾经连过这个网,机器会记录你上次使用的 IP,再次连接时优先使用原来的那个 IP,因此只需要经历第三第四阶段。

DHCP 是应用层协议,考虑到需要支持广播功能,底层使用的是 UDP 协议,而不是 TCP 协议。

DHCP 分配下来的 IP 是有可能跟某台手动配置的 IP 地址重复的。

DHCP 得到 IP 之后还会发3次无偿 ARP 通告,在确认没有冲突后开始使用这个 IP。

打赏
  • Copyrights © 2017-2023 WSQ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信