ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

网络排障实战:从TCP状态机到DNS解析的计算机网络基础

网络排障实战:从TCP状态机到DNS解析的计算机网络基础 简介这是一份以计算机网络技术基础为主题的PDF学习资料适合网络工程初学者、备考网络相关认证的考生以及需要快速查阅网络原理的运维与开发人员。内容以OSI参考模型为主线从应用层到物理层逐层讲解各层功能与代表协议如HTTP、FTP、TCP、UDP、IP、HDLC、PPP等同时系统梳理广域网、互联网、局域网三类网络的联系与区别涵盖以太网CSMA/CD机制、TCP/IP协议族以及ADSL Modem等网络设备知识结构清晰、层次分明便于读者按需精读或重点检索。资源包共包含1个PDF文件整体约813KB体积小巧适合在电脑、平板或手机上随时阅读。目前已有98人学习/下载作为打牢网络基础、考前快速复盘或日常备查的轻量资料比较合适。1. 凌晨三点排查超时还是绕不开计算机网络技术基础凌晨三点被接口超时告警叫醒登录跳板机ping 网关通ping 对端 IP 通curl 却卡在连接建立。最后抓包发现不是服务挂了是 SYN 重传对端半连接队列被打满。事后复盘所有判断都绕不开那几个基础概念分层、寻址、端口、状态机。计算机网络技术基础知识这个标题看起来是新手扫盲用的但工作三年以上的人同样能从里面拿到信息量——TCP 的状态、DNS 的 TTL、路由的选路这些知识点在你已经会写 tcpdump 一行命令的当下才真正决定你能不能短时间里把故障边界画清楚。下面直接按排查视角把网络基础拆成能复现的命令和判定方法。2. 把分层模型当成故障坐标系计算机网络技术的底层语言分层的价值不在于考试而在于给你一张故障坐标系。连接不通时先定位是哪一层的行为异常再动手查配置顺序永远不会乱。2.1 七层模型与四层模型的取舍OSI 七层模型在日常排障中不需要全部背下来真正能用上的是 TCP/IP 四层视角链路层处理 MAC 与帧网络层处理 IP 地址与选路传输层处理端口与连接状态应用层处理协议语义。你只需要在这四个层之间做二分定位。常见的做法是先看链路层通不通再看网络层通不通再看传输层端口通不通最后才轮到应用层。公司内部 A 服务连不上 B 服务不要第一反应去翻应用日志。先 ping 对端 IP通则排除链路与网络层再用 nc 或 telnet 探测端口通则说明传输层握手没问题此时才轮到怀疑 B 服务本身。按这个顺序排查能把“网络问题”和“应用问题”彻底分开。这四层里链路层排查依赖交换机端口状态与 ARP 表网络层依赖路由表与 ICMP 回应传输层依赖握手标志与连接状态应用层依赖协议报文内容。每一层都有独立的证据来源分层的意义就是让你在拿到证据后能立即缩小范围而不是对着报错信息猜。2.2 一次 HTTP 请求如何穿过各层一次 HTTPS 请求从浏览器发出到服务器收到响应每一层只处理自己的头部处理完交给下一层。这个过程叫封装与解封装理解它之后tcpdump 里的每一个字段都能对上号。数据链路层封装帧按 MAC 地址在交换机域内转发网络层封装 IP 包头按目的 IP 路由选路传输层封装 TCP 包头按端口标识应用应用层才是 HTTP 报文本身。下面这张表把关键标识列出来排查时直接按列取字段。层PDU典型协议关键标识端到端对象应用层报文HTTP, DNS, TLSURL、域名、状态码进程与进程传输层段TCP, UDP源端口、目的端口、序列号端口与端口网络层包IP, ICMP源 IP、目的 IP、TTL主机与主机链路层帧Ethernet, ARPMAC 地址、VLAN ID相邻节点封装顺序是从上往下加头解封装从下往上取头。排障时只看当前层的头就够了TCP 握手失败就只看 TCP 标志位路由不通只看 ICMP 的 TTL 超时ARP 找不到 MAC 再看链路层。不要在一个现象里混用两层的证据这是新手最容易犯的错。2.3 从 tcpdump 看分层证据抓包是观察分层最直接的途径。下面命令在 eth0 上抓取发往 443 端口的 TCP 包只取 8 个包便于观察。sudo tcpdump -nn -i eth0 -c 8 tcp and port 443 -v命令中-nn不做 IP 和端口反向解析避免抓包瞬间产生额外的 DNS 查询干扰现场-c 8表示抓到 8 个包后自动退出-v会打印 TTL、TOS 等 IP 层细节。输出里同时能看到 IP 层与 TCP 层的信息源目地址属于网络层证据flags 与 seq 属于传输层证据。如果输出里能稳定看到SYN与ACK标志说明网络层和传输层都正常工作如果只有SYN重发看不到SYN-ACK问题大概率落在对端主机或中间防火墙如果只看到 ARP 请求而没有 IP 包说明二层寻址都没完成。按这个思路把抓包结果对照分层表故障边界半小时内就能画出来。3. IP寻址与子网划分计算机网络技术里最常算错的一段IP 地址是所有网络配置的基础但很多人只记住了十进制长什么样没搞清楚掩码在哪一位切分网络。子网划错路由就错路由错了一切上层排查都白做。3.1 掩码决定网段网段决定直连还是路由IP 地址是 32 位二进制数掩码用来标记哪些位是网络位。两个 IP 是否在同一网段不看前三位数字是否相同而看掩码截取后的网络位是否完全一致。这是最常见的误区。以 10.0.0.5/24 和 10.0.0.200/24 为例掩码 24 位网络地址都是 10.0.0.0两者同网段可以直接通过二层通信。但如果把掩码改成 25 位网络位多占一位10.0.0.5/25 属于 10.0.0.0/25而 10.0.0.200/25 属于 10.0.0.128/25两者被切成不同子网通信就必须走路由器。同一个 IP 前缀掩码一变结论就反了。排障时判断“能不能直接通”的规则是目的地址落在本机网段内走 ARP 找 MAC落在网段外走路由表找下一跳。很多人一上来就 ping 不通去查防火墙其实第一步应该先确认是否同网段。这个判断 30 秒就能完成却经常被跳过。3.2 用 ipcalc 和 Python 快速划分子网手动换算二进制容易出错尤其是要规划新网段或验证已有配置时。常用做法是用 ipcalc 直接算系统没装就先装一下。ipcalc 192.168.10.0/25输出会直接给出网络地址、广播地址、可用主机范围和掩码。/25表示掩码位数为 25可用主机数是 2 的 7 次方减 2即 126 个。这里减 2 是因为网络地址和广播地址不可分配给主机。ipcalc 适合一次性查看完整段信息但脚本里批量计算时我一般用 Python 的 ipaddress 模块。import ipaddress net ipaddress.ip_network(192.168.10.0/25, strictFalse) print(net.network_address, net.broadcast_address) print(list(net.hosts())[0], list(net.hosts())[-1]) print(len(list(net.hosts())))这段代码先构造一个子网对象再分别输出网络地址、广播地址、第一个可用主机和最后一个可用主机。strictFalse表示允许传入的主机位不为零的地址脚本里输入来自配置文件时这个参数能避免误报。批量判断一批 IP 落在哪个网段用 ipaddress 比手写与运算可靠得多。3.3 路由表是判断“能不能到”的唯一依据路由表决定数据包往哪个方向走。查看本机路由表的命令是ip route show常见输出如下。default via 10.0.0.1 dev eth0 proto dhcp 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.5第一行是默认路由所有未匹配更精确条目的流量都走 10.0.0.1第二行是直连网段10.0.0.0/24 网段内的包直接从 eth0 发出。排障时看到Network is unreachable的报错说明目的地址既没有匹配任何路由条目也没有默认路由兜底这时去查防火墙完全跑偏了方向。路由匹配遵循最长前缀匹配原则掩码越长优先级越高。所以在有默认路由和明细路由同时存在时目的地址优先匹配明细条目。这条规则也解释了为什么多网卡机器上偶尔出现流量走错出口——通常是明细路由缺失流量落到了默认路由上。先ip route show再看配置顺序不要反。4. TCP 状态机与握手计算机网络技术排查中最该盯紧的连接细节TCP 是状态最多、最容易出问题的传输层协议。握手不成功、连接堆积、超时重置每一个现象背后都对应一个状态。看懂状态机就能直接判断问题出在谁身上。4.1 三次握手不是连通性测试是参数协商三次握手的本质是双方交换初始序列号并确认窗口大小顺便告诉对端“我能收发数据”。SYN 表示请求同步SYN-ACK 表示对端同意同步ACK 表示确认完成。很多人以为握手只是为了“测试通不通”其实通不通靠的是底层 ICMP 和路由握手解决的是传输参数。方向标志含义关键参数客户端到服务端SYN请求建立连接初始序列号服务端到客户端SYN-ACK接受连接并同步服务端序列号、通告窗口客户端到服务端ACK确认完成确认号抓包时看 seq 和 ack 的变化比只看标志位更有价值。第三次握手时客户端携带的确认号应该是服务端初始序列号加一这是判断是否为正常握手的重要依据。如果确认号对不上说明中间有人篡改或设备在做状态检测需要进一步检查安全设备。4.2 抓一次完整握手并判读绝对序列号下面命令抓取一次完整握手过程为了看清序列号的真实变化这里特意用-S显示绝对序列号不做相对转换。sudo tcpdump -nn -i eth0 tcp port 80 -c 12 -S正常情况下会看到三组关键包第一组Flags [S]带客户端初始序列号第二组Flags [S.]带服务端初始序列号和对客户端序列号的确认第三组Flags [.]是客户端对服务端序列号的确认。-S的意义在于默认相对序列号从 0 开始掩盖了真实初始值遇到序列号异常时容易错过线索。如果抓到的全是Flags [S]且序列号始终不变说明对端根本没收到或没有回应。此时配合ss -tlnp看服务端是否在监听再确认防火墙规则。如果服务端在监听且无过滤规则就要考虑半连接队列是否被打满对应调整内核参数调整项是net.ipv4.tcp_max_syn_backlog与net.core.somaxconn改完后用sysctl -p生效。4.3 用 ss 查连接状态CLOSE_WAIT 最需要警惕查看本机连接状态用ss比 netstat 更快输出也更结构化。ss -tnp | grep -v LISTEN ss -lnt第一条命令列出所有非监听状态的 TCP 连接第二条列出所有监听端口。排障时重点关注两个状态TIME_WAIT大量出现说明主动关闭方在等超时回收属于正常现象CLOSE_WAIT持续堆积则是被动关闭方没有调用 close说明应用层代码漏了释放连接这个状态靠查内核参数解决不了得去查应用。判断问题归属的一条经验是TIME_WAIT 高发在前端代理或压测机CLOSE_WAIT 高发在被调用的后端服务。前者可以调整net.ipv4.tcp_fin_timeout让回收更快代价是可靠性略微下降后者只能改代码。抓包看到FIN发出后只有重传没有ACK也可以证实这个判断方向。5. DNS 解析链路计算机网络技术里被低估的延迟与丢包来源很多线上故障表面是“连接超时”实际是域名解析卡住或解析结果错误。DNS 的排查成本很低却最容易被跳过去。5.1 递归与迭代先分清是哪一段出问题一次域名解析由多台服务器协作完成。客户端先查本地缓存没有缓存就发给递归服务器递归服务器再按根、顶级域、权威的顺序逐级查询。排障时要先分清问题出在哪一段才能决定看哪边的日志。递归段负责替你跑腿权威段负责给出答案。dig命令的trace参数可以直接展示从根到权威的完整迭代过程这是最直观的定位方式。常见现象是本地解析慢、但用公共 DNS 解析快这属于递归服务器问题反过来所有解析都拿到错误 IP则要怀疑权威侧配置或域名解析记录本身。5.2 用 dig 验证正向解析与完整链路下面命令分别做完整链路跟踪和指定服务器查询。dig trace example.com dig 8.8.8.8 example.com A noall answertrace会从根域开始逐级查询并打印每一级的响应时间能看出延迟集中在哪一跳。第二条命令指定公共 DNS 作为递归服务器只输出最终答案noall answer用来屏蔽额外字段让输出只剩解析结果。这里指定A表示只查 IPv4 记录查 IPv6 用AAAA。执行后如果域名解析出的 IP 和你的预期不一致先别急着清缓存要确认你查的是不是权威服务器上的记录。用dig example.com NS拿到权威列表再直接向权威服务器发查询排除了缓存干扰才能定位是记录配置错还是缓存过期策略有问题。5.3 TTL 与缓存改完记录为什么迟迟不生效TTL 是 DNS 记录被缓存的时间单位是秒。修改记录的生效时间不由你说了算而是由旧的 TTL 决定。常见做法是先调低 TTL 等它自然过期再修改记录值避免新旧记录长时间混用。操作常见做法生效时间临时改记录先调低 TTL 到 60等待过期分钟级正常业务切换保持 TTL 300 到 600提前改按旧 TTL 自然过期紧急故障处理直接改记录接受缓存残留不确定看客户端缓存客户端本地 DNS 缓存也可能导致你测试时以为没生效。验证时用指定服务器查询绕过本地缓存比如dig 8.8.8.8。生产环境建议直接抓包看响应里的 TTL 值确认解析链路每一层的缓存时间这样改记录时心里有底。6. 四条探测命令把计算机网络技术知识变成手上动作基础概念讲再多最后都要落到输入命令和判断输出上。下面四个命令覆盖连通性排查的四个层次顺序执行基本能把故障边界压到最小区间。ping -c 4 10.0.0.1 traceroute -n 10.0.0.1 nc -vz 10.0.0.1 443 curl -v https://10.0.0.1/ping 验证网络层往返traceroute 看中间路径经过哪些节点nc -vz只探测端口是否可连接curl 验证应用层协议交互。每一条的输出都有明确指向ping 丢包看链路质量traceroute 卡在某一跳看路由或防火墙nc 超时看端口监听与安全组curl 报证书或协议错误看应用层配置。还有一个容易忽略的点是 MTU。HTTP 接口偶发超时但 ping 小包正常多半是 MTU 过大导致分片丢弃。用下面命令测试最大可用载荷。ping -M do -s 1472 -c 4 10.0.0.1-M do禁止分片-s 1472是 1500 减去 28 字节 IP 与 ICMP 头后的最大值。如果这个大小不通逐步减小-s直到找到临界值再把这个值加上 28 换算成对应链路的 MTU去调整交换机或云上安全组的配置。排查到这一步计算机网络技术基础里的每一个概念都在命令里有了回声剩下的事情就是把输出读准。本文还有配套的精品资源点击获取
返回列表