![OSI 第 4 层的多路复用](https://linux22.com/image/794986/OSI%20%E7%AC%AC%204%20%E5%B1%82%E7%9A%84%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8.png)
我在读这文章中讨论了 OSI 模型传输层的多路复用。我似乎无法弄清楚该层上的“多路复用”是什么意思?因为多路复用是一个信号过程,而在传输层,我们并不直接关注信号。
有人可以为我解释一下上述文章中使用的多路复用吗?
答案1
引用的文章使用“多路复用”来描述同一主机上的多个应用程序如何共享一个网络接口,而驱动程序/内核如何将数据包路由到正确的应用程序。答案是数据包目的地不仅由 IP 地址指示,还由端口号指示。
每个发送的数据包都有一个端口作为其源地址的一部分。当您的应用程序指定“任何端口”时,这只会让操作系统分配一个未使用的端口。当远程主机发送回复时,它不仅指定地址,还指定端口,从而允许您的操作系统确定传入数据包应放置在哪个套接字队列中。即使您在一个主机上有两个应用程序向同一远程主机发送数据包,本地端口号也会不同。
答案2
因此,首先要注意的是,他们将端口视为“第 4 层地址”,并将多个应用程序流多路复用到单个端口上,并在接收端对多个不同的传输进行解复用。
正如您所期望的,这只适用于一些取决于端口/L4 寻址的唯一性的警告。
因此,非独占模式下绑定的 UDP 套接字可以有多个应用程序,它们都从同一个 L4 地址/端口发送。我不记得接收方的 BSD API 中有任何内容可以根据源端口过滤数据报,但我可能是错的——如果没有,您将不得不在比 L4 更高的堆栈级别上手动对其进行解复用,这不是本文所讨论的内容。
使用 TCP,服务器 (bind()) 套接字可以与 accept() 结合使用,以允许多个同时连接到同一 L4 目标(端口),但它们必须具有不同的客户端(源)端口。我也不知道 BSD 套接字 API 的任何实现允许多个 TCP 客户端套接字绑定到同一本地端口,因为 TCP 服务器(接收器)只能根据不同的源端口对流进行解复用。
换句话说,UDP 或 TCP 在 L4 上的多路复用/解复用仅在 50% 的情况下有效,并且永远无法同时在两个方向上工作