本节介绍传输层协议的 multiplexing 和 demultiplexing。即,将网络层提供的 host-to-host 服务扩展为 process-to-process 服务。
一个 process 可以有多个 socket,每个socket 有一个独立的 id。网络上的数据通过这些 socket 发送给 process,process 也可以将数据通过 socket 发送到网络。也就是说,传输层并不是将数据传输给一个 process,而是给一个 socket。
每个传输层的数据包包头都包含接收 socket 信息,可以将数据引导到对应 socket。将数据从传输层数据包分发到不同 socket 的过程称为 demultiplexing。而从不同 socket 搜集数据并创建数据包然后发送给网络层的过程称为 multiplexing。如图 3.2 所示,必须将 和 的数据进行 multiplexing 和 demultiplexing。
Transport-layer multiplexing and demultiplexing由于需要 multiplexing 和 demultiplexing,传输层要求:
- socket 有唯一 id
- 数据包指明 socket id
socket id 是一个 16bit 的数字(从 0 到 65535)。其中,0 到 1023 时被系统保留的,默认用于 HTTP,FTP 之类的常用应用。
Connectionless Multiplexing and Demultiplexing
对于 UDP 协议的 multiplexing 和 demultiplexing,我们可以考虑如下例子:
假设主机 A 上的一个进程 a 使用 19157 socket,希望与主机 B 上使用 46428 socket 的进程 b 通信。
- 进程 a 会创建一个传输层数据包,其中包括源 socket id 19157 和目标 socket id 46428。
- 数据包进一步封装为网络层 IP 数据包,并传输给主机 B。
- 主机 B 的传输层检查到目标 socket id 是 46428,将其发送给对应该 id 的 socket,b 进程收到消息。
- (optional) 若 b 进程还想回复 a 进程,则可以利用数据包中的源 IP 地址和源 socket id 回复。
UDP socket 可以由目标地址(目标 IP,目标 port)唯一确定。也就是说,即使 两个数据包从不同的源地址(源 IP,源 port)发出,只要(目标 IP,目标 port)一致,就会被导向同一个目标进程。
Connection-Oriented Multiplexing and Demultiplexing
TCP socket 和 UDP socket 的一个重要区别是,TCP socket 是由 4 个元素确定的(源 IP,源 port,目标 IP,目标 port)。这说明,如果两个具有不同源地址,即使他们有相同的目标地址,最后也会被导向不同的 socket。
我们可以回忆在 2.7 Socket Programming: Creating Network Applications 中的代码。client 端都是连接同一个目标地址。而对于每一个 client,server 都会通过 AcceptTCP()
方法新建一个 socket。这就表明了 client 源地址不同,在 server 端的 socket 也不同。
网友评论