ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

一张图看懂计算机网络协议:从分层模型到排查实战

一张图看懂计算机网络协议:从分层模型到排查实战 很多朋友在学网络知识时最头疼的不是某一个协议有多难而是协议数量太多不知道它们各自属于哪一层也不知道报文格式长什么样更不清楚出了问题该用什么命令去排查。本文整理了一张相对完整的“计算机网络协议地图”从上到下覆盖数据链路层、网络层、传输层和应用层把每层的主要协议、报文格式、核心功能以及对应的排查命令串成一条线。建议先收藏再花 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发送方网卡的物理地址类型/长度20x0800 表示上层为 IPv40x86DD 表示 IPv6数据46-1500上层协议数据单元如 IP 数据报帧校验序列4CRC 校验结果用于差错检测MAC 地址是网卡出厂时烧录的物理地址全球唯一从厂商角度说可保证唯一性。它只在同一链路内有意义跨网络转发时帧头会被不断替换。2.3 ARP 协议与 MAC 地址解析ARPAddress 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首部长度4IP 首部长度单位是 4 字节服务类型8区分优先级、延迟、吞吐量等总长度16IP 数据报总长度单位是字节标识16分片时用于重组标志3是否允许分片、是否还有分片片偏移13分片在原报文中的偏移位置生存时间 TTL8每经过一个路由器减 1为 0 时丢弃协议8上层协议类型6TCP17UDP1ICMP首部校验和16只校验 IP 首部源 IP 地址32发送方 IP目的 IP 地址32接收方 IPTTL 字段非常关键。它防止数据报在网络中无限循环。执行 ping 时TTL 还能帮我们初步判断目标主机的操作系统类型例如 Windows 默认 TTL 通常是 128Linux 通常是 64。3.3 IPv6 与 ICMPIPv6 是为解决 IPv4 地址枯竭而设计的下一代协议地址长度为 128 位不再需要 NAT 也能实现全球唯一寻址。IPv6 报文头比 IPv4 更简洁固定为 40 字节并且取消了首部校验和减轻了路由器处理压力。ICMPInternet 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。特性TCPUDP连接状态面向连接无连接可靠性可靠传输尽最大努力交付传输效率较低较高数据边界字节流无边界数据报有边界典型应用HTTP、FTP、SMTPDNS、视频通话、游戏4.2 TCP 报文段格式TCP 报文段格式是面试和排错中绕不开的重点字段长度位说明源端口16发送方端口号目的端口16接收方端口号序号32本报文段数据首字节的序号确认号32期望收到对方下一个字节的序号数据偏移4TCP 首部长度保留6保留字段标志位6URG、ACK、PSH、RST、SYN、FIN窗口16接收窗口大小用于流量控制校验和16覆盖首部和数据的校验值紧急指针16配合 URG 使用六个标志位是最常见的考点SYN同步序号用于建立连接。ACK确认应答。FIN释放连接。RST重置连接。PSH立即上交应用层。URG紧急数据。4.3 三次握手与四次挥手TCP 建立连接通过三次握手完成目的是让双方都确认自己和对方的收发能力正常。三次握手过程客户端发送 SYN1Seqx。服务端回复 SYN1ACK1SeqyAckx1。客户端发送 ACK1Seqx1Acky1。连接建立后双方进入数据传送阶段。断开连接时使用四次挥手因为 TCP 是全双工通信每一方都需要单独关闭发送通道。四次挥手过程主动方发送 FIN1Sequ。被动方回复 ACK1Acku1。被动方发送 FIN1Seqw。主动方回复 ACK1Ackw1。排错时观察 TCP 状态很有用常用的状态有 LISTEN、SYN_SENT、ESTABLISHED、TIME_WAIT、CLOSE_WAIT。比如大量 CLOSE_WAIT 连接堆积通常说明服务端代码没有正确关闭 Socket。4.4 UDP 数据报格式UDP 首部非常简单只有 8 字节字段长度位说明源端口16可选无用时为 0目的端口16目标端口长度16UDP 数据报总长度校验和16可选校验优点是开销小、实时性好适合 DNS 查询、RTP 音视频流、在线游戏等场景。但它不保证数据一定到达也不保证到达顺序所以上层应用需要自己做容错处理。4.5 TLS 安全传输层TCP 之上的一层安全能力TLSTransport Layer Security常被称为安全传输层协议但它不是替代 TCP 的传输层协议而是位于应用层与传输层之间用于在两个通信应用程序之间提供保密性和数据完整性。HTTPS 实际上就是 HTTP over TLS。TLS 要解决三个问题机密性使用对称加密加密业务数据。完整性使用 MAC 或 HMAC 校验数据是否被篡改。身份认证使用数字证书确认服务器身份。一次简化的 TLS 握手流程如下客户端发送 ClientHello包含支持的 TLS 版本、加密套件列表和随机数。服务端回复 ServerHello选定加密套件和协议版本并发送证书。客户端验证证书合法性生成预主密钥用服务器公钥加密后发送。双方根据预主密钥生成会话密钥后续通信全部加密。现在的线上业务基本都要求全站 HTTPS。如果开发中用抓包工具查看 HTTP 明文流量没问题但浏览器地址栏没有小锁就要检查证书链是否完整、域名是否匹配、TLS 版本是否过旧。5. 应用层面向用户的服务协议5.1 应用层的作用应用层离用户最近定义了应用程序之间通信的数据格式和交互规则。我们平时说的“接口开发”“API 对接”本质上是基于某种应用层协议的数据约定。应用层协议种类非常多下面挑几个最常用的展开。5.2 DNS 域名解析DNSDomain Name System域名系统负责把人类易记的域名转换成机器可读的 IP 地址。常见的 DNS 记录类型类型说明A域名指向 IPv4 地址AAAA域名指向 IPv6 地址CNAME域名别名指向另一个域名MX邮件交换记录NS指定域名服务器TXT任意文本记录常用于域名验证常用的 DNS 排查命令# 查询 A 记录 nslookup www.baidu.com # 查询 AAAA 记录 nslookup -typeAAAA www.baidu.com # Linux 下也可以使用 dig dig www.baidu.com如果浏览器提示“无法解析服务器的 DNS 地址”可以先检查本机 DNS 配置再尝试更换公共 DNS。5.3 HTTP/HTTPS 协议HTTP 是 Web 世界的基础协议基于请求-响应模型。一个 HTTP 请求包含请求行、请求头和请求体响应则包含状态行、响应头和响应体。HTTP 状态码要理解语义状态码含义典型场景200请求成功页面正常返回301永久重定向HTTP 跳转 HTTPS302临时重定向登录后跳转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 与 SSHDHCPDynamic 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检查解析结果更换公共 DNSTCP 连接建立失败目标端口未监听或被防火墙拦截使用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 请求也要关注。把每一次踩坑的报文和排查过程记录下来慢慢就会形成属于自己的“协议地图”。下次再遇到类似的超时、丢包、连接异常一眼就能看出来问题出在哪一层。
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表