简介:这是一份以计算机网络技术基础为主题的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, TLS | URL、域名、状态码 | 进程与进程 |
| 传输层 | 段 | TCP, UDP | 源端口、目的端口、序列号 | 端口与端口 |
| 网络层 | 包 | IP, ICMP | 源 IP、目的 IP、TTL | 主机与主机 |
| 链路层 | 帧 | Ethernet, ARP | MAC 地址、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", 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_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 +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,去调整交换机或云上安全组的配置。排查到这一步,计算机网络技术基础里的每一个概念都在命令里有了回声,剩下的事情就是把输出读准。
本文还有配套的精品资源,点击获取