资讯动态

从DHCP到网卡丢包:一文讲透网络通信全链路排查

发布时间:2026/10/18 3:39:04 来源:尧图企业网站定制
为什么你连网卡丢包都要查先把这条链路彻底讲透有一次我在机房排查一个“间歇性卡顿”的问题ping网关延迟一会儿正常一会儿飙到几百毫秒最后发现根因居然出在网卡的环形缓冲区被流量打满、内核来不及收包。当时我就在想很多人对网络问题一脸懵是因为脑子里没有“一条完整的链路”从网线进来到 DHCP 拿到地址到数据包如何封装转发再到网卡怎么把包送进内核任何一个环节出错表现都是网络卡、丢包、上不了网。这篇我就把这条链路从头到尾捋一遍结合我实际排障踩过的坑把 DHCP 的工作原理、公网 IP 与私网 IP 的区别、数据包发送与通信流程、网卡工作原理以及最让人头疼的网卡丢包问题一次说透。这篇内容适合刚入行的网络工程师、运维开发、后端开发也适合那些被“网络忽快忽慢”折磨得睡不着觉的普通用户。不夸张地说把这几块串起来你排网络故障的思路就会清晰很多。1. 设备接入网络的第一件事DHCP 的工作原理1.1 为什么需要 DHCP手写 IP 的痛在 DHCP 普及之前管理员要一台台设备手动配置 IP 地址、子网掩码、网关、DNS。一台两台还可以几十上百台终端再加上笔记本来回移动、手机平板随时接入手工配置就是灾难。而且手写 IP 非常容易出错最常见的就是两台设备配了同一个地址后开机的直接把先开机的挤下线。我现在还记得早年实训时整个机房临时断网排查了半小时就是因为有人闲着没事把 IP 改成了和服务器一样的地址。DHCP动态主机配置协议解决的就是这个问题设备接入网络后自动获取 IP同时拿到子网掩码、默认网关、DNS 等参数一切都由服务器统一分配和回收。这样既省人力又减少了地址冲突的概率。它的通信基于 UDP客户端端口 68服务器端口 67。注意DHCP 在早期阶段是纯广播通信这也是很多人抓包时觉得它“很吵”的原因。1.2 四个报文串起完整流程 Discover → Offer → Request → ACKDHCP 获取 IP 的交互过程业界常说是“四步握手”。我用自己的话拆开讲。第一步客户端发出 DHCP Discover 广播报文。因为此时客户端自己还没有 IP源地址是 0.0.0.0目的地址是 255.255.255.255带着自己的 MAC 地址在整个广播域内喊话“有没有 DHCP 服务器我需要一个地址这是我的 MAC请给我分配。”第二步DHCP 服务器收到 Discover 后在自己的地址池里挑一个可用地址回复 DHCP Offer 报文。Offer 里携带候选 IP、子网掩码、网关、租期、DNS 等消息。如果网络里有多个 DHCP 服务器客户端可能收到多个 Offer通常选第一个到达的。第三步客户端选择某个 Offer然后广播发送 DHCP Request 报文。注意这里仍然是广播目的是让所有 DHCP 服务器都能知道“我选了谁”。选中那台继续分配没被选中的就释放掉预留的地址。第四步被选中的服务器收到 Request 后正式确认分配回复 DHCP ACK 报文同时“记账”这个 IP 给了哪个 MAC、租期多长。客户端收到 ACK 后才正式启用这个 IP。这里有个细节值得说客户端在拿到 Offer 后并没有立刻使用地址而是先发 Request 再等 ACK这中间存在一点时间差。我在抓包调试时见过某些 DHCP 实现比较激进的设备在收到 Offer 后就尝试进行 ARP 探测这个 IP 是否冲突属于额外防御不是协议标准。协议标准里是否做冲突检测取决于实现。1.3 租约与续租为什么 DHCP 分配的 IP 不是永久的DHCP 分配的 IP 是“租”来的默认租期通常是一天86400 秒也有设置为几小时甚至十几分钟的。租期过半时客户端会单播给当初分配地址的那台服务器发送 Request 报文请求续租。服务器同意就回 ACK租约刷新不同意就回 NAK客户端就得重新走完整四步流程。如果服务器一直没响应客户端在租期剩余 7/8 时间点会再次尝试续租广播请求任何一台 DHCP 服务器都可以响应。租约到期还没续上地址就会被回收客户端回到无地址状态。我在实际维护中有一个习惯如果局域网内设备频繁离线先去看 DHCP 租期池里的“冲突”和“过期”记录。某次客户抱怨办公网的打印机打印到一半断连排查下来就是 DHCP 租期设置为 30 分钟打印机待机休眠时错过续租时间地址被别人占走醒来后还在用旧 IP 发数据结果自然是不通。后来把租期调到 8 小时问题就好多了。提示DHCP 客户端续租时会“提前”续租不是等租约到期才动手。理解这个机制就不会被“怎么租期还没到期就不通了”这类问题带偏。1.4 实操抓包看 DHCP 全过程抓 DHCP 包最简单的方式就是用 Wireshark启动抓包后在客户端执行 ipconfig /release 再 ipconfig /renewWindows或者 dhclient -r 再 dhclientLinux然后过滤 dhcp 协议即可看到完整的 Discover / Offer / Request / ACK 四个报文。我建议新手抓包时关注三个字段Transaction ID事务 ID客户端用随机数标识一次完整的 DHCP 会话四个报文共享同一个事务 ID用来关联配对。Relay Agent中继代理字段如果 DHCP 服务器在另一个网段交换机或路由器作为中继会在请求报文里填入自己的接口地址这样服务器就知道从哪个地址池分配。Option 55请求参数列表客户端会在 Discover 里列出它想要哪些参数子网掩码、路由、DNS、域名等服务器按需填充。有一次我们在跨网段环境里调试新设备抓包发现客户端一直在发 Discover但没有 Offer 回来。排查发现三层交换机上虽然配了 DHCP Relay但 Relay 指向的服务器地址写错了。这个坑很经典不是协议问题是配置问题但如果没有抓包习惯很容易在网线、防火墙、交换机 VLAN 上瞎猜半天。2. 公网 IP 与私网 IP两种地址的世界2.1 为什么会有公网和私网之分IPv4 地址总量约 43 亿个而全球联网设备远超这个数字。如果每个设备都必须占用一个全球唯一的公网地址地址早就枯竭了。实际解决方案是运营商只给组织或个人分配少量公网 IP内部设备使用私有 IP 组网需要访问外网时再通过网络地址转换NAT映射出去。这就是公网 IP 与私网 IP 存在的现实原因。公网 IP 是全局路由可达的、需要向运营商申请或租用的地址能在互联网上被直接寻址。私网 IP 则是组织内部自行规划的地址在公网上不可直接路由任何人都可以随便使用只要不在同一二层网络里冲突就行。2.2 私网地址段背下来就够用了RFC 1918 规定了三个私有地址段这是网络基础中的基础地址段范围掩码可用地址数约为典型场景A 类私有段10.0.0.0 – 10.255.255.255255.0.0.0/81670 万大企业内网、数据中心内部B 类私有段172.16.0.0 – 172.31.255.255255.240.0.0/12约 104 万中型公司、VPC 网络C 类私有段192.168.0.0 – 192.168.255.255255.255.0.0/16约 6.5 万家庭路由器、小型办公网家用路由器最常见的默认网段就是 192.168.1.0/24 或 192.168.0.0/24属于 C 类私有段的子集。我以前培训时经常让学员把这三大段背下来然后考试给一段地址问“这是公网还是私网”很多人一开始会栽在 172.16 开头的地址上误以为只有 192.168 才是私有。其实 172.16 到 172.31 这一大段都是私有的172.32 以上的则是公网地址很容易弄混。2.3 NAT私网设备访问外网的关键一跳私网设备要访问公网必须经过 NAT 设备通常是路由器、防火墙或运营商设备。家用场景里最常见的简化流程是电脑192.168.1.100发一个数据包给公网服务器源 IP 是 192.168.1.100源端口比如 10800。数据包到达路由器时路由器在 NAT 表里记一笔192.168.1.100:10800 映射为路由器公网口地址例如 12.34.56.78的一个端口比如 4096。路由器把数据包的源 IP 和源端口改成 12.34.56.78:4096发给公网服务器。服务器回包时目的地址是 12.34.56.78:4096路由器查 NAT 表换回 192.168.1.100:10800再发给电脑。这个过程对应用层完全透明但它带来一个重要影响外网主动访问内网设备时如果没有配置端口映射是找不到内网设备的因为 NAT 表里没有对应记录。这就是为什么公司内网服务器要在防火墙上做端口映射才能被外部访问。注意运营商级 NATCGNAT用 100.64.0.0/10 地址段来给用户分配“共享型公网地址”严格来说这不是私网地址但在你网络里它表现得就像一个私网地址无法被公网直接访问。很多人部署内网穿透方案时卡在这一层原因就是没有拿到真正的公网 IP。判断自己是否有真实公网地址最简单的方法就是看路由器 WAN 口获取的 IP 是不是公网 IP 段如果是 100.64 开头基本就是被运营商 NAT 了一层。2.4 公网 IP 和私网 IP 的典型场景对比真公网 IP服务器对外提供 Web 服务、搭建邮件服务、需要外网直接访问 SSH。私网 IP办公电脑、笔记本、手机、打印机等终端仅内网互通 借 NAT 上网。端口映射私网服务器对外提供服务在路由器上把公网 IP 的某端口如 443映射到内网某台设备的 443。我在一次项目里遇到过这样的需求某公司内部有个文件服务器只允许内网访问但又需要出差人员在外也能连接。方案有两条路一条是配置端口映射暴露到公网一条是做虚拟专网接入通过专用通道加密访问。当时考虑到安全合规要求最终选择了后者因为直接端口映射等于把文件服务暴露在公网攻击面上风险太高。这也是很多专业网络设计的共识能不出公网就不出。3. 网络通信的流程与数据包发送从一个请求到对面服务器3.1 分层模型每一层只关心自己的事网络通信不是“一个包直接送到对面”这么简单它是一层一层封装、转发、解封装的过程。最常见的参考模型是 TCP/IP 五层模型应用层、传输层、网络层、数据链路层、物理层。我经常用寄快递来类比应用层决定“我要发什么内容”比如 HTTP 请求的 JSON 数据。传输层决定“这份快递从哪个门进、送到哪个门”源端口、目的端口。网络层决定“寄到哪个城市”源 IP、目的 IP。数据链路层决定“在这条街道上快递怎么走到下一个驿站”源 MAC、目的 MAC。物理层就是实际的快递车辆和道路电信号/光信号。每一层只处理自己的头部信息下一层把上一层的数据当成载荷包起来。这就是为什么抓包时能看到一个以太网帧里套着 IP 包IP 包里套着 TCP 段TCP 段里套着 HTTP 数据。3.2 一个 HTTP 请求的完整封包旅程假设你在浏览器的地址栏输入了一个网址并回车我简化走一遍流程浏览器发现要访问的域名需要先解析成 IP于是向配置的 DNS 服务器发起查询拿到目标 IP比如 93.184.216.34。应用层构造 HTTP GET 请求数据。传输层在数据前加上 TCP 头随机选一个源端口比如 52344目的端口是 80HTTP或 443HTTPS并管理连接的建立、传输确认、断开。网络层加上 IP 头源 IP 是电脑的私网 IP比如 192.168.1.100目的 IP 是目标服务器的公网 IP。路由器根据目的 IP 决定下一跳怎么走。数据链路层加上以太网帧头和帧尾源 MAC 是电脑网卡的 MAC目的 MAC 是默认网关路由器 LAN 口的 MAC。这里有个关键点如果目标 IP 不在本地子网源设备不会直接去查询目标 IP 的 MAC而是查询网关的 MAC把数据包交给网关去路由。数据包到达路由器后路由器把目的 MAC 换成下一跳设备的 MAC比如运营商接入设备的 MAC再转发出去。数据包在公网上每经过一跳MAC 地址都会变化但 IP 层的目的 IP 一直不变直到最终到达目标服务器所在网络由目标服务器的网卡把数据帧收上来再逐层解封装到应用层。3.3 ARP数据链路层如何找到目标 MAC数据链路层转发依赖 MAC 地址但 IP 层只知道目的 IP。那么源设备怎么知道网关的 MAC答案是 ARP 协议。当设备要发送数据给同一网段的某个 IP或者默认网关它先查自己的 ARP 缓存表。如果表里没有对应关系就发一个 ARP 广播请求“谁是 192.168.1.1请把你的 MAC 告诉我。”网关收到后单播回复自己的 MAC。源设备把这个映射缓存起来默认过期时间一般是几十秒到几分钟过期后重新查询。我调试网络时经常用 arp -d 清空缓存再重新触发查询这种方式非常方便能确认是不是缓存了错误条目导致的通信故障。有一次某个设备换新网卡后 IP 没变但其他设备 ARP 缓存里还留着旧网卡的 MAC导致数据包一直发给一个已经不存在的硬件地址表现是 ping 不通清了缓存就好了。这种问题很隐蔽因为从配置上看 IP 完全正确。3.4 抓包验证真实的数据包发送过程我在教学时喜欢让学员做一个小实验打开 Wireshark抓一个简单的 ping 包然后逐层看封装。你会看到以太网帧头里目的 MAC 是网关的 MAC源 MAC 是本地网卡的 MAC。IP 头里源 IP 是本地 IP目的 IP 是 ping 目标地址。ICMP互联网控制消息协议报文里带着类型8 为请求0 为回复和标识符。透过这个实验能直观理解数据包从“我”到“网关”再到“远端”的链路。高级一点的做法是使用 tracertWindows/ tracerouteLinux观察路径上的每一跳 IP看数据包如何经过多个路由器转发。如果某一跳出现超时可能就不是链路故障而是该路由器出于安全考虑丢弃了探测报文。这两个工具的差异我往往是这么给新人解释的tracert 默认发 ICMPtraceroute 在 Linux 上默认发 UDP两者在同一路径上的观测结果会略有不同。这个差异在实际排查中挺有用。关于 MTU最大传输单元也需要顺带提一句。以太网默认 MTU 是 1500 字节如果应用层数据过大IP 层会分片或依赖更上层的分段机制。如果链路里存在 MTU 不一致比如加了 PPPoE 拨号的宽带MTU 常常只有 1492就可能出现“小包通、大包不通”的怪现象。经典表现是网页打不开但 ping 通就是因为 ping 包很小而 HTTP 响应包一旦超过 MTU 就被丢弃。排查思路就是缩短 MTU 测试比如 ping -f -l 1400 试试能不能通不信你可以自己试。放个注意在这里这属于过大的测试包可能被分片一定要用自己的实验环境验证公司生产环境不建议乱试会被人骂的。4. 网卡的工作原理数据包进出的第一道门4.1 网卡在整条链路中的角色网卡网络接口控制器NIC是设备与物理网络的桥梁。它一端连着网线或无线信道另一端连着操作系统内核的网络协议栈。所有进出设备的数据包都必须经过网卡。它的核心工作可以概括为三条发送时把内核协议栈交下来的数据帧转换成物理介质上的电信号/光信号/无线电波发出去。接收时把物理介质上的信号还原成数据帧校验无误后交给内核协议栈处理。辅助能力解析二层信息识别广播/组播/单播支持校验和计算与卸载、分片卸载、流量整形等。数据链路层的“帧”对网卡来说就是处理的基本单元。我们常说的 MAC 地址就是烧录在网卡上的全球唯一标识出厂时硬件厂商分配。它和 IP 地址的关系可以这么理解MAC 更像是设备的身份证号IP 更像设备在某个网络里的住址。身份证号终身不变住址可能随网络环境变化。这也是为什么 MAC 地址主要工作在同一二层网络内而 IP 地址是跨网络寻址的关键。4.2 收包路径从网线到应用层要经过哪些泵站一个数据帧到达网卡后处理路径大致是这样物理层收发器PHY把模拟信号解码成数字比特按前导码和帧起始符对齐形成完整的以太网帧。网卡检查帧的目的 MAC 是否匹配自己如果不是广播或组播也不匹配就直接丢弃校验 FCS帧校验序列如果错误就丢弃并计数。数据帧被暂存到网卡的环形缓冲区Ring Buffer中。环形缓冲区是网卡驱动在系统内存里分配的一段内存区域网卡通过 DMA直接内存访问把数据写入缓冲区不需要 CPU 参与极大降低 CPU 负载。缓冲区准备好了网卡会发起中断通知 CPU 有数据到达。CPU 中断处理程序唤醒网卡驱动收包逻辑从环形缓冲区把数据帧取出来。驱动把数据帧构造成内核协议栈能识别的结构sk_buff调用收包接口向上送。协议栈根据帧头里的 EtherType 判断上层是 IP0x0800、ARP0x0806还是 VLAN 报文分发给相应处理模块。最终经过 IP、TCP/UDP 层处理把数据交给正在监听的应用程序 socket。这段路径听起来不长但每一步都可能成为瓶颈。这也是第四大主题“网卡丢包”的温床。4.3 NAPI 与中断合并为什么网卡不是每个包都打断 CPU如果每个包到网卡都中断一次 CPU高速网络流量会把 CPU 完全淹没性能急剧下降。现代网卡普遍采用两种优化手段。第一种是中断合并收包到了一定数量或一定时间再统一发起一次中断。代价是延迟增加收益是吞吐量显著提升。调优时经常需要在延迟和吞吐之间做权衡。第二种是 NAPI 轮询机制新包到达时网卡发起一次中断之后内核进入轮询模式在处理完当前批次包之前不再依赖中断直到收包队列变空再切回中断等待。和旧的“进一个包、触发一次中断”相比NAPI 在高流量下大大减少了上下文切换开销。如果你的网卡支持 RSS接收端缩放或者多队列多个收包队列可以绑定到不同 CPU 核流量分散处理中断压力也被均摊。但这同时也意味着排障时不能只看单一 CPU 核得看整体中断分布和流量流散情况这个在后面讲丢包时还会用到。4.4 实用操作查看和管理网卡状态Linux 下最常用的网卡查看命令是 ethtool。查网卡速度和工作模式用 ethtool eth0查看队列数量与环形缓冲区大小用 ethtool -l eth0修改 RX/TX 队列数量往往需要设备重启或驱动重载可以用 ethtool -L 动态调整多数现代网卡支持。查询网卡统计信息用 ethtool -S eth0丢包排查时这是关键数据来源可以看到 rx_missed、rx_error、rx_dropped 等计数器。我在这里提一个常见的误解很多新手看到 ifconfig 输出里 RX dropped 数值大就以为网卡坏了。实际上这个计数可能包含内核对无效报文的丢弃比如校验失败、地址不匹配也可能是驱动主动丢弃比如环形缓冲区满。所以看到 dropped 增长不要急着换硬件先用 ethtool -S 拆开看是哪个计数在涨。如果想要快速、粗粒度了解当前丢包情况可以用 netstat -i 查看接口统计或者用 ip -s link show eth0 看累计收发和错误计数这些都是日常运维的高频命令。有一次我排查一个业务集群的问题发现某台机器的 rx_missed 持续增长但系统负载并不高。后来发现是网卡队列中断没有均匀分散到多核单核软中断打满。调整 IRQ affinity 后rx_missed 就不再上涨丢包问题解决。这种问题用传统 ifconfig 根本看不出来必须配合 ethtool -S 的细节统计才能定位。5. 网卡丢包问题从现象到根因的一次完整排查实录5.1 丢包到底丢在哪先分清位置“丢包”是个笼统的说法。实际上一个数据包从网络传到应用中途可能被丢弃的位置有好几个物理层丢弃信号质量差、链路干扰、双工模式不匹配、网线过长这类问题网卡会报 CRC 错误、对齐错误等计数在 rx_crc_errors、rx_frame_errors 里。网卡入口丢弃环形缓冲区被占满新来的包没地方放计数器表现为 rx_missed 或 rx_fifo_errors。内核协议栈丢弃数据帧被网卡收进来但内核处理不过来了。表现为 netdev 队列溢出系统日志或 netstat 里有相应计数。常见原因包括 CPU 软中断占用过高、套接字缓冲区太小、应用层处理慢。应用层丢弃数据到了 socket 队列但应用没有及时读取缓冲区满后内核主动丢包。定位思路是看 socket 接收队列是否堆积。所以“丢包”二字只是现象第一步永远要搞清楚丢在哪一层。我的习惯是先看链路层ethtool -S再看网络层ip -s、netstat -i最后看传输层netstat -s、ss逐层缩小范围不要一上来就在应用代码里找问题。5.2 常见丢包原因及现场特征速查表我在实际排查中整理过一个速查表非常实用现象关键计数器/日志根因方向常用手段大流量下丢包ping 通但并发慢rx_missed 增加环形缓冲区太小ethtool -G 增大 rx/tx buffer网线质量问题偶发丢包rx_crc_errors 增加物理链路不稳换网线/重做水晶头/检查接口是否松动双工不匹配网络慢但没明显报错ethtool 显示 half 或模式不一致自协商异常两端强制协商或排查网卡固件高并发时 CPU 中断满载mpstat 看软中断高、单核飙满中断分布不均/NAPI 配置不佳设置 IRQ affinity 或开启 RSS 多队列应用处理慢内存缓冲积压ss 显示 Recv-Q 堆积应用消费能力不足优化代码 / 增大 socket 缓冲区 / 增加实例路由或防火墙策略丢弃netstat -s 中相关计数安全策略/路由黑洞检查 iptables/firewalld/路由表通信小包通、大包不通延迟测试小包正常全片大包失败MTU 分片问题调整接口 MTU 或启用路径 MTU 发现5.3 实操一步步定位网卡丢包我拿一次真实排障经历拆解一下。某业务服务器的业务方反馈高峰时段接口成功率下降报错里能看到连接重置和超时。我的排查步骤记录如下。第一步确认丢包现象。ping 网关无异常但 ping 外网有轻微丢包。然后执行 ip -s link show eth0发现 RX dropped 很高而且还在增长。第二步用 ethtool -S eth0 | grep -E rx_missed|rx_fifo|rx_error|rx_dropped 拆分统计。结果显示 rx_missed 增长明显rx_error 基本没有增长。这说明物理链路没大问题问题出在网卡入口侧也就是环形缓冲区或内核收包能力不足。第三步查看网卡当前环形缓冲区配置ethtool -g eth0。默认 rx 是 256 个描述符对于大流量业务确实偏小。于是执行 ethtool -G eth0 rx 4096 tx 4096 把它调大。注意这个操作是临时的重启或驱动重载会恢复默认值。要想持久化需要写进网卡配置例如使用 systemd 服务或者网络管理器的启动脚本也可以用 ethtool 的持久化工具部分发行版叫 ethtool-persist 或 udev 规则。第四步调整环形缓冲区后rx_missed 还是偶发增长。进一步用 mpstat -P ALL 1 观察发现 CPU0 的软中断softirq非常忙其他核心很闲。看 /proc/interrupts 确认所有网卡中断都落在 CPU0 上。于是用脚本设置 IRQ affinity把各队列的中断分散到不同 CPU。改完后再观察rx_missed 基本不再增长接口成功率恢复正常。这套排查流程的核心逻辑是先明确丢包位置再逐个排除物理、入口、协议栈、应用层问题。只要每一步都看计数不靠猜定位起来就会很快。5.4 内核参数调优给协议栈加宽管道除了网卡层面的环形缓冲区内核协议栈也有自己的缓冲和队列调优时可以关注几个关键参数。net.core.netdev_max_backlog协议栈处理输入数据包队列的最大长度。默认值在某些发行版是 1000高流量下容易丢包。可以提高到 4096 或更高。net.core.rmem_max 和 net.core.wmem_maxsocket 读/写缓冲区上限。如果应用需要超大吞吐可以调大。net.ipv4.tcp_rmem / tcp_wmemTCP 层动态调整的参数内核会根据内存压力和实际负载自动伸缩。关闭 TCP 校验和的重复计算或开启硬件卸载前提是网卡硬件支持可以用 ethtool -k 查询 offload 功能。调优前我建议先做基线记录调整前和调整后的丢包计数、吞吐、延迟各是多少。不然只是凭感觉改参数出了问题都不知道是哪一步引起的。某次我在一台服务器上调大 netdev_max_backlog 后丢包计数确实降了但延迟明显升高因为队列变长等于变相增加了排队时间。后来我把业务拆开一部分流量走其他网卡才把延迟压回来。改参数不是越大越好是匹配业务模型才好。5.5 排查丢包时的三个独家技巧技巧一把 ethtool -S 的关键计数隔段时间打点记录不要只看瞬间值。很多问题是周期性发生的瞬时看可能看不出来。我习惯用 watch -n 1 或写个小脚本定时记录再和业务日志时间点做对比。技巧二留意网卡的队列数和 CPU 核数。队列太少、CPU 核太多或太少都不合适最佳实践一般是一队列绑一个核且确保核上有空闲。如果开多队列还要检查网卡是否支持流散Hash 分流不然配置了也白搭。技巧三看丢包时间规律。如果丢包总在每天固定时段出现先看是不是有定时任务、备份任务、日志采集任务在高峰期抢资源。我曾经找了半天网卡问题最后发现丢包时间是每天凌晨的数据库备份任务触发把网卡流量和 CPU 都打满了。一句话总结就是排障要结合时间和流量的模式来判断不能只看计数。兜底收尾说点这些坑带给我的实际体会把这些技术点串起来后我最大的体会是网络排障没有玄学只有踩过的坑不够多。DHCP 不通就从四个报文的抓包里找原因公网私网分不清就先确认 NAT 边界在哪数据包发不出去就沿着一层层的封装去查 ARP 和路由丢包了就用 ethtool 的计数器把位置钉死再一层层拆。别看每件事单独理解都不难真正在机房现场把它们串起来才是从“会用命令”走向“会排障”的那道坎。最后分享一个小技巧我每次给一台新服务器做上线前检查都会花两分钟把 ethtool -S、ip -s link、/proc/interrupts、sysctl 网络参数快照保存一份。等哪天真的出了网络问题这些基线数据就是破案的起点。没有基线你就不知道哪个计数是异常有了基线一切对比都清清楚楚。希望这篇内容能帮你把网络这条链路拼完整下次再遇到丢包时少走点弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑