一文彻底了解UDHCP源码核心☝️

🍄参考学习: udhcp源码剖析(一)——DHCP服务器和客户端的工作流程_udhcpc源码v1.29.2-CSDN博客

前言介绍

本文深入探讨了DHCP服务器和客户端的工作流程,以udhcp为例,详细阐述了udhcpd(服务器)如何分配IP和网络配置,以及udhcpc(客户端)如何通过交互获取和续租IP。同时,介绍了udhcp的文件结构,如Dhcpd.c、Dhcpc.c和Frontend.c等,揭示了其内部模块的功能…

☝️还不是很清楚 DHCP 的理论, DHCP 协议的学习移驾:
一文读懂DHCP协议 && DHCPv6协议 - 知乎 (zhihu.com)

先启动 dhcpd,再启动 dhcpc

🥇DHCP服务器的工作流程

udhcpd,即dhcp服务器,在路由器等网关设备中,DHCP服务器启动后用于给LAN侧和无线终端分配IP、租约和其他网络配置。根据RFC2131文档规范,一个标准的DHCP服务器和客户端的交互时序如下,这是一个完整的交互过程,从INIT到BOUND,其余的交互过程,比如INIT_REBOOT、RENEWING和REBINDING都可视作该过程的简化或一部分。

🐻第一次连接过程解析:

  1. client 开始初始化
  2. client 广播发送 DHCP Discover 到 server 端
  3. server 接收到,回复 DHCP Offer 包到 client 端, client 端接收到回复,开始收集回应信息,从中挑选一个 server
  4. 挑选好 server 之后,client 发送 DHCP Request 到 server 端
  5. 被选中的 server 接收到 DHCP Request 包后,提交 client 的配置信息, 并回复 DHCP ACK
  6. client 接收到 DHCP ACK 后,初始化结束.
    🐻第一次断开过程解析:
  7. client 端突然 shutdown, 会发送 DHCP Release 包到 server 端
  8. server 端接收到 DHCP Release 后,就丢弃 lease
    🥈DHCP客户端的工作流程
    udhcpc,即DHCP客户端的工作相对简单,可以使用客户端状态转移图来描述,根据所处的
    不同状态,与服务器进行交互。如下图所示,客户端工作的起点一般是INIT和INIT_REBOOT状态,
    ● 一个标准的获取IP及其配置的流程是INIT->SELECTING->REQUESTING->BOUND, 重启后的重新获取IP
    ● lease的流程:INIT_REBOOT->REBOOTING->BOUND,
    ● T1过期续约lease:BOUND->RENEWING->BOUND,
    ● T1和T2过期续约lease:BOUND->RENEWING->REBINDING->BOUND。
    可见,BOUND状态是最终完成配置的状态,REBOOTING、REQUESTING、RENEWING和REBINDING是中间状态,在中间状态,若接收到ACK即跳转到BOUND状态完成配置,若接收到NAK或lease过期则回到INIT状态。

☝️dhcpc 的工作流程图

dhcpc 的状态逻辑图

在这里插入图片描述

源码解析图

在这里插入图片描述
在这里插入图片描述

超时处理

在这里插入图片描述

处理网络数据包

在这里插入图片描述

信号处理

在这里插入图片描述

☝️dhcpd 的工作流程图

在这里插入图片描述

处理 DHCP 请求

处理 DHCP 请求


udhcp的文件结构

udhcp的文件夹中包含许多源文件和头文件,每组源和头文件对应着一个模块或功能。

● Dhcpc.c:DHCP client运行的主线,提供udhcpc_main作为入口函数,相当于main函数,将各个客户端模块组合起来实现DHCP客户端的功能。

● Frontend.c:该文件提供了一个main入口,在其中根据传入参数选择启动DHCP服务器还是客户端。
其余文件都是负责各个具体的模块:

● Arpping.c:该源文件只包含arpping函数,在服务器给客户端分配一个free IP后,会调用arpping函数,查看网络上是否有主机已经使用该地址。

● File.c和file.h:DHCP server file manipulation,负责DHCP服务器的文件操作,其中最重要的函数是read_config,该函数载入默认配置信息,并从配置文件udhcpd.conf读取配置信息。(以后读取配置信息的函数可以模仿read_config函数写)。

● leases.c:tools to manage DHCP leases,针对dhcpOfferedAddr结构的操作函数,该结构体是DHCPOFFER报文的数据主体,通过它,服务器向客户端提供租约的信息。

● options.c:DHCP server option packet tool,针对DHCP数据报文的options字段的操作函数都在这个文件中。

● packet.c:DHCP数据报文的构造和发送。

● pidfile.c:Functions to assist in the writing and removing of pidfiles。针对pidfile的写和删除操作。主要针对/tmp/var/run/udhcpd0.pid

● serverpacket.c:Constuct and send DHCP server packets。构造和发送dhcp服务器报文。

● clientpacket.c:Packet generation and dispatching functions for the DHCP client。

● socket.c:DHCP server client/server socket creation。套接字创建,包含interface信息的读取

● script.c:Functions to call the DHCP client notification scripts。

总结

本期先介绍先总结一下UDHCP的整体的工作流程图,在接下来的几篇文章里,将会详细介绍每个文件的作用,以及函数的作用,可以期待一下。

觉得有用的话,不要吝啬点赞哦!

勤奋小牛,努力奋斗!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/13995.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

开启鸿蒙开发之旅:静态页面搭建

写在前面 了解了一些常用的系统组件及其属性之后,我准备开始搭建我第一个页面,本次鸿蒙Next初体验我准备模仿这款“提醒事项”APP,从页面搭建到基本功能实现。今天从入口页开始: 布局思路 整体结构 从该页面的整体布局结构来看&…

C++20 STL CookBook 7 Containers(II)

让vector在插入删除的时候仍然保证是有序的 首先&#xff0c;STL的确提供了一种办法来检查我们的目标容器是不是有序的&#xff1a;std::is_sorted - cppreference.com&#xff0c;也就是std::is_sorted。我们当然可以这样做&#xff1a; #include <iostream> #include…

二叉树搜索树(下)

二叉树搜索树&#xff08;下&#xff09; 二叉搜索树key和key/value使用场景 key搜索场景 只有key作为关键码&#xff0c;结构中只需要存储key即可&#xff0c;关键码即为需要搜索到的值&#xff0c;搜索场景只需要判断 key在不在。key的搜索场景实现的二叉树搜索树支持增删查…

人力资源招聘系统-提升招聘效率与质量的关键工具

在当今这个竞争激烈的商业环境中&#xff0c;企业要想在市场中立于不败之地&#xff0c;关键在于拥有高素质的人才队伍。然而&#xff0c;传统的招聘方式往往效率低下&#xff0c;难以精准匹配企业需求与人才特质&#xff0c;这无疑给企业的发展带来了不小的挑战。 随着科技的飞…

【C++】类中的“默认成员函数“--构造、析构、赋值

目录 概念引入&#xff1a; 一、构造函数 问题引入&#xff1a; 1&#xff09;构造函数的概念 2&#xff09;构造函数的特性 二、析构函数 1&#xff09;析构函数概念 2&#xff09;析构函数特性 三、拷贝构造函数 1)拷贝构造函数概念 示例代码&#xff1a; 2)深拷…

环丙烷环辛炔聚乙二醇磷脂,淡黄色固体,BCN-PEG-DSPE

中文名称&#xff1a;环丙烷环辛炔聚乙二醇磷脂 英文名称&#xff1a;BCN-PEG-DSPE 外观&#xff1a;通常为黄色或淡黄色固体 材料来源&#xff1a;为华生物 溶解性&#xff1a;在有机溶剂&#xff08;如氯仿、乙醇&#xff09;中具有良好的溶解性&#xff0c;而在水中的溶…

202409电子学会青少年机器人技术等级考试(六级)理论综合真题

青少年机器人技术等级考试理论综合试卷&#xff08;六级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 30 一、 单选题(共 20 题&#xff0c; 共 80 分) 1. 使用 ESP32 for Arduino SPI 类库&#xff0c; 下列选项中&#xff0c; 具有设置时钟模式功能的成员函数是&…

如何学习VBA_3.2.14:字符串的处理

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。 如果…

ABeam News | ABeam中国受邀参加2024中国知识管理年会暨第14届China MIKE颁奖典礼,并荣获大奖

“ABeam/ News ” 近日&#xff0c;2024中国知识管理年会暨第14届China MIKE颁奖典礼圆满召开&#xff0c;大会结合AI赋能新质生产力的热点话题&#xff0c;以“AI超能力KM新价值” 作为主题&#xff0c;为与会观众带来知识管理的一场盛宴。ABeam中国受邀参会并荣获2024 China…

Error: Could not find or load main class org.apache.catalina.startup.Bootstrap

#现象&#xff1a; 官网下载tomcat source包后&#xff0c;启动报错&#xff0c;等一系列缺包造成服务无法启动 Error: Could not find or load main class org.apache.catalina.startup.Bootstrapjava.lang.ClassNotFoundException: org.apache.juli.logging.LogFactory原因 …

论文解读《CTRLsum: Towards Generic Controllable Text Summarization》

引言&#xff1a;一篇上交大佬的著作 ✅ NLP 研 2 选手的学习笔记 笔者简介&#xff1a;Wang Linyong&#xff0c;NPU&#xff0c;2023级&#xff0c;计算机技术 研究方向&#xff1a;文本生成、大语言模型 论文链接&#xff1a;https://aclanthology.org/2022.emnlp-main.396.…

【spotfire】脚本相关

文章目录 ironpython脚本使用JS实现弹出窗口思路实现效果 脚本的使用可以极大扩展spotfire的功能&#xff0c;但如何使用脚本一直不得其门而入&#xff0c;咨询厂商、查询资料&#xff0c;特此记录备忘。 ironpython脚本使用 参见官网教程&#xff1b; 部分参考资料如下&#…

嵌入式硬件杂谈(一)-推挽 开漏 高阻态 上拉电阻

引言&#xff1a;对于嵌入式硬件这个庞大的知识体系而言&#xff0c;太多离散的知识点很容易疏漏&#xff0c;因此对于这些容易忘记甚至不明白的知识点做成一个梳理&#xff0c;供大家参考以及学习&#xff0c;本文主要针对推挽、开漏、高阻态、上拉电阻这些知识点的学习。 目…

RCAgent:云故障根因分析的自主智能体工具增强型大模型

人工智能咨询培训老师叶梓 转载标明出处 由于云上计算部署的不断扩展&#xff0c;手动在线异常RCA工作流程&#xff0c;如创建故障排除工具&#xff0c;常常使网站可靠性工程师&#xff08;SRE&#xff09;应接不暇。为了提高云服务可靠性效率&#xff0c;一系列人工智能运维&…

PET-文件包含-FINISHED

include发生错误报warning&#xff0c;继续执行。require发生错误直接error&#xff0c;不继续执行 无视扩展名&#xff0c;只要能解析&#xff0c;就能当可执行文件执行&#xff0c;哪怕文件后缀或没后缀 1 条件竞争 pass17 只需要知道tmp的路径。把xieshell.jpg上传&…

基于Java+SpringBoot+Vue前后端分离课程管理系统

一、作品包含 源码数据库设计文档全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&…

学术界的秘密武器:Zotero7大插件推荐

还在为海量文献管理头疼吗?还在为找不到合适的插件犯愁吗?别急,今天我就要带你解锁Zotero的终极武器 - 那些让你爱不释手的必备插件! 作为一个从小白到文献管理达人的过来人,我可以负责任地说:没有这些插件,你的Zotero只能发挥一半功力!安装了这些插件,你的效率绝对能飙升! …

Linux·进程信号

信号是一种用户、OS、其他进程&#xff0c;向目标进程发送异步事件的一种方式。 在系统中信号是OS出场时程序员就内置好了的&#xff0c;因此任何进程都认识所有信号&#xff0c;信号产生之前&#xff0c;信号的处理方案就已经设定好了&#xff0c;一般有三种 1. 默认行为 2.…

BizDevOps:从理念到实践,贯通企业全链路协同

&#x1f446; 点击蓝字 关注我们 引言 BizDevOps的概念由DevOps发展和进化而来&#xff0c;其目标超越了开发和运维的协同&#xff0c;进一步实现业务、研发和运维的全链条协作&#xff0c;让业务作为价值的起点及核心目标。 BizDevOps的核心驱动力在于解决效率和正确性上的割…

工厂方法模式和抽象工厂模式

序 本文主要是记录学习设计模式当中的工厂方法和抽象工厂时碰到的疑惑和对答案的探讨 刚接触时的工厂方法模式和抽象工厂模式 工厂方法模式 类图 代码 //工厂public interface TVFactory {TV produce(); }public class TclTVFactory implements TVFactory{Overridepublic T…