tcp/ip 中的多路复用

要理解网络中的多路复用,以及它在 TCP/IP 协议栈中的位置,我们可以从概念定义、核心逻辑,再到分层应用逐步拆解。

当然,应用层 L7 http 层也是有的:比如多个 DNS 可以复用同一个端口

一、什么是 "多路复用"(Multiplexing)?

多路复用 是指:在一条共享的传输介质 (如网线、光纤、无线信道)上,同时传输多个独立的数据流 (或信号)的技术。其核心目的是提高传输资源的利用率------ 避免一条物理链路仅为一个应用 / 设备服务,从而降低成本、提升效率。

与多路复用对应的是多路分解(Demultiplexing):接收端根据数据流的 "唯一标识",将混合传输的数据流拆分并交付给对应的应用 / 设备。两者是同一过程的 "发送端 - 接收端" 对应操作,通常合称为 "复用 / 分解"。

二、核心逻辑:用 "唯一标识" 区分数据流

多路复用的关键是给每个数据流分配一个唯一标识(类似 "快递单号")。发送端给每个数据包打上标识,接收端通过标识 "分拣",确保数据不会 "送错门"。

三、TCP/IP 协议栈中,多路复用在哪些层次使用?

TCP/IP 协议栈自上而下分为应用层、传输层、网络层、数据链路层、物理层 。多路复用并非某一层的专属技术,而是贯穿多个层次的核心逻辑 ------ 只是不同层次的 "唯一标识" 和服务对象不同。其中,传输层的多路复用最具代表性,直接服务于端到端的应用程序。

下表清晰梳理了各层的多路复用逻辑:

协议层 复用的 "唯一标识" 服务对象(区分什么) 典型场景举例
传输层 TCP/UDP 端口号(Port) 同一主机上的不同应用程序 浏览器(80/443 端口)、微信(随机端口)、FTP(21 端口)的数据流共用同一 IP 链路
网络层 IP 地址(IPv4/IPv6) 不同的主机 / 网络设备 电脑(192.168.1.100)和手机(192.168.1.101)的数据包共用同一家庭路由器链路
数据链路层 MAC 地址(物理地址) 同一局域网内的不同设备 办公室内的电脑、打印机、交换机的帧(Frame)共用同一网线传输
物理层 频率 / 时间 / 波长(如 FDM/TDM) 不同的电信号 / 光信号 有线电视网用不同频率传输多个频道,光纤用不同波长传输多路光信号

四、重点:传输层的多路复用(最关键、最典型)

传输层的多路复用是 TCP/IP 协议中端到端通信的核心,直接解决了 "同一主机上多个应用如何共享网络连接" 的问题。

具体逻辑:

  1. 发送端(复用)

电脑上同时运行的浏览器、微信、QQ 等应用,都会产生数据需要发送。操作系统的传输层(TCP 或 UDP 模块)会给每个应用分配一个端口号(如 HTTP 默认 80,HTTPS 默认 443,微信用随机动态端口),然后将应用数据封装成 "TCP 段" 或 "UDP 报",并打上对应的端口号标识。最终,所有应用的 TCP/UDP 数据包会共用同一 IP 协议栈和物理链路发送。

  1. 接收端(分解)

接收端的传输层收到数据包后,会解析 TCP/UDP 头部中的目标端口号,然后根据端口号将数据交付给对应的应用程序(比如端口 443 的数据交给浏览器,动态端口的数据交给微信)。

总结

  • 多路复用的本质:用 "唯一标识" 给数据流 "打标签",实现共享链路的高效利用。
  • TCP/IP 中的核心层次传输层(通过端口号区分应用)是最典型的多路复用场景,直接支撑了多应用同时联网;网络层(IP 地址区分主机)、数据链路层(MAC 地址区分局域网设备)也会用到复用逻辑,但服务对象更偏向 "设备" 而非 "应用"。
相关推荐
expect7g16 小时前
Flink-To-Paimon 读取机制
大数据·后端·flink
kida_yuan16 小时前
【从零开始】18. 持续优化模型微调
后端·llm
倚栏听风雨16 小时前
Agent 认知+ReAct模式
后端
申阳16 小时前
Day 5:03. 基于Nuxt开发博客项目-页面结构组织
前端·后端·程序员
用户2986985301417 小时前
C#: 高效移动与删除Excel工作表
后端·.net·excel
guchen6617 小时前
记录一次Prism9隐式注册引发的事件聚合器失效问题
后端
一行•坚书17 小时前
kafka服务端与客户端如何协作?生产者发送消息分区策略是什么?消费者组分区策略?集群与ACK机制?
java·后端·kafka
天天摸鱼的java工程师17 小时前
干掉系统卡顿!Excel异步导出完整实战方案(百万数据也不慌)
java·后端
星释17 小时前
Rust 练习册 4:Deref trait 与智能指针
开发语言·后端·rust
Cache技术分享17 小时前
231. Java 集合 - 将集合元素转换为数组
前端·后端