复用与分用

复用(multiplexing):发送方收集来自各个套接字的数据,添加头(headers)对数据进行封装生成段(segments),并将其交付给网络层。

分用(demultiplexing):接收方从网络层收到段,识别头信息并将其递交至正确的套接字。

实际上就是建立在网络层主机间通信的基础上,令传输层能够实现异主机进程间通信的机制。

进程,端口与套接字

进程通过套接字收发数据,套接字绑定到端口号(port numbers)作为标识,传输层据此把到达该端口的数据分发给对应套接字,从而交付给该进程。端口号本质上就是主机内进程的「地址」。

以下的讨论可配合 套接字编程 中代码食用。

UDP

UDP 套接字被一个二元组标识 (serverAddress, serverPort)

服务器端创建套接字时为其分配一个端口号(1024 至 65535)。

客户端发送消息时需要标注目的主机 IP 地址(或目的主机名,通过 DNS 查询地址)与目的端口号;前者用于网络层投递给正确主机,后者用于传输层交付给正确套接字。

TCP

TCP 套接字被一个四元组标识 (serverAddress, serverPort, clientAddress, clientPort)

服务器端创建一个指定端口的欢迎套接字(welcoming socket)。

客户端发送消息时标注目的主机 IP 地址,目的端口号,源主机 IP 地址源端口号:前二者用于与欢迎套接字握手;握手成功后服务器端创建由该四元组唯一标识的连接套接字(connection socket),专门负责与该客户端之间的通信。

因此,对于多个发往同一服务器端口的客户端进程,UDP 下它们的数据通常被分用到同一个套接字;而 TCP 下服务器会为每个客户端连接创建不同的连接套接字来分别交付数据。

注意

UDP 消息同样也携带源主机 IP 地址(IP 头中)与源端口号(UDP 头中),只是它们并不在 UDP 分用时标识套接字,更多的是标识发送方地址以便于回复。