惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
Security Latest
Security Latest
T
The Exploit Database - CXSecurity.com
Jina AI
Jina AI
IT之家
IT之家
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
罗磊的独立博客
C
Cyber Attacks, Cyber Crime and Cyber Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
CERT Recently Published Vulnerability Notes
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
S
Schneier on Security
The Register - Security
The Register - Security
L
Lohrmann on Cybersecurity
博客园 - 聂微东
有赞技术团队
有赞技术团队
Know Your Adversary
Know Your Adversary
V2EX - 技术
V2EX - 技术
大猫的无限游戏
大猫的无限游戏
Project Zero
Project Zero
Simon Willison's Weblog
Simon Willison's Weblog
Last Week in AI
Last Week in AI
博客园 - Franky
D
Docker
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
H
Hacker News: Front Page
MongoDB | Blog
MongoDB | Blog
W
WeLiveSecurity
Vercel News
Vercel News
C
Check Point Blog
N
News | PayPal Newsroom
A
Arctic Wolf
T
Threat Research - Cisco Blogs
F
Full Disclosure
博客园 - 司徒正美
GbyAI
GbyAI
A
About on SuperTechFans
Webroot Blog
Webroot Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
I
InfoQ
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
Latest news
Latest news
Help Net Security
Help Net Security

蛮荆

如何获取更多的免费服务器 Kubernetes 调度器队列 - 设计与实现 Kubernetes 调度器 - 核心流程 Kubernetes Networking Model & CNI Kubernetes 控制器管理总结 Kubernetes CronJob 设计与实现 Kubernetes Job 设计与实现 Kubernetes HPA 设计与实现 Kubernetes Deployment 滚动更新实现原理 Kubernetes GC 设计与实现 Kubernetes Pod 驱逐 - 设计与实现 Kubernetes Daemonset 设计与实现 Kubernetes ReplicaSet 设计与实现 Kubernetes EndPoint 设计与实现 Kubernetes Informer 设计与实现 降本增效之应用优化 (三) 日志存储与检索 Kubernetes Pod 设计与实现 - 创建流程 Kubernetes 探针设计与实现 Unix 编程艺术名句摘录 Kubernetes - CRI 概述 Golang 编译速度为什么这么快? Kubernetes Pod 设计与实现 - Pause 容器 Kubernetes - kube-proxy 代理模式工程优化 Kubernetes 应用最佳实践 - 优雅关闭长连接 Kubernetes Service 类型和会话亲和性 Kubernetes 为什么需要 Ingress Kubernetes 架构 - 控制平面和数据平面 降本增效之应用优化 (二) 大报表 Go 语言如何获取 CPU 利用率 降本增效之应用优化 (一) Redis 业务规则引擎演变过程简述 微服务中的熔断算法 漏桶算法和令牌桶算法 jsonparser 为什么比标准库的 encoding/json 快 10 倍 ? zap 高性能设计与实现 HTTP Router 算法演进 fastcache 高性能设计与实现 Web 常见的三个安全问题 ants Code Reading Go 线程安全 map 方案选型 布隆过滤器 死锁、活锁、饥饿、自旋锁 sync.Pool Code Reading Go 内存管理概述 Go netpoll Code Reading goroutine 泄漏与检测 time/Timer Code Reading GMP Scheduler Code Reading Go channel 的 15 条规则和底层实现 为什么 Linux “一切皆文件” context.Context Code Reading runtime/HACKING.md Goland 最佳实践 互联网开发与金庸武学 为什么 Redis 6.0 引入多线程模型? Kubernetes 应用最佳实践 - 金丝雀发布 容器中如何正确配置 GOMAXPROCS ? singleflight Code Reading sync.Map Code Reading sync.Cond Code Reading sync.WaitGroup Code Reading sync.RWMutex Code Reading sync.Mutex Code Reading sync.Once Code Reading Go 无锁编程 sync/atomic Code Reading goroutine 交替打印奇偶数 GODEBUG Go 并发模式 Go 汇编 UUID 通用技术选型 Kubernetes 应用最佳实践 - 水平自动伸缩 Go 高性能 Tips fasthttp 为什么比标准库 net/http 快 10 倍 ? 技术文章配图指南 ChatGPT 初体验 Docker 网络原理概览 iptables 的五表五链 Kubernetes 应用最佳实践 - 亲和性和污点容忍度 Go 的反射与三大定律 Docker 官方提供的最佳实践 Go 语言内置的设计模式 HTTP1 到 HTTP3 的工程优化 Kubernetes 应用最佳实践 - Sidecar 模式 Kubernetes 应用最佳实践 - init 容器和钩子函数 为什么 recover 必须在 defer 中调用? 为什么 defer 的执行顺序和注册顺序不同? Go map 设计与实现 Go 切片扩容底层实现 Go 语言中的零拷贝 Go Delve 云原生和边缘计算简介 Kubernetes Pod 服务质量等级 Kubernetes 应用最佳实践 - 探针 Kubernetes 应用最佳实践 - 资源请求和限制 CDN 原理 Kubernetes 应用最佳实践 - 开篇 缓存策略和模式 Go 内存模型 Kubernetes 核心概念
网络基础: DHCP 是如何工作的?
2017-09-16 · via 蛮荆

2017-09-16 计算机网络

概述

DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是为主机(客户端)自动配置 IP 地址、子网、DNS 服务器、默认网关等信息的网络协议。

虽然 DHCP 依赖于其他协议(如 ARP、UDP 和 IP),但它自身不属于任何一层,而是工作在应用层。

当客户端尝试自动从 DHCP服务器 (例如路由器) 处获取 IP 地址时,如果手动设置每台计算机的 IP 地址,过程会非常麻烦,而且必须考虑到不能分配重复的IP 地址,而使用 DHCP 则可以指定分配的 IP 地址所在的范围,并且自动完成在该范围内的 IP 地址分配,同时也可以自动为默认网关分配地址。

Mac 自动配置 IP

Windows 自动配置 IP

除了技术原因之外,DHCP 的最大价值在于帮助 “非专业用户” 提供自动化管理的操作体验,想象一下:有多少用户知道 IP 地址、子网掩码、网关等一系列专业术语并且可以完成手动配置呢?

三个功能

几乎所有类型的路由器 (包括家用路由器) 都支持 DHCP, 路由器的 DHCP 功能主要分为三个方面:

  1. 作为 DHCP 服务器为客户端分配 IP 地址
  2. 作为 DHCP 客户端从其他 DHCP 服务器中获取 IP 地址
  3. 在 DHCP 服务器和客户端之间完成中继广播消息

当一台新设备连接到家用路由器时,上述三个功能都会执行到。

连接过程

图片来源: 图解网络硬件(三轮贤一)

  1. 客户端在网段内广播 DISCOVER 消息
  2. DHCP 服务器在网络内广播 OFFER 消息
  3. 客户端在网络内广播 REQUEST 消息
  4. 在接收 ACK 消息后,客户端就能使用所分配的 IP 地址(10.1.1.5)

下面展开来说下这个过程中的一些细节:

  • 假设主机 A(客户端)最开始没有 IP 地址以及其它信息,那么就需要先使用 DHCP 来获取
  • 主机生成一个 DHCP 请求报文,并将这个报文放入: 目的端口 67源端口 68 的 UDP 报文段中
  • 将该报文段放入: 广播 IP 目的地址(255.255.255.255)源 IP 地址(0.0.0.0) 的 IP 数据报中
  • 将该数据报放入 MAC 帧中,帧目的地址 FF:FF:FF:FF:FF:FF,通过二层交换机广播到所有连接的设备
  • 连接在交换机的 DHCP 服务器 (也可以是连接到光猫上的家用路由器) 收到广播帧之后,不断地向上分解得到 IP 数据报、UDP 报文段、DHCP 请求报文,之后生成 DHCP ACK 报文,该报文包含以下信息:IP 地址、DNS 服务器的 IP 地址、默认网关路由器的 IP 地址和子网掩码,然后将该报文被放入 UDP 报文段中,再把 UDP 报文段放入 IP 数据报中,最后放入 MAC 帧中
  • Mac 帧的目的地址是请求主机 A 的 MAC 地址,因为交换机具有自学习能力,之前主机 A 发送广播帧之后,顺带就记录了 MAC 地址和其转发接口的 交换表项,因此现在交换机知道应该向哪个接口发送该 Mac 帧
  • 主机收到 Mac 帧后,不断分解得到 DHCP 报文,之后就配置它的 IP 地址、子网掩码和 DNS 服务器的 IP 地址,并在其 IP 转发表中安装默认网关

DHCP 请求报文示例

静态分配

手动分配静态 IP 地址

手动配置好 IP 地址之后,依然会执行上面的连接过程,只不过发起的请求报文不同而已。

例如主机 A 将自己的 IP 地址配置为 192.168.20.10, 那么发起的 DHCP 请求报文中的 请求 IP 地址 就是 192.168.20.10, 剩下的连接过程和动态获取 IP 地址过程一样。


地址分配

分配顺序

DHCP 服务器需要从 IP 地址池中为客户端分配一个 IP 地址,具体的顺序如下:

  1. DHCP 服务器上已配置,指定客户端的 MAC 地址静态绑定的 IP 地址
  2. 客户端发送的 DISCOVER 请求报文中指定的 IP 地址
  3. DHCP 服务器的 IP 地址池中查找 “Expired” 状态的 IP 地址,也就是租期到期的 IP 地址
  4. DHCP 服务器的 IP 地址池中查找 “Idle” 状态的 IP 地址,也就是空闲的 IP 地址
  5. 如果上述步骤均未找到可分配的 IP 地址,DHCP 服务器地址池依次回收租期到期状态的(Expired)和处于冲突状态(Conflict)的 IP 地址,回收后如果找到可用的 IP 地址,分配给客户端,否则,客户端等待 DHCP 服务器应答超时后,重新发送 DISCOVER 请求报文来申请 IP 地址

静态 IP

对于客户端申请静态 IP (已经指定了 IP 地址) 的请求报文,DHCP 服务器收到请求之后,会先检查该 IP 是否已经分配,如果已经分配给其他主机,直接回复 NACK 消息拒绝。

DHCP 服务器检测 IP 是否已经分配

除了客户端申请静态 IP 地址外,网络管理员也可以通过 DHCP 服务器静态分配机制来分配 IP, 避免客户端手动配置错误的情况。

确认分配

那么如何确认指定的 IP 是否已经分配了呢?DHCP 服务器只需要 ping 一下申请的 IP 地址即可。

对于申请动态 IP (没有指定了 IP 地址) 的请求报文,DHCP 服务器只需要找一个没有使用的 IP 地址返回就可以了。


地址冲突

假设当前主机 A 已经通过 DHCP 获取到 IP: 192.168.20.10。

那么当主机 A 休眠时,无法回复 Ping,DHCP 服务器就会认为该 IP 地址没有被使用,于是将 192.168.20.10 分配给其他主机,等到主机 A 休眠结束后,IP 地址就与主机 B 发生了冲突。

如果主机 A 是关机而非休眠的话,是否会产生 IP 地址冲突呢?

不会,因为当主机 A 开机时,首先要完成 TCP/IP 模块的初始化,在配置其静态 IP 192.168.20.10 时,会发三次 ARP 消息 (目的: 确认有没有主机在使用 IP 192.168.20.10),如果有其他主机使用了这个 IP, 主机 A 就会收到对应的回复,也就不会继续使用这个 IP 地址了。


地址回收

DHCP 服务器的 IP 地址池中会指定 IP 地址的租期,如果客户端发送的 DISCOVER 报文中携带了期望租期,服务器会将 客户端的期望租期 与 分配 IP 的租期 进行比较,选择其中时间较短的租期分配给客户端。

1. 租期到期和续期

如果客户端希望租期到期后,继续使用当前的 IP 地址,需要更新 IP 地址的租期。

  1. 当客户端 IP 地址租期剩余 50% 时,会以单播的方式向 DHCP 服务器发送 REQUEST 请求报文,请求更新 IP 地址租期,如果收到 ACK 报文,租期更新成功(即租期重新从 0 开始计算),如果收到 NAK 报文,则向 DHCP 服务器重新发送 DISCOVER 报文请求新的 IP 地址
  2. 当客户端 IP 地址租期剩余 87.5% 时,如果还未收到 DHCP 服务器的应答报文,客户端会以广播的方式向 DHCP 服务器发送 REQUEST 报文 (为什么这里是广播呢? 因为收不到 DHCP 服务器的应答,说明 DHCP 服务器可能已经发生变更),请求更新 IP 地址租期,如果收到 ACK 报文,租期更新成功(即租期重新从 0 开始计算),如果收到 NAK 报文,则向 DHCP 服务器重新发送 DISCOVER 报文请求新的 IP 地址
  3. 如果租期到期时,都没有收到 DHCP 服务器的应答,客户端停止使用当前 IP 地址,重新发送 DISCOVER 报文请求新的 IP 地址

2. 手动释放

客户端在租期到期之前,如果不想再使用当前的 IP 地址 (例如笔记本电脑从宿舍移动到了教室),客户端会向 DHCP 服务器发送 RELEASE 请求报文,通知 DHCP 服务器释放 IP 地址的租期,便于该 IP 地址后续被其他客户端继续使用。

3. 超时和断线

如前文中提到的,当客户端因为休眠和断线 (例如网线被拔掉) 而无法响应 DHCP 服务器的检测时,DHCP 服务器将回收该客户端的 IP 地址。


Reference