本节摘要:信号抵达基站后,旅程进入"接力赛"阶段——数据要跨过接入网、核心网、互联网抵达服务器。本节讲分层的协议体系:封装与解封装的接力规则、IP 的寻址与转送、TCP/UDP 的两种哲学、三次握手与拥塞控制。案例做一次网页请求的逐层抓包解读,把抽象分层落到可见的字节上。
你给国外朋友寄礼物:先包好(应用层写贺卡)、装盒(传输层贴地址与保价单)、贴邮票分拣(网络层写收件地址)、交给货运(链路层分路段运输)、由飞机与卡车实际搬运(物理层)。每一段运输的司机不关心盒子里是什么,海关只看面单,朋友拆盒的顺序与你打包的顺序正好相反——分层网络的工作方式与此完全一致。这个类比的重要提醒:每一层只与对等层"对话",发货人与收货人对贺卡内容达成一致即可,无需知道中间走了哪条航线。
七层 OSI 是教科书模型,四层 TCP/IP 是现实世界。逐层的责任与封装:
| 层 | 职责 | 封装产物 | 典型协议 |
|---|---|---|---|
| 应用 | 业务语义 | 消息 | HTTP、DNS |
| 传输 | 端到端可靠与分路 | 段 | TCP、UDP |
| 网络 | 全局寻址与转送 | 包 | IP |
| 链路 | 相邻节点传递 | 帧 | 以太网、WiFi |
| 物理 | 比特上线路 | 比特流 | 第五、六章的全部 |
每层给上层数据加自己的包头(贺卡装盒、盒贴面单),收端逆序剥壳。分层的工程价值不是神圣感而是解耦:无线从 4G 换 5G 只动物理与链路,你的浏览器一行代码不用改。
TCP 面向连接、可靠、有序:发前三次握手(双方各确认一次收发能力,用序列号对齐时钟),发后逐段确认、丢失重传、按序交付,并内置拥塞控制(探测网络容量,拥塞时主动降速)。代价是时延抖动与状态开销。
UDP 无连接、不保证:应用说什么就发什么。看似"不负责",恰是实时业务的正解:一段迟到的语音是废数据,重传毫无意义;直播、游戏、域名解析都选 UDP。第五代核心网甚至把 UDP 作为承载基础(QUIC 协议在 UDP 上重建可靠传输),说明哲学之争的答案是"按业务选,或自己组合"。
背景:在局域网内打开一个网页,抓取网卡上的第一批发包记录,逐层拆给读者看。观察(字段摘录):
帧1 链路层: 目的MAC = 网关地址(同一网段先问ARP拿到) 网络层: 源IP 192.168.1.23 → 目的IP 93.184.216.34,协议=TCP,TTL=64 传输层: 源端口 51422 → 目的端口 443,标志位 SYN,序号 x 帧2 反方向: SYN+ACK,序号 y,确认号 x+1 ← 三次握手的第二拍 帧3 正方向: ACK,确认号 y+1 ← 连接建立,可发数据 帧4 正方向: PSH+ACK,载荷 TLS ClientHello ← 应用数据开始
解读:短短四帧把分层讲成实物——同一张网页请求里,链路层只认下一跳(网关的 MAC),网络层才认最终目的地(公网 IP),传输层用端口号区分"这条连接是浏览器进程的哪个会话"。TTL 每过一台路由器减一,既是防环的保险丝,也是 traceroute 工具的原理(故意发 TTL=1,2,3 的包,逼沿途路由器回报身份)。变式:换成视频通话抓包,你会看到 UDP 流为主、没有握手、偶尔乱序——两种哲学在同一张网卡上和平共处。
# 用三次握手的模拟理解序列号的"对表"作用 import random seq_client = random.randint(0, 2**32-1) # 客户端随机初始序号(防历史连接混淆) seq_server = random.randint(0, 2**32-1) print(f"C→S SYN seq={seq_client}") print(f"S→C SYN+ACK seq={seq_server} ack={seq_client+1} # 我收到了你的第一个字节的位置") print(f"C→S ACK ack={seq_server+1} # 我也收到你的") print("此后双方各自按序号清点字节 丢一段就从缺口处重传")
IP 地址是全局门牌,路由器按"最长前缀匹配"逐跳转送——路由表存的是"某前缀走某下一跳",包到时选匹配最长的条目。域内用链路状态协议算最短路,域间则掺杂大量商业策略(运营商之间谁为谁转发流量是合同问题)——技术上的最优路径常常被商务上的对等协议否决,工程从不是纯数学。
服务质量是网络层的另一战场:语音包小而急、下载包大而钝,混在一条队列里语音会抖。对策是分类排队与调度(优先级队列、加权公平队列),5.2 节空中接口的调度思想在有线网原样重演。5G 网络切片(7.2 节)则是把这种分类从"包级"升到"网络级"。
⚠️ 常见坑:以为"网络慢"是带宽不够。多数家用网络的实际瓶颈是时延与抖动:游戏卡是因为路由绕远(时延),视频会议糊是因为拥塞丢包(抖动与重传)。看懂 ping 与丢包率再谈带宽,是排障的第一课。
问:为什么传输层要同时存在 TCP 与 UDP,而不是统一成一种?答:因为两类业务的需求不可调和。文件与网页要"一字不差",重传天经地义;通话与游戏要"宁丢勿等",迟到的数据比丢失更糟。统一协议必然同时带上两套包袱。后来的演进(QUIC 在 UDP 上重建可靠传输)恰恰证明:正确答案不是合并协议,而是把选择权模块化地交还应用。
问:traceroute 是怎么知道沿途每一跳的?答:利用生存时间(TTL)的报错机制:发 TTL 等于一的包,第一台路由器减到零后丢弃并回报"我超时了",于是暴露身份;再用 TTL 等于二、三的包逐跳点名。一个防环的保险丝字段,被巧妙地征用为测量工具——协议设计中"副作用的再利用"是常见智慧。
接力规则已明。下一节看这场接力在移动网络里怎么组织:从 1G 到 5G,每一代到底在争什么。