1. 从一个“IP 又变了”的早晨说起你有没有遇到过这种情况昨天本地跑得好好的服务今天一启动就连不上数据库一查发现开发机的 IP 从192.168.1.106变成了192.168.1.112。容器网络、白名单、回调地址全都要跟着改一遍。这背后大概率就是 DHCP 在“默默干活”——它把地址租给你租期到了或者你换了网络它就重新分配。DHCPDynamic Host Configuration Protocol动态主机配置协议是一个局域网协议核心作用是由服务器集中管理一段 IP 地址范围客户端接入网络时自动拿到 IP、子网掩码、网关、DNS 等信息。它解决的是“手工配 IP 容易冲突、容易写错、换网络就要重配”的问题同时提升地址利用率。适合谁看做后端、运维、嵌入式、智能硬件的同学尤其是需要在开发环境里对接统一 Key/API 通道、又想把网络层搞明白的人。这篇我会把 DHCP 的四次握手DISCOVER-OFFER-REQUEST-ACK拆开讲清楚每个报文长什么样、起什么作用再给一份可复制的客户端配置骨架和 Wireshark 抓包过滤规则最后结合 TaoToken 统一 Key/API 通道在开发环境里的网络配置场景把“地址分配”和“接口调用”这两件事串起来。全程可以跟着做抓包结果我会给出预期现象。2. 先把 TaoToken 这条通道准备好在讲抓包之前先说明为什么开发环境里会同时出现 DHCP 和 API 通道这两件事。你在本地或内网跑一个 Agent、编码助手、模型调用脚本时机器要先拿到可用网络这一步靠 DHCP然后才能访问外部 API。TaoToken 在这里扮演的是统一 Key/API 通道的角色你不用为每个模型单独维护一套鉴权和地址用一个 Key 走统一入口即可。官网入口https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_contentAPI 基址不带 UTMhttps://taotoken.net/api需要提前拿到的东西是 API Key。进入控制台创建控制台https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteAPI Keys 管理https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite注意Key 属于凭据不要写进会提交到 Git 的配置文件里。开发环境建议用环境变量注入下面配置骨架会体现这一点。如果你只是想先验证模型通不通可以直接用模型对话页面试一条请求模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite如果你是要长期跑编码类任务、Agent 循环调用建议看 Coding Plan配额和调用方式更适合持续使用Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite接入细节和参数说明在文档里接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewriteClaude Code / Anthropic 兼容场景的配置参考ClaudeCodeAnthropichttps://taotoken.net/claude-code-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecodeutm_campaignrewrite把这条通道准备好之后回到网络层你的开发机得先有一个稳定可用的 IP才能稳定地发这些请求。DHCP 就是负责这一步的。3. DHCP 四次握手与八种报文逐条拆解DHCP 的地址分配主流程是四次握手DISCOVER → OFFER → REQUEST → ACK。理解这四步的关键是搞清楚“谁在广播、谁在单播、携带了什么”。3.1 DISCOVER客户端广播找服务器客户端刚接入网络时自己也不知道 DHCP 服务器在哪所以用广播方式发 DISCOVER。源地址是0.0.0.0目的地址是255.255.255.255目的端口 UDP 67。报文里带自己的 MAC 地址和客户端标识意思是“我是谁谁能给我个地址”。所有收到 DISCOVER 的服务器都会准备应答。3.2 OFFER服务器给出候选地址服务器收到 DISCOVER 后从地址池里挑一个可用 IP连同租约期限、网关、DNS 等选项构造 OFFER 发回客户端。这一步只是“我可以给你这个地址”还没最终确定。客户端拿到 OFFER 后通常会用 ARP 探测一下这个地址是否已被占用避免冲突。3.3 REQUEST客户端确认选择客户端可能收到多个 OFFER它一般选第一个到达的服务器然后广播一个 REQUEST通告“我选了你请把地址正式给我”。这里有个容易忽略的点REQUEST 也是广播的目的是让其他发过 OFFER 的服务器知道自己的提议没被选中可以回收候选地址。另外租期过半1/2时客户端会发单播 REQUEST 续租如果没收到 ACK租期到 3/4 时会再发广播 REQUEST 续租。3.4 ACK服务器正式确认服务器收到 REQUEST 后根据报文里的 MAC 查找租约记录确认无误就回 ACK通知客户端可以正式使用这个地址。到这一步客户端才会把 IP、掩码、网关、DNS 真正配置到网卡上。3.5 其余四种报文NAK / Release / Decline / InformNAK 是服务器拒绝收到 REQUEST 后没有对应租约记录或地址无法分配就回 NAK客户端收到后要重新走 DISCOVER。Release 是客户端主动释放不再需要地址时发 Release服务器回收。Decline 是客户端拒绝收到 ACK 后做冲突检测发现地址被占用发 Decline 告诉服务器这个地址不可用请求换一个。Inform 是客户端只想获取更详细的配置信息比如已有 IP只想要 DNS 等选项服务器回 ACK 携带配置目前基本不用了。报文方向发送方式核心作用DISCOVER客户端→服务器广播发现网络中的 DHCP 服务器OFFER服务器→客户端单播/广播提供候选 IP 及配置REQUEST客户端→服务器广播/单播确认选择、续租ACK服务器→客户端单播/广播正式确认分配NAK服务器→客户端单播/广播拒绝分配Release客户端→服务器单播主动释放地址Decline客户端→服务器广播声明地址冲突不可用Inform客户端→服务器单播仅获取额外配置4. 可复制的客户端配置骨架与抓包规则这一节给两份可直接用的东西一份是开发机上让 DHCP 客户端行为可控的配置骨架一份是 Wireshark 抓包过滤规则。4.1 Linux 下 dhclient 配置骨架大多数发行版默认用 dhclient 或 NetworkManager。下面这份是 dhclient 的配置骨架放在/etc/dhcp/dhclient.conf重点是超时、重试和请求哪些选项# /etc/dhcp/dhclient.conf # 请求的配置选项按需增减 request subnet-mask, broadcast-address, routers, domain-name-servers, domain-name, interface-mtu; # 单次等待 OFFER 的超时时间秒 timeout 30; # 重试次数与间隔 retry 5; # 每次重试间隔秒 # backoff-cutoff 用于控制退避上限 backoff-cutoff 120; # 初始间隔 initial-interval 2; # 是否在租约到期前续租默认行为即可 # rebind 阶段由客户端自动处理应用配置并手动触发一次完整流程# 释放当前租约 sudo dhclient -r eth0 # 重新获取-v 输出详细过程能看到 DISCOVER/OFFER/REQUEST/ACK sudo dhclient -v eth0执行dhclient -v时终端会打印类似DHCPDISCOVER on eth0、DHCPOFFER of 192.168.1.112、DHCPREQUEST、DHCPACK的日志这就是四次握手在客户端的视角。4.2 Wireshark 抓包过滤规则抓 DHCP 用 UDP 67/68 端口过滤最直接udp.port 67 || udp.port 68只看四次握手主流程bootp.option.dhcp 1 || bootp.option.dhcp 2 || bootp.option.dhcp 3 || bootp.option.dhcp 5其中 option 53 的值对应报文类型1DISCOVER2OFFER3REQUEST5ACK4NAK7Release8Inform。想按 MAC 过滤某台机器bootp.hw.mac_addr 00:11:22:33:44:55抓包时建议在客户端和服务器之间的镜像口或客户端本机抓本机抓能看到广播包。抓到后按bootp.option.dhcp排序就能看到完整时序。4.3 结合 TaoToken 通道的环境变量骨架网络通了之后把 API 通道的配置用环境变量注入避免 Key 落盘# 写入当前 shell 会话不要提交到仓库 export TAOTOKEN_API_BASEhttps://taotoken.net/api export TAOTOKEN_API_KEY你的Key # 验证网络与通道是否都就绪 curl -sS $TAOTOKEN_API_BASE/v1/models \ -H Authorization: Bearer $TAOTOKEN_API_KEY | head -c 300如果这条 curl 能返回模型列表说明 DHCP 分配的地址、网关、DNS 都正常且 API 通道可达。如果失败先看是网络层问题还是鉴权问题下一节会拆。5. 逐报文验证抓包结果与成功现象配置好之后按下面的动作逐条验证每一步都有预期现象。第一步清空租约并启动抓包。在 Wireshark 里选好网卡输入udp.port 67 || udp.port 68开始抓包。然后在终端执行sudo dhclient -r eth0 sudo dhclient -v eth0。第二步观察 DISCOVER。Wireshark 里应出现一条源0.0.0.0、目的255.255.255.255的包Info 列显示DHCP Discover。展开 BOOTP 部分Option 53值为 1Client MAC address是你的网卡 MAC。第三步观察 OFFER。紧接着应出现服务器回的包Info 显示DHCP OfferOption 53值为 2Your (client) IP address就是候选地址Option 1是子网掩码Option 3是网关Option 6是 DNS。第四步观察 REQUEST。客户端广播 REQUESTInfo 显示DHCP RequestOption 53值为 3Requested IP Address与 OFFER 里的候选地址一致Server Identifier指向选中的服务器。第五步观察 ACK。服务器回DHCP AckOption 53值为 5Option 54是服务器标识租约时间在Option 51。到这一步终端dhclient -v会打印bound to 192.168.1.112ip addr show eth0能看到地址已生效。第六步验证续租。把租约时间调短测试环境可把服务器租约设为 120 秒在租期过半时抓包应看到单播 REQUEST 和 ACK而不是重新走 DISCOVER。这一步能直观看到“续租”和“重新分配”的区别。第七步验证通道。地址生效后执行上一节的 curl返回模型列表即成功。如果 curl 报连接超时先ping网关再nslookup域名逐层排除。6. 本篇常见错排查抓不到任何 DHCP 包。先确认抓的是正确的网卡虚拟化环境下宿主机抓不到虚拟机内部的广播要在虚拟机所在网桥或虚拟机内部抓。另外确认过滤规则没写错udp.port 67 || udp.port 68是最稳的。只看到 DISCOVER 没有 OFFER。说明广播到了但服务器没响应。检查 DHCP 服务是否开启、地址池是否耗尽、客户端和服务器是否在同一广播域。跨网段需要 DHCP Relay普通广播过不了路由器。有 OFFER 但没 ACK。常见于 REQUEST 里的 Server Identifier 和实际服务器不一致或者服务器租约记录被清理。也可能是地址冲突检测失败客户端发了 Decline。抓包里看到Option 53值为 4NAK就属于这类。拿到地址但上不了网。DHCP 只负责分配路由和 DNS 要单独看。ip route看默认网关是否存在cat /etc/resolv.conf看 DNS 是否写入。如果网关对但 DNS 错域名解析会失败但 IP 直连能通。TaoToken 请求返回 401。这是鉴权问题不是网络问题检查TAOTOKEN_API_KEY是否注入成功、有没有多余空格、Key 是否已失效。返回超时才是网络层问题回到上一条排查。租约频繁变化导致白名单失效。给开发机在 DHCP 服务器上配静态绑定按 MAC 固定 IP或者在客户端配固定地址但保留在地址池之外避免冲突。7. 把网络层和 API 通道串起来用抓包这件事的价值不只是“看懂 DHCP”而是当你的 Agent 或编码脚本突然连不上时你能快速判断是地址没拿到、网关不对、DNS 解析失败还是 Key 鉴权问题。我试过在容器里跑任务容器网络没配好导致 DHCP 拿不到地址表现就是请求一直超时排查半天才发现是网络层。如果你要长期跑编码类、Agent 类任务建议把 Coding Plan 用起来配合环境变量注入 Key网络层用 DHCP 静态绑定保证地址稳定这样白名单和回调地址就不用反复改Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite接入参数和兼容细节以文档为准接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite想先快速验证模型是否可用用模型对话页面发一条即可模型对话https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewriteKey 的创建和管理在这里API Keyshttps://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite最后留一个实用习惯每次换网络环境后先dhclient -v看一遍四次握手日志再 curl 一次 API 基址两步都过再开始跑任务。这样能把网络问题和业务问题分开省下大量排查时间。