计算机网络(一):分层模型、物理层与数据链路层
在 Canoe 平台上开一个训练任务、勾选端口暴露后,会拿到一条服务链接:
nlb-9vuc85ix299r1w5vzo.cn-shanghai.nlb.aliyuncsslb.com:31983
这一串东西看不懂,本质上是因为它把好几层协议的信息压在了一行里:冒号前是一个域名,冒号后是一个端口,而域名会被翻译成一个 IP,请求最终要靠 TCP 才能可靠地送进那台机器的那个端口。一个 URL 背后,是一整摞协议在分工协作。
要真正看懂它,得先有「分层」这个视角。这篇从最底层开始,自底向上把地基打好:先讲为什么网络要分层,再把日常听到的一堆名词(IP、域名、端口、TCP、HTTP、Mbps、网卡、WiFi、路由器……)各自归位,然后深入最底下两层——物理层和数据链路层。上层的 IP、传输层、应用层留到后续。
一、为什么网络要分层
「把数据从一台机器送到另一台机器」是一个极其复杂的问题:要考虑用什么介质传电信号、怎么在一堆机器里找到对的那台、传输出错了怎么办、多个程序抢一根线怎么协调、数据太大怎么切、对方用什么格式解读……如果把这些揉成一坨一起解决,没有人能设计得出来。
解决办法是分层:每一层只解决一类问题,向下依赖下一层提供的能力,向上为上一层提供服务。上层不需要知道下层怎么实现,只要下层「把字节送到」这个承诺兑现即可。
经典的分层模型是自底向上的五层(TCP/IP 模型;OSI 模型分七层,多出的两层日常很少单独讨论):
| 层 | 名称 | 一句话本质 | 典型概念 |
|---|---|---|---|
| 5 | 应用层 | 程序之间用什么「语言」对话 | HTTP、HTTPS、DNS、SSH |
| 4 | 传输层 | 字节怎么可靠 / 快速地端到端送达 | TCP、UDP、端口 |
| 3 | 网络层 | 怎么把数据送到全网任意一台机器 | IP、路由 |
| 2 | 数据链路层 | 同一段链路内怎么把帧交给某台设备 | MAC、以太网帧、ARP |
| 1 | 物理层 | 怎么把 0 和 1 变成信号传过去 | 网线、光纤、无线电波 |
一个关键机制是封装:数据从上往下走时,每经过一层就被套上该层的「信封」(加一段头部信息);到对端后再从下往上逐层拆开。上层的整个数据,在下层眼里只是「载荷」——下层不关心里面是什么。
应用层数据(HTTP 请求)
↓ 套上传输层头部
[TCP 头 | 应用层数据]
↓ 套上网络层头部
[IP 头 | TCP 头 | 应用层数据]
↓ 套上链路层头部和尾部
[以太网头 | IP 头 | TCP 头 | 应用层数据 | 校验]
↓ 转成信号发出去
理解了这一点,后面所有概念都能对号入座:看到一个名词,先问它属于第几层、解决的是哪一类问题。
二、先给几个贯穿全程的概念定位
有一批名词会反复出现,但它们分属不同层。这里先建立准确的直觉,深入留到对应层的章节。
IP:机器的地址
每一台联网的机器都有一个 IP 地址,形如 192.168.1.10 或 120.55.83.12。它的唯一作用是在网络中定位一台机器。数据最终一定是发往某个 IP 的。IP 属于网络层(第 3 层)。
域名与 DNS:好记的名字,和翻译服务
120.55.83.12 这种数字难记,于是有了域名,如 canoe.xaminim.com。域名是给人看的,机器之间通信仍然只认 IP,中间靠 DNS 把域名翻译成 IP:
输入 canoe.xaminim.com
→ 问 DNS:这个名字对应哪个 IP?
→ DNS 答:120.55.83.12
→ 机器才向 120.55.83.12 发数据
DNS 是应用层的一个服务。
端口:一台机器内部区分服务的编号
一台机器(一个 IP)上同时跑着很多程序:网页服务、数据库、SSH 登录……端口是一个 0–65535 的整数,用来区分「同一台机器上的哪个服务」。
120.55.83.12:22 → SSH 登录服务
120.55.83.12:80 → 网页服务
120.55.83.12:3306 → 数据库
120.55.83.12:31983 → 某个训练任务暴露的服务
所以「IP + 端口」才能精确定位到「哪台机器上的哪个服务」,写法是中间加冒号。端口属于传输层。
监听与连接
监听(listen):一个程序启动后占住某个端口,等着别人来访问。如果没有任何程序监听某端口,去访问它会得到「连接被拒绝」——门牌号对应的房间是空的。
连接(connect):客户端主动去找监听中的服务端,接上头,之后双方来回传数据。「连接」主要是 TCP 的概念。
TCP 与 UDP:两种传输方式
传输层有两种把数据送达的方式:
| TCP | UDP | |
|---|---|---|
| 可靠性 | 保证送达、不乱序、不重复 | 可能丢、可能乱序 |
| 机制 | 先「握手」建立连接再传 | 不握手,直接发 |
| 速度 | 略慢(有确认开销) | 快 |
| 适用 | 网页、SSH、数据库、文件传输 | 视频直播、游戏、语音 |
绝大多数需要「不能错」的场景用 TCP;能容忍少量丢失但要快的场景用 UDP。
HTTP 与 HTTPS:应用层的对话语言
TCP / UDP 只负责把字节送到,送到之后双方说什么、怎么说,由应用层协议规定。HTTP 是最常用的一种,专门用于网页和接口:
客户端:GET /jobs/detail?job_id=j-xxx (我要这个页面)
服务器:200 OK + 网页内容 (给你,成功)
HTTP 建立在 TCP 之上——先用 TCP 接上头,再用 HTTP 交流。HTTPS = HTTP + 加密(TLS):普通 HTTP 在链路上是明文,谁都能看;HTTPS 给内容加了密,中间人截获到的是乱码。地址栏 https:// 和小锁标志就是这个意思。
这几个概念的依赖关系:
HTTP / HTTPS ← 说什么(应用层)
↑ 建立在
TCP / UDP ← 怎么把字节送到(传输层)
↑ 建立在
IP ← 送到哪台机器(网络层)
三、第一层:物理层
物理层解决一件事:怎么把一串 0 和 1 变成某种物理信号,通过某种介质传到对端。它完全不关心这些 0 和 1 是什么意思、发给谁——那是上层的事。
三种介质
| 介质 | 信号 | 典型场景 | 速度量级 |
|---|---|---|---|
| 网线(铜) | 电信号 | 服务器、家用 | 1 / 10 / 100 Gbps |
| 光纤 | 光信号 | 数据中心之间、海底电缆 | 100 Gbps 起,可达数 Tbps |
| 无线(WiFi / 4G / 5G) | 电磁波 | 手机、笔记本 | 几十到几百 Mbps |
数据中心内部大量使用光纤。训练集群里节点之间每秒要搬动几十 GB 的梯度数据,物理层的速度直接决定训练能多快,这也是训练集群成本高的一大原因——高速网卡和高速交换机很贵。
带宽单位:bit 和 Byte 的坑
带宽单位是 Mbps = Megabits per second = 兆比特每秒。拆开看:M 是兆(一百万),b 是 bit(一个 0/1),ps 是每秒。
最容易踩的坑是大小写的 b:
- Mbps(小写 b)= 兆比特每秒,运营商、网卡速度用这个
- MBps / MB/s(大写 B)= 兆字节每秒,文件下载速度用这个
因为 1 Byte = 8 bit,所以:
100 Mbps = 100 / 8 = 12.5 MB/s
运营商宣传的「100M 宽带」是 100 Mbps,换算成下载速度只有 12.5 MB/s。不是缩水,是单位差了 8 倍。
各量级的直觉:
| 场景 | 速率 | 换算 |
|---|---|---|
| 家庭 100M 宽带 | 100 Mbps | 12.5 MB/s |
| 千兆宽带 | 1000 Mbps | 125 MB/s |
| 万兆网卡 | 10 Gbps | 1.25 GB/s |
| 训练集群 RDMA 网卡 | 100 / 200 / 400 Gbps | 12.5 GB/s 起 |
速记:小写 b 是运营商口径、要除以 8;大写 B 是文件口径、按真实算。
关于宽带带宽的三个常见疑问
上行和下行是分开算的,且通常不对称。 「100M 宽带」说的是下行(下载);家用宽带的上行(上传)往往小一个数量级(比如下行 100 Mbps、上行只有几 Mbps)。这就是为什么发大文件、视频会议画质会明显比下载吃力。机房专线一般是上下行对称的。
套餐带宽是全家共享的总上限。 100M 宽带意味着路由器到运营商之间那条链路最高 100 Mbps,家里所有设备加起来不能超过它。一台设备下载占满 100 Mbps,其他设备就会卡——这就是「抢带宽」,也是路由器限速功能存在的原因。
机房带宽和家用宽带不同:机房里「100G 带宽」通常是对称、独占的(不与陌生人共享),但两台机器同时向同一台机器发数据时,接收端的总入口带宽仍是上限,会排队。
网卡、交换机、路由器初识
- 网卡(NIC):机器上负责收发网络信号的硬件。把 0/1 转成信号发出去、把收到的信号转回 0/1。WiFi 模组、4G/5G 模组、有线网口都是网卡。一台机器可以有多块网卡。
- 交换机(Switch):多个口的设备,把多台机器连起来让它们互相通信。属于第 2 层,下一节详述。
- 路由器(Router):连接两个不同网络的设备,属于第 3 层。
四、日常网络设备与名词,各归其位
网卡、WiFi、WLAN、5G、蓝牙、猫、路由器、交换机、AP 这些词很容易混。理清的关键是先分出三个角色:你的终端、你家、运营商。
【终端】 【你家】 【运营商】
笔记本 / 手机 路由器 局端设备 / 基站
产生和消费数据 把终端和运营商连起来 真正接入互联网
终端一侧
- 网卡:上网能力的硬件载体。笔记本里对应网口或 WiFi 模组,手机里是焊在主板上的基带芯片加天线。
- WiFi 与 WLAN:WLAN 是「无线局域网」,WiFi 是它最主流的一种实现技术,日常可当同义词。WiFi 信号有效距离约 10–50 米。WiFi 6 / WiFi 7 是 WiFi 的版本代际,越新支持越全,本质是同一种东西的不同代。
- 4G / 5G:和 WiFi 是完全不同的两套体系。信号来自运营商建的基站(路边的高塔),覆盖几公里到几十公里,需要 SIM 卡和月租。5G 相比 4G 峰值更高、延迟更低。
- 蓝牙:虽然也是无线,但不是上网技术,用于连接近距离小设备(耳机、键盘、手表),距离几米、速率低。
你家一侧
- 猫(Modem,调制解调器):把运营商拉进来的线(现在基本是光纤)的信号,和家里设备用的以太网信号互相转换。现在家用基本是「光猫」。名字来自 Modulate(调制)+ Demodulate(解调)——把 0/1 调制成适合线路传输的波形,对端再解调回来。
- 路由器:家里那个小盒子其实是四合一——集成了猫(信号转换)、路由器(不同网络间转发)、交换机(多个 LAN 口)、WiFi 热点(无线接入)四种功能。在专业机房里这是四台独立设备。
- 交换机:只做一件事——把多台设备用网线连起来让它们互通。家用路由器背后那几个 LAN 口内部就是一个小交换机。
- AP(接入点):单纯发 WiFi 信号的设备。大楼里会用一堆专业 AP 挂在天花板上,而不是家用路由器。
运营商一侧
局端有 OLT(光线路终端)、核心路由器等;移动网络有基站(4G 叫 eNodeB、5G 叫 gNodeB)和核心网。这些日常接触不到,知道存在即可。
WiFi 和「流量」的本质区别
不在于信号是不是无线,而在于链路的另一端是谁:
WiFi: 手机 ──WiFi──→ 你家路由器 ──光纤──→ 运营商
第一段才是 WiFi,运营商只跟你的路由器打交道
流量: 手机 ──5G──→ 运营商的基站
没有中间那台你自己的设备,直接连基站,按套餐计费
这也解释了为什么训练集群用有线不用 WiFi:WiFi 是共享无线介质、有额外的协调开销,实际吞吐和稳定性都不如有线。
五、第二层:数据链路层
数据链路层解决的核心问题是:在同一段物理链路上(同一根线 / 同一个 WiFi / 同一台交换机连起来的一组设备),怎么把一帧数据准确交给某一台设备。 它要处理寻址、成帧、差错检测、多设备共享介质的协调。
MAC 地址
MAC 地址是一个 48 bit(6 字节)的编号,通常写成 6 组十六进制,如 60:3e:5f:83:b8:a9。三个关键事实:
- 出厂烧录在网卡里,不依赖任何网络配置。
- 全球唯一:前 24 位是 IEEE 分配给厂商的标识(OUI),后 24 位是厂商给每片网卡的序列号。
- 只在同一段链路内有意义,不能跨路由器使用。
第 3 点最反直觉,值得单独讲清楚。
「全球唯一」不等于「全球可达」
MAC 全球唯一,说的是身份不重复,像身份证号;但它扁平、无结构——从一个 MAC 号本身,无法推断出这台机器在网络的哪个位置。如果要靠 MAC 在全球范围找机器,那全世界每台转发设备都得维护一张几十亿条的表,根本不可行。
IP 地址则是分层、有结构的:一整段 IP(如 120.55.0.0 到 120.55.255.255)可以整体划给某个机房,于是路由器只需一条规则「凡是 120.55 开头的,往那个方向发」就覆盖了六万多个地址。
MAC 唯一但无结构,只能在一段链路内点名;IP 有结构,才能支撑全球范围的聚合路由。这正是有了 MAC 还必须有 IP 的根本原因。
以太网帧
上层(IP 层)发下来的数据,必须先装进以太网帧这个标准结构,才能从一块网卡传到另一块网卡。Ethernet II 帧的结构:
| 字段 | 长度 | 含义 |
|---|---|---|
| 目的 MAC | 6 字节 | 这帧发给同一链路内的哪台网卡 |
| 源 MAC | 6 字节 | 这帧是谁发的 |
| 类型 | 2 字节 | 载荷装的是哪种上层协议(0x0800 = IPv4,0x0806 = ARP,0x86DD = IPv6) |
| 载荷 | 46–1500 字节 | 真正要传的数据(通常是一个 IP 包) |
| 校验(CRC) | 4 字节 | 用于发现传输错误 |
两个硬性大小限制:
- 最小帧 64 字节(历史上为配合冲突检测保留)。
- 最大帧 1518 字节,其中载荷上限 1500 字节,这个上限叫 MTU(最大传输单元)。上层 IP 包超过 MTU 就要分片。
CRC:只检错,不纠错
**CRC(循环冗余校验)**解决「数据在介质上传输可能出错(某个 bit 被干扰翻转)」的问题。机制是:
发送方:用一个固定除数对帧数据做特殊的二进制除法,得到余数作为校验值,附在帧尾
接收方:用同样的方式重算一遍,和帧尾带来的校验值比对
一致 → 认为没出错,接收
不一致 → 数据被破坏,直接丢弃这一帧
三个要点:CRC 只发现错误、不修复,丢弃后要不要重传是上层(TCP)的事;它用多项式除法,漏检概率极低;整个过程由网卡硬件自动完成,对软件透明。
ARP:从 IP 问出 MAC
发帧需要填「目的 MAC」,但上层通常只给出目的 IP。ARP 协议负责在同一网段内把 IP 解析成 MAC:
A 在本网段广播(目的 MAC = FF:FF:FF:FF:FF:FF,全网段都收到):
「谁是 192.168.1.100?把你的 MAC 告诉我」
B 单播回复 A:
「我是 192.168.1.100,我的 MAC 是 BB:BB:BB:BB:BB:BB」
A 把这条 IP → MAC 映射缓存起来(几分钟失效),之后直接用
ARP 依赖广播,因此只在同一网段内有效,跨路由器就用不了。
在任意 Mac / Linux 终端执行 arp -a,能看到本机缓存的 IP → MAC 映射。一个真实例子:
? (192.168.136.1) at a8:50:81:3f:e:52 on en0 [ethernet]
? (192.168.136.151) at 60:3e:5f:83:b8:a9 on en0 [ethernet]
? (169.254.169.254) at (incomplete) on en0 [ethernet]
mdns.mcast.net (224.0.0.251) at 1:0:5e:0:0:fb on en0 [ethernet]
逐行解读,正好把本节概念串起来:
en0是网卡接口名,所有条目都在 en0,印证 ARP 只看得到本网段。192.168.136.1是本网段的网关(家用网络里.1默认是路由器),对应的就是路由器网卡的 MAC。192.168.136.151是本网段另一台设备。169.254.169.254显示incomplete——ARP 问了但没人应答(169.254.x.x是没拿到正常 IP 时系统自分配的地址),本地无人占用,属正常现象。224.0.0.251不是某台机器,而是一个多播地址(mDNS,局域网服务发现用),它按固定规则映射成01:00:5e开头的多播 MAC。
这引出 MAC 的三种类型:
单播 unicast: 目的 MAC = 某一台机器 (正常点对点通信)
广播 broadcast: 目的 MAC = FF:FF:FF:FF:FF:FF (如 ARP 问路,全网段都收)
多播 multicast: 目的 MAC = 01:00:5e:xx:xx:xx (只发给订阅了某组的一批设备)
交换机的本质
交换机是第 2 层设备,工作可以概括为「MAC 学习 + 按 MAC 表转发」。它内部维护一张 MAC 地址表(MAC → 端口):
1. 收到一帧,读源 MAC → 记下「这个 MAC 在哪个口」(学习)
2. 读目的 MAC,在表里查:
查到 → 只往那个口转发(单播)
查不到 → 往所有口转发(泛洪 / flood)
目的 MAC 是广播地址 → 所有口都转
交换机只读 MAC、不拆 IP 包,这是它和路由器的根本区别。
「网段」是什么
网段(也叫广播域、一个子网)指的是:不经过路由器、仅靠链路层就能彼此直接通信的一组设备。 判定标准是——A 发一个广播帧,能收到的所有设备就属于同一网段。
- 交换机连起来的设备在同一网段(广播能互达)。
- 路由器默认不转发广播,所以路由器是网段的边界。
因此 MAC、ARP、广播只在「一段」内有效(交换机范围),IP 和路由用于「跨段」(路由器范围)。arp -a 看到的全部条目都在本网段,正是这个道理。
跨网段时:IP 端到端不变,以太网帧逐跳改写
既然以太网帧的目的 MAC 必须是同一段链路内的设备,那访问一台远程机器(要跨多个网段)时,帧是怎么走的?关键规律:
IP 头从头到尾不变(端到端),而以太网帧每经过一个路由器就被拆掉、重新封装一个新的(逐跳改写)。
以 A 经过路由器 R1、R2 访问远端 D 为例:
A ──网段1── R1 ──中间网络── R2 ──网段2── D
第 1 段(A → R1): IP 头:源 A、目的 D(不变) 以太网帧:源 A、目的 R1
第 2 段(R1 → R2):IP 头:源 A、目的 D(不变) 以太网帧:源 R1、目的 R2
第 3 段(R2 → D): IP 头:源 A、目的 D(不变) 以太网帧:源 R2、目的 D
每个路由器收到帧后拆开,看 IP 头里的最终目的地,查自己的路由表决定「下一跳交给谁」,再用 ARP 求出下一跳的 MAC、封一个新帧发出去。
| IP 头 | 以太网帧(MAC) | |
|---|---|---|
| 作用范围 | 端到端(全程) | 逐跳(一段链路) |
| 变不变 | 全程不变 | 每过一个路由器就改写 |
| 回答的问题 | 最终去哪 | 下一步交给谁 |
「几层设备」是按功能,不是按硬件
一个常见的困惑:网卡、交换机明明是硬件,怎么又说它们是「链路层设备」?因为 OSI 分层划分的是功能,不是设备——一个硬件可以同时实现多层的功能,「几层设备」指的是它最高处理到第几层。
- 网卡:既做物理层(0/1 与信号互转),又做链路层(组 / 拆帧、填 / 校验 MAC 与 CRC)。最高到第 2 层。
- 交换机:物理层收发 + 链路层按 MAC 转发。最高到第 2 层。
- 路由器:在前两层之上,还能按 IP 转发。最高到第 3 层。
| 设备 | 物理层 | 链路层 | 网络层 | 习惯叫法 |
|---|---|---|---|---|
| 集线器(hub) | 有 | 一层设备 | ||
| 网卡 | 有 | 有 | 二层设备 | |
| 交换机 | 有 | 有 | 二层设备 | |
| 路由器 | 有 | 有 | 有 | 三层设备 |
上层设备必然包含下层功能——路由器要转发 IP,前提是它先能收发信号、能收发帧。
有线与无线的介质访问差异
多台设备共享同一介质时,得协调「谁先发」,否则同时发就冲突了:
- 有线以太网早期用 CSMA/CD(发送时边听边发,检测到冲突就停)。现代交换式全双工以太网基本用不到了。
- WiFi 用 CSMA/CA:所有设备共享同一段频谱(「空气」),发之前先监听信道是否空闲、空闲则等一个随机时间再发,尽量避免冲突。这种协调开销是 WiFi 实际吞吐低于有线的原因之一。
六、回到最初的服务链接
有了分层视角,再看开头那条链接就清楚多了:
nlb-9vuc85ix299r1w5vzo.cn-shanghai.nlb.aliyuncsslb.com : 31983
└──────────────────── 域名 ────────────────────────┘ └ 端口 ┘
(DNS 会翻译成一个 IP) (房间号)
用浏览器或 SSH 连它,底层走的是 TCP:先和「IP + 端口」握手接上头;如果访问的是网页,接上头后再用 HTTP / HTTPS 交流。
而运维口中的 nlb → nodeport → service → pod,是这条链接在平台侧的完整转发链路。这里涉及几个偏上层、偏云原生的概念:
- **LB(负载均衡)**是通用概念——把外部请求分发到后端多台机器。云厂商有多种形态:NLB(Network LB)工作在传输层(第 4 层),只看 IP + 端口、协议无关、性能极高,适合暴露任意 TCP 端口;ALB(Application LB)工作在应用层(第 7 层),按域名 / 路径路由,做 Web 入口;CLB 是更早的一代。
- Ingress 是 Kubernetes 里的 HTTP / HTTPS 入口资源,按域名和 URL 路径把请求转发给不同的后端服务——本质也是第 7 层。训练任务暴露的是任意 TCP 端口、协议未知,所以走 NLB(L4 透传)而不是 Ingress。
- NodePort → Service → Pod 是 K8s 把外部流量送进容器的经典链路:NLB 把流量打到集群任意一个节点的某个端口(NodePort,取值在 30000–32767,链接里的 31983 正落在此区间),节点上的转发规则把流量交给 Service(一组转发规则 + 标签选择器),Service 再挑一个存活的 Pod(真正跑训练进程的容器)送进去。
之所以要这么多层,是因为 Pod 会重启、会漂移、IP 会变,但对外那个「NLB 域名 + 端口」始终不变——中间这几层负责屏蔽后端的变化,让外部地址保持稳定。这套链路本身属于云原生 / K8s 网络的范畴,建立在这篇打的基础之上,细节留待后续。
小结
- 网络用分层来分而治之:每层只解决一类问题,数据逐层封装、逐层拆解。看到任何名词,先定位它属于第几层。
- 物理层只管把 0/1 变成信号在介质上传输;带宽单位 Mbps 是比特口径,除以 8 才是 MB/s 的字节口径。
- 日常设备各归其位:网卡是收发信号的硬件,WiFi 和 5G 的区别在链路另一端是路由器还是基站,家用路由器是猫 / 路由 / 交换 / AP 的四合一。
- 数据链路层用 MAC 在同一网段内点名:MAC 全球唯一但无结构,只能靠 ARP 在网段内解析、由交换机按 MAC 表转发;跨网段时 IP 头端到端不变,以太网帧逐跳被路由器改写。
- 「几层设备」按最高处理到第几层划分:网卡 / 交换机是二层,路由器是三层。
再往上,就是让数据能跨越全网到达任意机器的网络层(IP)——IP 地址的结构、子网、路由表、NAT,是下一篇的内容。