很多朋友在学网络知识时,最头疼的不是某一个协议有多难,而是协议数量太多,不知道它们各自属于哪一层,也不知道报文格式长什么样,更不清楚出了问题该用什么命令去排查。
本文整理了一张相对完整的“计算机网络协议地图”,从上到下覆盖数据链路层、网络层、传输层和应用层,把每层的主要协议、报文格式、核心功能以及对应的排查命令串成一条线。建议先收藏,再花 20 分钟通读一遍,之后无论是应付面试、做网络实验,还是排查线上连通性问题,都可以直接回到这篇文章里查。
1. 为什么需要一张“协议地图”
1.1 计算机通信的复杂性
两台设备要完成一次通信,其实非常复杂。比如你用浏览器访问一个网站,背后至少包含:
- 把域名解析成 IP 地址。
- 建立 TCP 连接。
- 发送 HTTP 请求。
- 经过路由器逐跳转发。
- 最终把数据交给目标服务器的应用进程。
如果所有逻辑都写在一个协议里,这个协议会非常臃肿,而且很难扩展。所以计算机网络采用了分层的设计思路,每一层专注解决一类问题,层与层之间通过标准接口协作。
1.2 分层模型:OSI 与 TCP/IP
说到分层,最经典的是 OSI 七层模型,但实际互联网采用的是 TCP/IP 四层模型。两者对应关系如下:
| OSI 七层模型 | TCP/IP 四层模型 | 典型协议示例 |
|---|---|---|
| 应用层 | 应用层 | HTTP、HTTPS、DNS、FTP、SMTP、SSH |
| 表示层 | 应用层 | TLS/SSL(加密与数据完整性) |
| 会话层 | 应用层 | RPC、会话管理 |
| 传输层 | 传输层 | TCP、UDP |
| 网络层 | 网络层 | IP、ICMP、OSPF、BGP |
| 数据链路层 | 数据链路层 | 以太网、ARP、VLAN |
| 物理层 | 数据链路层 | 网线、光纤、Wi-Fi 物理信号 |
学习时不必纠结 OSI 的表示层和会话层,TCP/IP 模型已经把它们合并进应用层。重点要掌握的是:从上往下,数据一层层封装;从下往上,数据一层层解封装。
1.3 数据封装与解封装
一个 HTTP 请求从应用层出发,会经历这样的过程:
- 应用层生成 HTTP 报文。
- 传输层添加 TCP 头,形成 TCP 报文段。
- 网络层添加 IP 头,形成 IP 数据报。
- 数据链路层添加以太网帧头和帧尾,形成数据帧。
- 物理层把数据帧转换为比特流,通过介质传输。
接收方则反向操作,逐层去掉头部,最终把 HTTP 报文交给应用程序。
这个过程称为封装与解封装。理解它之后,再看每一层的报文格式,就不会感到孤立。
2. 数据链路层:数据帧的起点
2.1 链路层的作用
数据链路层解决的是“同一段物理链路内,设备之间如何传输数据单元”的问题。它把网络层交下来的 IP 数据报封装成帧,在相邻节点之间传输,同时负责差错检测。
链路层的核心包括:
- 帧的封装与拆封。
- MAC 地址寻址。
- 差错检测(帧校验)。
- 介质访问控制(如以太网的 CSMA/CD 和无线网络的 CSMA/CA)。
2.2 以太网帧格式
以太网是使用最广泛的链路层技术。标准的以太网帧格式如下:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 目的 MAC 地址 | 6 | 接收方网卡的物理地址 |
| 源 MAC 地址 | 6 | 发送方网卡的物理地址 |
| 类型/长度 | 2 | 0x0800 表示上层为 IPv4,0x86DD 表示 IPv6 |
| 数据 | 46-1500 | 上层协议数据单元(如 IP 数据报) |
| 帧校验序列 | 4 | CRC 校验结果,用于差错检测 |
MAC 地址是网卡出厂时烧录的物理地址,全球唯一(从厂商角度说可保证唯一性)。它只在同一链路内有意义,跨网络转发时,帧头会被不断替换。
2.3 ARP 协议与 MAC 地址解析
ARP(Address Resolution Protocol,地址解析协议)用于根据 IP 地址获取同一链路内的 MAC 地址。
假设主机 A 知道目标主机 B 的 IP 是 192.168.1.10,但不知道 B 的 MAC 地址,A 会广播一个 ARP 请求:“谁是 192.168.1.10,请告诉我你的 MAC 地址。”B 收到后回复单播 ARP 响应,A 将结果写入本机 ARP 缓存。
在命令行执行arp -a可以查看本机 ARP 缓存表:
arp -a输出类似:
接口: 192.168.1.100 --- 0x9 Internet 地址 物理地址 类型 192.168.1.1 a4-2b-b0-xx-xx-xx 动态 192.168.1.10 68-9e-xx-xx-xx-xx 动态这里192.168.1.1通常是网关 IP,对应的是网关设备的 MAC 地址。注意,即使目标服务器在公网,报文要发送出去,也必须先找到下一跳网关的 MAC 地址。
2.4 链路层常用命令
Windows 与 Linux 下查看链路层信息的命令略有差别,但最常用的是:
# Windows 查看网卡信息,包含 MAC 地址和 IP 地址 ipconfig /all # Linux 查看网卡信息 ip link show # 查看 ARP 缓存 arp -a # 清除 ARP 缓存(需要管理员权限) arp -d *如果同一局域网内两台主机 ping 不通,第一步就应该检查 IP 是否在同一网段,第二步检查 ARP 是否能解析到对端 MAC。
3. 网络层:跨网络的路径规划
3.1 网络层的作用
网络层解决的是“数据如何从源网络到达目的网络”的问题。它不关心具体哪台主机,而是通过 IP 地址标识主机所在的位置,并通过路由协议选择最佳路径。
网络层的核心功能:
- IP 地址编址与子网划分。
- 路由选择。
- 分组转发。
- 拥塞控制(辅助性)。
3.2 IPv4 报文格式
IPv4 是当前使用最广泛的网络层协议。它的报文格式需要重点掌握:
| 字段 | 长度(位) | 说明 |
|---|---|---|
| 版本 | 4 | 固定为 4,表示 IPv4 |
| 首部长度 | 4 | IP 首部长度,单位是 4 字节 |
| 服务类型 | 8 | 区分优先级、延迟、吞吐量等 |
| 总长度 | 16 | IP 数据报总长度,单位是字节 |
| 标识 | 16 | 分片时用于重组 |
| 标志 | 3 | 是否允许分片、是否还有分片 |
| 片偏移 | 13 | 分片在原报文中的偏移位置 |
| 生存时间 TTL | 8 | 每经过一个路由器减 1,为 0 时丢弃 |
| 协议 | 8 | 上层协议类型,6=TCP,17=UDP,1=ICMP |
| 首部校验和 | 16 | 只校验 IP 首部 |
| 源 IP 地址 | 32 | 发送方 IP |
| 目的 IP 地址 | 32 | 接收方 IP |
TTL 字段非常关键。它防止数据报在网络中无限循环。执行 ping 时,TTL 还能帮我们初步判断目标主机的操作系统类型,例如 Windows 默认 TTL 通常是 128,Linux 通常是 64。
3.3 IPv6 与 ICMP
IPv6 是为解决 IPv4 地址枯竭而设计的下一代协议,地址长度为 128 位,不再需要 NAT 也能实现全球唯一寻址。IPv6 报文头比 IPv4 更简洁,固定为 40 字节,并且取消了首部校验和,减轻了路由器处理压力。
ICMP(Internet Control Message Protocol,互联网控制报文协议)是网络层的辅助协议,用于传递差错信息和控制信息。比如:
- 目标不可达。
- 超时。
- 重定向。
- Echo 请求与应答(ping 命令的基础)。
ping 命令实际发送的就是 ICMP Echo Request,收到 ICMP Echo Reply 就说明目标可达。
3.4 路由协议与常用命令
路由协议按工作范围分为:
- 内部网关协议:RIP、OSPF、IS-IS。
- 外部网关协议:BGP。
它们本质上是在路由器之间交换路由信息,帮助路由器构建路由表。实际排错时,我们更关注的是本机路由表和连通性命令:
# Windows 查看路由表 route print # Linux 查看路由表 ip route show # ping 测试连通性 ping -c 4 www.baidu.com # 跟踪路由路径,确认经过哪些中间节点 tracert www.baidu.com # Windows traceroute www.baidu.com # Linux如果ping通但业务访问失败,问题可能不在网络层,而在传输层或应用层。
4. 传输层:端到端的可靠与高效
4.1 传输层的作用
传输层是网络通信中承上启下的关键一层。它负责端口寻址、分段重组、连接管理和可靠传输,为上层应用提供端到端的通信服务。
传输层最核心的两个协议是 TCP 和 UDP。
| 特性 | TCP | UDP |
|---|---|---|
| 连接状态 | 面向连接 | 无连接 |
| 可靠性 | 可靠传输 | 尽最大努力交付 |
| 传输效率 | 较低 | 较高 |
| 数据边界 | 字节流,无边界 | 数据报,有边界 |
| 典型应用 | HTTP、FTP、SMTP | DNS、视频通话、游戏 |
4.2 TCP 报文段格式
TCP 报文段格式是面试和排错中绕不开的重点:
| 字段 | 长度(位) | 说明 |
|---|---|---|
| 源端口 | 16 | 发送方端口号 |
| 目的端口 | 16 | 接收方端口号 |
| 序号 | 32 | 本报文段数据首字节的序号 |
| 确认号 | 32 | 期望收到对方下一个字节的序号 |
| 数据偏移 | 4 | TCP 首部长度 |
| 保留 | 6 | 保留字段 |
| 标志位 | 6 | URG、ACK、PSH、RST、SYN、FIN |
| 窗口 | 16 | 接收窗口大小,用于流量控制 |
| 校验和 | 16 | 覆盖首部和数据的校验值 |
| 紧急指针 | 16 | 配合 URG 使用 |
六个标志位是最常见的考点:
- SYN:同步序号,用于建立连接。
- ACK:确认应答。
- FIN:释放连接。
- RST:重置连接。
- PSH:立即上交应用层。
- URG:紧急数据。
4.3 三次握手与四次挥手
TCP 建立连接通过三次握手完成,目的是让双方都确认自己和对方的收发能力正常。
三次握手过程:
- 客户端发送 SYN=1,Seq=x。
- 服务端回复 SYN=1,ACK=1,Seq=y,Ack=x+1。
- 客户端发送 ACK=1,Seq=x+1,Ack=y+1。
连接建立后,双方进入数据传送阶段。断开连接时使用四次挥手,因为 TCP 是全双工通信,每一方都需要单独关闭发送通道。
四次挥手过程:
- 主动方发送 FIN=1,Seq=u。
- 被动方回复 ACK=1,Ack=u+1。
- 被动方发送 FIN=1,Seq=w。
- 主动方回复 ACK=1,Ack=w+1。
排错时观察 TCP 状态很有用,常用的状态有 LISTEN、SYN_SENT、ESTABLISHED、TIME_WAIT、CLOSE_WAIT。比如大量 CLOSE_WAIT 连接堆积,通常说明服务端代码没有正确关闭 Socket。
4.4 UDP 数据报格式
UDP 首部非常简单,只有 8 字节:
| 字段 | 长度(位) | 说明 |
|---|---|---|
| 源端口 | 16 | 可选,无用时为 0 |
| 目的端口 | 16 | 目标端口 |
| 长度 | 16 | UDP 数据报总长度 |
| 校验和 | 16 | 可选校验 |
优点是开销小、实时性好,适合 DNS 查询、RTP 音视频流、在线游戏等场景。但它不保证数据一定到达,也不保证到达顺序,所以上层应用需要自己做容错处理。
4.5 TLS 安全传输层:TCP 之上的一层安全能力
TLS(Transport Layer Security)常被称为安全传输层协议,但它不是替代 TCP 的传输层协议,而是位于应用层与传输层之间,用于在两个通信应用程序之间提供保密性和数据完整性。HTTPS 实际上就是 HTTP over TLS。
TLS 要解决三个问题:
- 机密性:使用对称加密加密业务数据。
- 完整性:使用 MAC 或 HMAC 校验数据是否被篡改。
- 身份认证:使用数字证书确认服务器身份。
一次简化的 TLS 握手流程如下:
- 客户端发送 ClientHello,包含支持的 TLS 版本、加密套件列表和随机数。
- 服务端回复 ServerHello,选定加密套件和协议版本,并发送证书。
- 客户端验证证书合法性,生成预主密钥,用服务器公钥加密后发送。
- 双方根据预主密钥生成会话密钥,后续通信全部加密。
现在的线上业务基本都要求全站 HTTPS。如果开发中用抓包工具查看 HTTP 明文流量没问题,但浏览器地址栏没有小锁,就要检查证书链是否完整、域名是否匹配、TLS 版本是否过旧。
5. 应用层:面向用户的服务协议
5.1 应用层的作用
应用层离用户最近,定义了应用程序之间通信的数据格式和交互规则。我们平时说的“接口开发”“API 对接”,本质上是基于某种应用层协议的数据约定。
应用层协议种类非常多,下面挑几个最常用的展开。
5.2 DNS 域名解析
DNS(Domain Name System,域名系统)负责把人类易记的域名转换成机器可读的 IP 地址。
常见的 DNS 记录类型:
| 类型 | 说明 |
|---|---|
| A | 域名指向 IPv4 地址 |
| AAAA | 域名指向 IPv6 地址 |
| CNAME | 域名别名,指向另一个域名 |
| MX | 邮件交换记录 |
| NS | 指定域名服务器 |
| TXT | 任意文本记录,常用于域名验证 |
常用的 DNS 排查命令:
# 查询 A 记录 nslookup www.baidu.com # 查询 AAAA 记录 nslookup -type=AAAA www.baidu.com # Linux 下也可以使用 dig dig www.baidu.com如果浏览器提示“无法解析服务器的 DNS 地址”,可以先检查本机 DNS 配置,再尝试更换公共 DNS。
5.3 HTTP/HTTPS 协议
HTTP 是 Web 世界的基础协议,基于请求-响应模型。一个 HTTP 请求包含请求行、请求头和请求体,响应则包含状态行、响应头和响应体。
HTTP 状态码要理解语义:
| 状态码 | 含义 | 典型场景 |
|---|---|---|
| 200 | 请求成功 | 页面正常返回 |
| 301 | 永久重定向 | HTTP 跳转 HTTPS |
| 302 | 临时重定向 | 登录后跳转 |
| 404 | 资源不存在 | 路径写错 |
| 500 | 服务器内部错误 | 后端代码异常 |
| 502 | 网关错误 | Nginx 后无可用服务 |
| 504 | 网关超时 | 接口响应超时 |
常用的 HTTP 调试命令是 curl:
# 查看响应头 curl -I https://www.baidu.com # 查看完整请求与响应 curl -v https://www.baidu.com # 指定请求方法并传递 JSON curl -X POST https://api.example.com/login \ -H "Content-Type: application/json" \ -d '{"username":"admin","password":"123456"}'5.4 文件与邮件协议
FTP 用于文件传输,使用 20 端口传数据、21 端口传控制命令。不过因为明文传输,现在很多场景已经改用 SFTP。
邮件相关协议:
- SMTP:发送邮件,25 端口。
- POP3:收取邮件,110 端口。
- IMAP:同步邮件,143 端口。
如果做应用层开发,邮件系统通常用 SMTP 发送、IMAP 同步,很少再用 POP3。
5.5 DHCP 与 SSH
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)自动分配 IP 地址、子网掩码、网关和 DNS。新设备接入局域网后,先广播 DHCP Discover,再由 DHCP 服务器提供配置。
SSH 是远程登录的事实标准,默认端口 22,使用非对称加密完成认证和会话密钥协商。日常开发中,通过 SSH 登录服务器执行命令是最常见的操作。
在嵌入式、车载通信、工业控制等“应用层开发”场景中,协议的分层思想同样适用。比如车辆 EMB 制动系统开发中,CAN/LIN 等总线负责底层信号传输,应用层则负责把信号解析成具体的制动请求和执行反馈。无论底层介质怎么变,上层协议的设计仍然遵循分层、封装、可靠性与实时性权衡的思路。
6. 协议排查实战:从应用层下钻到链路层
6.1 一次完整的 HTTP 访问流程
假设你的电脑要访问https://www.example.com,数据包要经历的完整过程是:
- 应用层:浏览器发起 HTTPS 请求,完成 DNS 解析得到 IP。
- 传输层:与目标服务器建立 TCP 连接,随后完成 TLS 握手。
- 网络层:封装 IP 头,查询路由表找到下一跳地址。
- 数据链路层:通过 ARP 获取下一跳 MAC 地址,封装帧头。
- 物理层:转换为比特流发送出去。
返回数据时,服务器端同样逐层封装,最终浏览器渲染页面。
6.2 常用网络命令组合
排查网络问题,建议按从下到上的顺序执行命令:
| 排查目标 | 命令 | 说明 |
|---|---|---|
| 网卡是否正常 | ipconfig /all或ip link | 确认 IP、掩码、网关 |
| 局域网是否连通 | ping 网关IP | 确认链路层和网络层正常 |
| 公网是否连通 | ping 公网IP | 排除 DNS 干扰 |
| 域名解析是否正常 | nslookup 域名 | 检查 DNS 解析结果 |
| 端口是否可达 | telnet 目标IP 端口 | 检查 TCP 层连通性 |
| 路由是否正常 | tracert 目标IP | 定位丢包和延迟节点 |
| 本机连接状态 | netstat -an | 查看端口监听和连接状态 |
在 Linux/macOS 下,telnet可能未安装,可以使用:
nc -vz 目标IP 端口6.3 Wireshark 报文过滤基本用法
Wireshark 是最好的协议学习工具,没有之一。抓包后,可以通过过滤表达式快速定位:
# 只看某个 IP 的流量 ip.addr == 192.168.1.10 # 只看 TCP 端口 80 的流量 tcp.port == 80 # 看 HTTP 请求 http.request # 看 DNS 查询 dns.flags.response == 0 # 看 TCP 握手包 tcp.flags.syn == 1 && tcp.flags.ack == 0抓包是理解报文格式最直观的方式。比如在浏览器访问一个网站,同时用 Wireshark 过滤tcp.port == 443,就能亲眼看到 TCP 三次握手的三个报文,以及 TLS 握手的 ClientHello、ServerHello 等记录。
7. 常见问题与排查表格
下面整理了一些实际排错中高频出现的问题:
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
| 局域网内 ping 不通 | IP 不在同一网段,或 ARP 解析失败 | 检查子网掩码与网关,执行arp -a确认 MAC 是否正常 |
| 公网 IP 能 ping 通,域名访问失败 | DNS 配置错误 | 执行nslookup检查解析结果,更换公共 DNS |
| TCP 连接建立失败 | 目标端口未监听,或被防火墙拦截 | 使用netstat -an查看端口监听,用telnet或nc测试端口连通性 |
| 访问网页出现 502 | 后端服务宕机或网关配置错误 | 检查 Nginx 上游配置,确认后端进程存活 |
| 大量 TIME_WAIT 连接 | 短连接频繁建立 | 开启连接复用,或改用长连接 |
| HTTPS 证书报错 | 证书过期、域名不匹配、链不完整 | 检查证书有效期与 SAN 字段,补齐中间证书 |
| 视频通话卡顿 | UDP 丢包或带宽不足 | 检查网络延迟和丢包率,考虑 QoS 策略 |
| 服务端大量 CLOSE_WAIT | 应用未正确关闭 Socket | 检查代码连接释放逻辑,限制连接空闲时间 |
遇到问题不要急着看代码。先确认网络几层分别是否正常,再把范围缩小到具体某一层,很多疑难问题都能快速定位。
8. 最佳实践与工程建议
8.1 设计上:遵循分层,但不死守分层
协议分层是学习和排查的框架,但实际工程中会有一些跨层优化。例如 TLS 位于应用层和传输层之间,CDN 会在网络层或应用层做加速,HTTP/3 直接把传输层换成了基于 UDP 的 QUIC。
理解分层之后,要懂得在合适的位置做优化:
- 高频小数据包:优先考虑 UDP,减少握手开销。
- 电商交易、转账类接口:必须用 TCP,必要时引入分布式事务。
- 音视频传输:考虑 UDP 加 FEC 前向纠错,或使用 WebRTC。
- 接口调用链冗长:考虑 HTTP/2 多路复用或升级 HTTP/3。
8.2 排错上:先分层,再定位
建立一套自己的排错顺序:
- 先看应用层:日志有没有报错,接口返回什么状态码。
- 再看传输层:端口通不通,TCP 状态正不正常。
- 然后看网络层:路由表对不对,TTL 是不是消耗完。
- 最后看链路层:ARP 有没有解析成功,网卡是否异常。
每次都按这个顺序走,能避免在错误的方向上浪费时间。
8.3 安全上:最小权限与加密
网络层到应用层每一层都存在安全风险:
- 链路层:注意 ARP 欺骗,重要网络建议开启端口安全和 DHCP Snooping。
- 网络层:合理规划 ACL,限制不必要的入站和出站流量。
- 传输层:线上服务尽量使用 TLS 1.2 以上版本,关闭弱加密套件。
- 应用层:对所有用户输入做校验,防止注入类攻击。
在生产环境修改防火墙规则、路由表、ACL 之前,一定要先备份原配置,评估影响范围,并在测试环境验证。操作过程遵循最小权限原则,避免在业务高峰期做高风险变更。
8.4 抓包习惯:保留现场
定位复杂网络问题时,抓包是最有力的证据。建议:
- 抓包时同时抓客户端和服务端两侧,方便对比。
- 保存抓包文件时带上时间点和问题描述。
- 用 Wireshark 的 Follow TCP Stream 功能查看完整会话。
- 不要只抓业务端口,DNS 查询、ARP 请求也要关注。
把每一次踩坑的报文和排查过程记录下来,慢慢就会形成属于自己的“协议地图”。下次再遇到类似的超时、丢包、连接异常,一眼就能看出来问题出在哪一层。