news 2026/9/19 3:29:03

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网络排障实战:从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 属于传输层证据。

如果输出里能稳定看到SYNACK标志,说明网络层和传输层都正常工作;如果只有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", strict=False) print(net.network_address, net.broadcast_address) print(list(net.hosts())[0], list(net.hosts())[-1]) print(len(list(net.hosts())))

这段代码先构造一个子网对象,再分别输出网络地址、广播地址、第一个可用主机和最后一个可用主机。strict=False表示允许传入的主机位不为零的地址,脚本里输入来自配置文件时这个参数能避免误报。批量判断一批 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_backlognet.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 +answer

+trace会从根域开始逐级查询并打印每一级的响应时间,能看出延迟集中在哪一跳。第二条命令指定公共 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,去调整交换机或云上安全组的配置。排查到这一步,计算机网络技术基础里的每一个概念都在命令里有了回声,剩下的事情就是把输出读准。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/19 3:28:33

AI测试工程能力地图:从五域能力模型到落地实践

最近在重新梳理团队测试体系时,我越来越觉得“AI测试工程”这几个字不该继续挂在嘴边当概念了。很多人开口就说“我们要做AI测试”“我们想用AI来测”,但一旦问到底层:你们会什么,团队缺什么,从哪里补起,大…

作者头像 李华
网站建设 2026/9/19 3:27:06

.NET MAUI Essentials 跨平台设备感知与智能交互实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 3:26:16

MCP协议实战:让Cursor调用文件操作、网页抓取等外部能力

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/19 3:25:32

IEEE 33节点配电网光伏并网PSCAD建模:从潮流算例到电磁暂态仿真

手里有一份IEEE 33节点配电网的潮流算例,目标是验证光伏并网后的电压抬升、暂态冲击和谐波特性——很多做分布式电源课题的同学应该都卡在过这一步:Matlab里潮流算得好好的,但要输出开关级的并网冲击波形、逆变器动作细节,就绕不开…

作者头像 李华
网站建设 2026/9/19 3:23:05

智慧校园双中台架构:服务中台与数据中台全拆解

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华