互联网层级

September 25, 2026 in 计算机与网络 5 minutes

介绍互联网层级的基础知识

网络分层模型与协议

互联网能跑起来,靠的不是某个“超级协议”,而是一套分工明确的分层体系。每层只解决一类问题,只和上下两层打交道,对等层之间用统一的格式对话。这种设计让“换掉底层技术不影响上层应用”成为可能——比如把网线换成 Wi-Fi、把 HTTP 换成 HTTP/3,其他层几乎不用改。

先搞清三套模型,别混着说

模型 层级 定位
OSI 七层模型 物理层→数据链路层→网络层→传输层→会话层→表示层→应用层 ISO 提出的理论参考模型,教科书标准,实际产品没按它实现
TCP/IP 四层模型 网络接口层→网际层→传输层→应用层 真实互联网的架构,RFC 1122 定义
五层教学模型 物理层→数据链路层→网络层→传输层→应用层 把 OSI 下三层 + TCP/IP 上两层结合,国内教材最常用

理解这三者的关系很重要:OSI 是地图,TCP/IP 是实际修的路。日常讨论中大家说的“网络层”“传输层”名称来自 OSI,而具体协议(IP、TCP、HTTP)属于 TCP/IP 体系。

另外有个工程上的补充:**“2.5 层”**的说法,指 MPLS、VXLAN、GRE 这类隧道技术——它们夹在二层和三层之间,既不是纯 MAC 转发也不是纯 IP 路由。

逐层拆解

第 1 层:物理层(Physical Layer)

要解决的问题:比特怎么变成电信号、光信号或无线电波传出去。它不关心“这是什么数据”,只关心电压高低、光脉冲有无、频率相位、引脚定义、时钟同步。

典型协议 / 标准:

  • 有线:以太网物理层标准(1000BASE-T、10GBASE-SR/LR)、RS-232 串口、DSL、PON(GPON/EPON)
  • 无线:IEEE 802.11 a/b/g/n/ac/ax 的物理层调制(OFDM、QAM)、4G/5G 空口物理层
  • 介质:双绞线(Cat5e/Cat6)、同轴电缆、单模/多模光纤

特点:

  • 数据单位是 bit(比特),没有“帧”“包”的概念。
  • 纯硬件范畴,涉及网卡 PHY 芯片、光模块、集线器(Hub)、中继器。
  • 只提供原始比特流传输,不检错、不重传、不寻址——出错留给上层处理。
  • 关键参数:带宽、波特率、信噪比、衰减、双工方式(半双工/全双工)。

要解决的问题:在同一个局域网(同一广播域)内,把比特组装成帧,用 MAC 地址找到下一跳,并做差错检测。

再细分两个子层:LLC(逻辑链路控制,做复用/流控)+ MAC(介质访问控制,做寻址与信道竞争)。

典型协议:

协议 说明
以太网 IEEE 802.3 绝对主流。帧结构:前导码 + 目的MAC(6B) + 源MAC(6B) + 类型/长度 + 数据(46~1500B) + FCS校验。MTU 默认 1500 字节
802.1Q VLAN 在以太网帧里插 4 字节 VLAN Tag,实现逻辑隔离
ARP IP 地址 → MAC 地址映射(严格说跨二三层,常叫“2.5层”)
PPP / HDLC 点对点链路,早期拨号上网、路由器串口互联用
Wi-Fi 802.11 MAC 多了 CSMA/CA(碰撞避免)、ACK 确认、重传机制
STP/RSTP 802.1D 生成树协议,防二层环路
LACP 802.3ad 链路聚合,多条物理链路绑成一条逻辑链路

特点:

  • 数据单位是 Frame(帧)。
  • 寻址靠 MAC 地址(48 位,扁平、不可路由、出厂烧录),只能在本广播域内有效。
  • 用 FCS/CRC 校验检错,错了就丢(以太网不重传,Wi-Fi 会重传)。
  • 交换机工作在二层:靠 MAC 地址表自学习转发,隔离冲突域但不隔离广播域。
  • 这一层的关键词:广播域、冲突域、VLAN、二层环路、MAC 表泛洪。
第 3 层:网络层(Network Layer)

要解决的问题:跨越多个网络,把数据包从源主机送到目的主机。核心是三件事:寻址、路由、分片。

典型协议:

协议 作用 特点
IPv4 主协议,32 位地址,约 43 亿个,点分十进制 无连接、尽力而为、首部 20B(含选项最长 60B),有分片字段,靠 TTL 防环
IPv6 接替 IPv4,128 位地址 首部固定 40B、简化了头部、无分片(由端侧 PMTUD 处理)、原生支持 IPSec、取消广播改用组播
ICMP 诊断与差错报告 ping、traceroute 都靠它;包含“目标不可达”“超时”“重定向”等报文类型
IGMP IPv4 组播组成员管理 加入/离开组播组
RIP 距离向量路由协议 基于跳数,最大 15 跳,收敛慢,已淘汰
OSPF 链路状态内部网关协议 Dijkstra 最短路径树,分 Area,收敛快,企业网主流
IS-IS 链路状态,运营商骨干常用 跑在数据链路层之上,扩展性好
BGP 外部网关协议,互联网的“ glue ” 基于 TCP 179 端口,路径向量,策略驱动(AS-PATH、LOCAL_PREF),全球约 90 万条路由表项
NAT 地址转换 缓解 IPv4 枯竭,副作用是破坏端到端性、P2P 穿透困难
IPsec 网络层加密认证(AH/ESP) 传输模式/隧道模式,常用于站点到站点 VPN
MPLS 标签交换 靠 Label 转发而非查 IP 表,支持 TE、VPN,运营商骨干核心

特点:

  • 数据单位是 Packet(包/分组),IP 层叫 Datagram。
  • IP 本身不可靠:不保证送达、不保证顺序、不保证不重复——可靠性交给传输层(TCP)。这是互联网设计的核心哲学:端到端原则,网络核心保持简单智能放在边缘。
  • **TTL(生存时间)**每过一跳减 1,归零丢弃,防止路由环路无限兜圈。
  • 分片与重组:当包大于链路 MTU 时切分(IPv6 取消中间节点分片,改由源端做路径 MTU 发现)。
  • 路由器工作在这一层:查路由表做最长前缀匹配转发,隔离广播域。
第 4 层:传输层(Transport Layer)

要解决的问题:进程到进程的通信(主机到主机是 IP 干的),加上可靠性、流量控制、拥塞控制、多路复用。

典型协议:

协议 特点 典型场景
TCP 面向连接、可靠、字节流、全双工、有拥塞控制 Web、邮件、文件传输,占互联网流量大头
UDP 无连接、不可靠、尽最大努力、开销小(首部仅 8B) DNS、视频直播、VoIP、游戏、QUIC 底座
SCTP 多宿主、多流、面向消息 电信信令(SIGTRAN),小众
QUIC (HTTP/3) 跑在 UDP 之上,内置 TLS 1.3、0-RTT、队头阻塞解耦、连接迁移 Chrome/YouTube 默认,HTTP/3 标配
DCCP 带拥塞控制的不可靠传输 极少用

TCP 的关键机制(面试高频):

  • 三次握手建立连接(SYN/SYN-ACK/ACK),四次挥手断开(FIN/ACK ×2)。TIME_WAIT 状态等 2MSL 是为了让旧报文在网络里自然消亡。
  • 序列号 + 确认号 + 累积 ACK实现可靠传输;丢包靠超时重传 + 快速重传(3 个重复 ACK)。
  • 滑动窗口做流量控制(接收方通告 rwnd)。
  • 拥塞控制:慢启动、拥塞避免、快重传、快恢复;算法演进 Reno → Cubic → BBR(基于带宽探测,Google 系主流)。
  • Nagle 算法合并小报文,Delayed ACK延迟确认,两者相遇可能产生 40ms 延迟。
  • 首部最小 20B,通过**端口号(16 位,065535)**区分进程:01023 知名端口(80/443/22/53),102449151 注册端口,4915265535 动态端口。
第 5 层:会话层(Session Layer)& 第 6 层:表示层(Presentation Layer)

这两层在 TCP/IP 体系里没有独立实现,功能被并进了应用层,但概念依然有用:

  • 会话层:建立、管理、终止会话,同步点、断点续传。对应技术:RPC 会话、NetBIOS、PPTP、TLS 握手建立的会话(Session ID / Session Ticket 复用)。
  • 表示层:数据格式翻译、加密解密、压缩解压。对应技术:TLS/SSL(加密)、JPEG/PNG/H.264(编码)、ASCII/Unicode/UTF-8(字符集)、XDR/Protobuf/JSON(序列化)、MIME/Base64。

⚠️ 一个常见误区:TLS 不是应用层协议。它在传输层和应用层之间,给上层提供安全通道,对应 OSI 的表示层/会话层。所以准确说法是 HTTPS = HTTP over TLS over TCP。

第 7 层:应用层(Application Layer)

要解决的问题:应用程序之间的语义交互,即“数据长什么样、什么意思”。

主流协议一览:

协议 端口 特点
HTTP/1.1 80 文本协议、持久连接、管道化效果差、队头阻塞
HTTP/2 443 二进制分帧、多路复用、头部压缩 HPACK、服务端推送
HTTP/3 443/UDP 基于 QUIC,彻底解决 TCP 队头阻塞,弱网表现好
DNS 53(UDP/TCP) 域名→IP,层次化树状命名空间,递归+迭代查询,有缓存与 TTL,是互联网的“电话簿”也是单点故障风险点
DHCP 67/68 自动分配 IP/掩码/网关/DNS,DORA 四步(Discover-Offer-Request-Ack)
FTP 20/21 控制连接+数据连接双通道,主动/被动模式,明文不安全
SMTP 25/587 发邮件,推模式;POP3(110)/IMAP(143) 收邮件,IMAP 支持服务端多文件夹同步
SSH 22 加密远程登录,替代明文的 Telnet(23)
WebSocket 80/443 HTTP 升级后长连接全双工,推送场景
MQTT 1883/8883 发布/订阅,轻量,IoT 首选
gRPC 任意 HTTP/2 + Protobuf,微服务间 RPC
SNMP 161/162 网络设备管理监控
NTP 123 时间同步,UDP
LDAP 389/636 目录服务、统一身份认证

特点:协议多为请求-响应或发布-订阅语义,数据是人类可读或可序列化的格式,安全性靠下层 TLS 保障。

一次完整的数据流动(封装与解封装)

你在浏览器输入 https://www.example.com 回车:

  1. 应用层:浏览器生成 HTTP GET 请求;先查 DNS(UDP 53)拿到 IP。
  2. 传输层:TCP 三次握手(TLS 握手紧随其后),数据切成段,打上源/目的端口。
  3. 网络层:判断目标是否同网段。不同网段就发给默认网关,封装 IP 头(源/目的 IP、TTL、协议号 6=TCP)。
  4. 链路层:ARP 查询网关 MAC,封装以太网帧(源/目的 MAC、类型 0x0800)。
  5. 物理层:转成电信号/光信号出网卡。
  6. 沿途每跳路由器解封装到三层、查路由表、重新封装二层(MAC 地址每跳都变,IP 地址端到端不变,NAT 场景除外)。
  7. 服务器反向解封装,处理请求,原路返回。

这条链路清晰地体现了分层的核心规律:越往下,作用范围越短(本机→局域网→全网),头部开销越小,语义越简单;越往上,越接近业务,越复杂。


网络设备、易错概念与技术演进

各层对应的硬件设备

层级 设备
一层 网线、光纤、Hub、中继器、光模块
二层 网桥、交换机(Switch)、无线 AP
三层 路由器、三层交换机
四层 四层负载均衡(LVS,基于 IP+Port)、NAT 网关、防火墙
七层 反向代理(Nginx)、WAF、API 网关、CDN 边缘节点

几个容易踩坑的点

  1. ARP 不算纯粹的二层协议——它用以太网帧承载,但内容是 IP→MAC 的映射,为三层服务,所以常被称作“2.5 层”。
  2. MAC 地址 ≠ IP 地址:MAC 扁平、不可路由、本地有效;IP 分层、可聚合、全局可达。这就是为什么需要分层寻址——如果全网靠 MAC 路由,路由表将膨胀到无法维护。
  3. BGP 跑在 TCP 上却是“网络层协议”——协议的“所属层”看它解决什么问题,不看它底下用了什么。同理 OSPF 直接跑在 IP 之上(协议号 89)。
  4. “TCP 可靠、UDP 不可靠”不等于“UDP 不好”。实时音视频宁可丢几帧也不要重传带来的延迟;而且 QUIC 证明了在 UDP 上也能自己实现可靠传输。
  5. HTTPS 的 S 不在应用层——TLS 在传输层与应用层之间。抓包时看到的是 TLS 握手而不是 HTTP 明文。
  6. MTU 问题很隐蔽:1500 字节以太网 MTU + 20B IP + 20B TCP + 20~60B TLS 开销,MSS 大约 1460。VPN、Docker overlay 网络常常因为额外包头导致大包被丢,表现为“能 ping 通但打不开网页”。

现代演进方向(加分项)

  • 协议瘦身与融合:HTTP/3 + QUIC 把 TLS、重传、拥塞控制从内核态移到用户态,绕开操作系统内核的 TCP 栈升级慢的问题。
  • SDN(软件定义网络):把控制平面(路由决策)和数据平面(转发)分离,OpenFlow 协议下发流表,网络可编程。
  • Overlay 网络:VXLAN 把二层帧装进 UDP 包里跨三层传输,是云主机、K8s Pod 网络互通的基础。
  • IPv6 全面铺开:中国 IPv6 活跃用户已超 7 亿,移动网络基本默认 IPv6-only + NAT64/DNS64 过渡。
  • 零信任与 mTLS:身份验证从“网络边界”下沉到“每个服务之间”,服务网格(Istio)在传输层做双向认证。

工控接口、系统设备名与协议识别

核心思路:分三层定位,互相交叉验证。物理接口(哪个孔/哪根线)→ 系统设备名(COM几、ttyUSB几)→ 协议特征(波特率、站号、报文格式)。只靠一层很容易对不上,比如 USB 转串口每次重启 ttyUSB0/1 会漂移,或者一个 RS-485 口上挂了 5 个站号的设备。

先把概念拆开(很多人卡在这里)

概念 是什么 举例
物理接口 机箱上的孔、接线端子 DB9 母头、USB-A、端子排 A/B/GND
系统设备名 OS 给的逻辑名字 COM3、/dev/ttyUSB0、/dev/ttyS0
电气制式 信号怎么跑 RS-232(全双工、±5~15V)、RS-485(半双工差分)、RS-422、TTL
通信协议 数据怎么组织 Modbus RTU、Host Link、MC协议、DF1、自定义ASCII、私有二进制

关键点:一个串口 ≠ 一台设备。RS-485 总线上通常挂一串设备,靠**站号(地址)**区分;而 USB 设备基本是一对一。所以排查时要先分清“这条线上有几个设备”。

协议层验证:确认“这个口连的是不是我要的那台”

知道 COM3 对应某个转换器还不够,得确认它后面挂的是什么、站号多少。

1. 用串口助手逐口试探 Windows 用 Putty/SSCOM/Modbus Poll/QModBus,Linux 用 minicom、screen /dev/ttyUSB0 9600、moserial。先发十六进制再看 ASCII。

2. 波特率盲扫 常见组合:9600/8N1、19200、38400、115200、4800/7E1(老仪表)。收到全是乱码但每帧长度固定 → 大概率波特率错;完全没回音 → 线序/485方向/设备没电。写个脚本轮训所有串口×所有波特率,把有回应的记下来,效率远高于手工。

3. Modbus RTU 站号扫描 对单个口轮询站号 1~247,发 03 0000 0001(读一个保持寄存器),有 CRC 正确应答的就是在线站号。注意:如果总线上两台设备默认地址都是 1,会互相干扰导致都答不上来——这时只能一次只接一台改完地址再并回去。别用写功能码广播,容易误改参数。

4. 靠报文特征认协议

特征 可能是
定长、第2字节是 01/02/03/04/05/06/0F/10、末尾两字节 CRC16 Modbus RTU
@01HD... 这类 @开头 + CR/LF 结尾的 ASCII 欧姆龙 Host Link / 部分仪表
固定头 50 00 ...、含子头部 三菱 MC 协议
02 30 30 ... 03 + BCC 西门子 PPI/MPI 或台达
纯 ASCII、以 \r\n 结尾、可读数字 电子秤、扫码枪、温控表自有协议
插上就持续往外吐数据 主动上报型(GPS、扫码枪、电表)

5. 抓包反推(终极手段)

  • Linux:usbmon(modprobe usbmon + Wireshark 选 usbmon1)抓 USB 原始流量;socat 做串口镜像 socat -v PTY,link=/tmp/vcom /dev/ttyUSB0;strace -e read,write -p <pid> 看进程发了什么。
  • Windows:Serial Port Monitor(Eltima)、USBPcap + Wireshark。 看到真实收发内容后,对照设备手册的协议章节,基本都能对上。

6. 电气层面排错(不通的时候先看这个)

  • 万用表测静态电平:RS-232 的 TX/RX 对 GND 有 ±5~15V;RS-485 测 A-B 差值,空闲时 A>B 为正常极性,接近 0V 说明接反或总线短路。
  • RS-485 总线两端各需一个 120Ω 终端电阻,中间不能有分支星型接法;超过 32 单位负载要加分段器。
  • 半双工 485 不能同时收发,用普通“回显测试”会自欺。
  • 共地问题:不同设备地电位差大会导致间歇性乱码,加光电隔离模块。
  • USB 长线(>3m)易丢包,用有源延长线或光纤 USB 延长器;多个转换器集中插容易供电不足,表现就是“能枚举但一通信就掉”。

Windows 与 Linux 下的设备定位

Windows 下的做法

1. 设备管理器定位 设备管理器 → 端口(COM 和 LPT),展开后显示类似 USB-SERIAL CH340 (COM3)。右键 → 属性 → 详细信息,切这几个属性:

  • 硬件 ID:USB\VID_1A86&PID_7523(VID/PID 对应芯片厂:FTDI 0403、Prolific 067B、CP210x 10C4、CH340 1A86、沁恒 4348)
  • 位置信息 / 父系:Port_#0003.Hub_#0002,这是它在 USB 树上的物理位置,只要插的 hub 口不变就不变,比 COM 号可靠。
  • 友好名称:有时会直接带设备型号。

2. 插拔对比法(最笨但最有效) 全部拔掉 → 记下当前列表 → 插一个 → 看新增哪个 COM → 贴标签。重复。配合 USBDeview 或 Device Tree Viewer 能直接看到 bus/port 路径和序列号,比设备管理器直观。

3. PowerShell 一键导出

Get-WmiObject Win32_PnPEntity | Where-Object {$_.PNPClass -eq "Ports"} |
  Select-Object Name, DeviceID, PNPDeviceID | Format-Table -AutoSize

想查注册表原始信息:HKLM\SYSTEM\CurrentControlSet\Enum\USB\ 下有每个设备的 FriendlyName、PortName、SerialNumber。

4. 固化 COM 号 设备管理器 → 端口属性 → 端口设置 → 高级 → 改 COM 号(避开 1~4,从 COM10 起用,减少老软件兼容问题)。更稳的做法是写脚本按 VID/PID/序列号创建固定符号链接或写配置文件,程序读配置而不硬编码 COM3。

Linux 下的做法(更规范,推荐)

1. 看拓扑和挂载点

lsusb -t                      # 树状拓扑,bus-port:dev,含 VID:PID
dmesg | grep -iE "tty|usb"    # 插拔瞬间内核报的设备和名字
ls /dev/tty{USB,ACM,S}*       # USB转串口 / CDC设备 / 原生串口

2. 查设备详情

udevadm info -a -n /dev/ttyUSB0 | grep -iE "vendor|product|serial|devpath|interface"

关注 idVendor、idProduct、serial、devpath(如 1-2.3 = bus1 的 2 口再接 3 口)。

3. 用稳定命名,别用 ttyUSB0(重点) udev 自带两套持久名:

ls -l /dev/serial/by-id/     # 按 VID/PID/序列号绑定,换插口也不变
ls -l /dev/serial/by-path/   # 按物理 USB 端口路径绑定,同型号无序列号时用这个

程序里直接开 /dev/serial/by-path/pci-0000:00:14.0-usb-0:2.3:1.0-port0,彻底解决重启漂移。

4. 自己写 udev rule(同型号多台设备) /etc/udev/rules.d/99-serial.rules:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FT1ABC", SYMLINK+="plc_main", MODE="0666"
SUBSYSTEM=="tty", KERNELS=="1-2.3", SYMLINK+="weigher", MODE="0666"

重载:udevadm control --reload-rules && udevadm trigger。之后用 /dev/plc_main、/dev/weigher,可读性直接拉满。

5. 实时监控插拔:udevadm monitor --property,插一个看一堆属性,顺手抄走做 rule。


工程化配置与排查流程

工程化落地:别让下次维护再来一遍

  1. 标签三重对应:线缆两端 + 设备本体 + 机柜图纸,统一编号(例:J3 ↔ COM3 ↔ PLC-01 ↔ 站号1)。拍照存档,存在设备台账里。
  2. 建一张映射表(建议做成 CSV/JSON 进版本管理):
柜/位置 物理口 系统名 VID:PID/SN 电气 协议 波特率 站号 用途
  1. 程序不要硬编码 COM 号,读配置文件或按 by-path/by-id 打开;启动时做自动发现:扫所有串口 → 发识别命令 → 输出 (端口, 型号, 站号) → 首次人工确认后锁定成 mapping 文件,后续不一致就告警。
  2. 健康监控:记录每个端口的最后成功通信时间、超时次数、CRC 错误数。出问题时能直接说“3号秤断了”,而不是“好像有个设备不通”。
  3. 硬件选型避坑:
  • 优先选能烧录唯一序列号的转换器(FTDI 原生支持),同型号多台时救命。
  • 串口数量 >4 个时,别全用 USB 转,改用 PCI-E 多串口卡(原生 UART,不掉号、延迟低、带光电隔离)。
  • 距离远或设备分散时,改用串口服务器/以太网 IO 模块,走网线+IP,排查难度下降一个量级。
  • 关键场合考虑现场总线(CANopen、Profinet、EtherCAT)或直接上 MQTT/Modbus TCP。

给你一个可直接执行的流程

① 全部断电/拔线 → 记录当前设备列表 baseline
② 逐个上电插入 → 记录每次新增的 COM/tty、VID:PID、hub port、序列号
③ 填映射表 + 贴标签(线两端都要贴)
④ 用串口助手逐口扫波特率、扫站号,补全协议/站号列
⑤ 固化:Windows 固定 COM 号;Linux 写 udev rule 或用 by-path/by-id
⑥ 程序改读配置,加启动自检和通信心跳监控
⑦ 拍照 + 归档,图纸更新

几个高频坑提醒:

  • ttyACM0(CDC 类,如 Arduino、部分仪表)和 ttyUSB0 不一样,驱动不同。
  • USB HID 类设备(扫码枪当键盘模式、某些采集卡)不会生成串口节点,得用 hidapi/libusb。
  • 工控机原生串口是 ttyS0/COM1,USB 转的是 ttyUSB*/COMx,别混着找。
  • 485 A/B 接反是最常见的“完全不通”原因,先测电压再调软件。
  • 多台同型号转换器插同一个无源 hub,重启后顺序随机——要么用 by-path,要么换带序列号的型号。