传输层干嘛的

多路复用与解复用(Multiplexing/Demultiplexing)

解复用(Demultiplexing)

- 定义:
- 解复用是多路复用的逆过程。
- 将接收到的数据流分离成单独的部分,分发到对应的应用程序进程。
- 应用场景:
- 手机接收到的数据包流会被分割,并发送到相应的应用程序(如网络浏览器、邮件客户端、微信等)。
工作原理
解复用
- 端口的作用:
- IP 协议实现的是 IP 地址到 IP 地址的传输,即两台计算机之间的通信。
- 每台计算机中可能运行多个应用程序,需要多个通信通道。
- 端口代表一个通信通道,用于区分不同的应用程序进程。
- TCP 和 UDP 的端口号都是 16 位,共有 65536 个端口号。
- 解复用过程:
- 主机接收 IP 数据报:
- 每个 IP 数据报包含源 IP 地址和目的 IP 地址。
- 每个数据报携带一个传输层段(TCP 或 UDP 段)。
- 每个段包含源端口号和目的端口号。
- 主机使用 IP 地址和端口号将数据段定向到正确的套接字(socket),进而连接到对应的应用程序。
- 主机接收 IP 数据报:
无连接的解复用(UDP)
- UDP 套接字:
- 创建套接字时,会分配一个本地端口号,例如:
1
DatagramSocket mySocket1 = new DatagramSocket(12534);
- 发送数据:
- 发送数据时,必须指定目标 IP 地址和目标端口号。
- 接收数据:
- 主机接收 UDP 段时,检查段中的目标端口号,并将数据定向到具有该端口号的套接字。
- 具有相同目的端口但不同源 IP 地址或源端口号的数据段也会被定向到同一个套接字。

面向连接的解复用(TCP)
- TCP 套接字:
- TCP 套接字通过 四元组 来标识:
- 源 IP 地址
- 源端口号
- 目的 IP 地址
- 目的端口号
- TCP 套接字通过 四元组 来标识:
- 解复用过程:
- 服务器可以在一个 TCP 端口上同时支持多个 TCP 套接字。
- 每个套接字通过其四元组来区分。
- 例如,Web 服务器为每个连接的客户端分配不同的套接字。
- 非持久连接的 HTTP(如 HTTP/1.0)为每个请求分配不同的套接字。

UDP
UDP(用户数据报协议)
UDP 是一种“无连接”、“尽力而为”的传输层协议,它提供了简单、轻量级的通信服务。以下是关于 UDP 的详细内容,包括其特点、用途、报文格式和校验和机制。
UDP 的特点
- 无连接(Connectionless):
- 不需要在传输数据之前建立连接。
- 每个 UDP 数据报(segment)独立处理,互不影响。
- 没有握手过程,减少了协议开销和延迟。
- 不可靠(Unreliable):
- 不保证数据报的可靠传输,数据报可能会丢失、重复或乱序到达。
- 不提供重传机制或确认机制。
- 简单高效:
- 报文头部简单,只有 8 字节,包含源端口、目的端口、长度和校验和。
- 适用于对实时性要求高、对可靠性要求低的应用。
- 无拥塞控制(No Congestion Control):
- UDP 不会根据网络拥塞情况调整发送速率。
- 应用程序可以以任意速率发送数据,可能导致网络拥塞。

UDP 的用途
- 流媒体应用(Streaming Multimedia Apps):
- 对丢失数据的容忍度较高(如视频会议、在线视频)。
- 对传输速率敏感,需要快速传输数据。
- DNS(域名系统):
- 用于域名解析,通常使用 UDP 进行快速查询。
- SNMP(简单网络管理协议):
- 用于网络设备的管理,通常使用 UDP 传输。
- 可靠传输(Reliable Transfer over UDP):
- 应用程序可以在 UDP 上添加可靠性机制(如重传、确认)。
- 应用程序可以根据自身需求实现错误恢复机制。
UDP 报文格式
UDP 报文由头部和数据负载组成,具体格式如下:
字段 | 长度(字节) | 描述 |
---|---|---|
源端口 | 2 | 发送方的端口号,用于标识发送方进程。 |
目的端口 | 2 | 接收方的端口号,用于标识接收方进程。 |
长度 | 2 | UDP 数据报的总长度(包括头部和数据负载),以字节为单位。 |
校验和 | 2 | 用于检测数据报在传输过程中是否发生错误。 |
数据负载 | 可变长度 | 应用程序的数据。 |
总长度:UDP 数据报的总长度(包括头部和数据负载)必须至少为 8 字节(头部长度)。
UDP 校验和(Checksum)
UDP 校验和用于检测数据报在传输过程中是否发生错误。其计算方法如下:
- 发送端:
- 将 UDP 数据报的内容(包括头部和数据负载)视为一系列 16 位整数。
- 计算这些 16 位整数的 一的补码和(即逐位相加,溢出部分加到最低位)。
- 将计算结果放入 UDP 头部的校验和字段中。
- 接收端:
- 接收到 UDP 数据报后,同样计算其内容的一的补码和。
- 如果计算结果为全零(0xFFFF),则认为数据报没有错误。
- 如果计算结果不为全零,则认为数据报发生了错误。

可靠传输(Reliable Transmission)
可靠传输是传输层协议(如 TCP)的核心功能之一,它确保数据能够完整、按序地从发送方传输到接收方。以下是关于可靠传输的实现机制和相关协议的详细内容。
停等协议(Stop-and-Wait Protocol)
停等协议是最简单的可靠传输协议,其工作原理如下:
- 发送方:
- 发送一个数据包后,必须等待接收方的确认(ACK)。
- 如果在超时时间内没有收到 ACK,发送方将重传该数据包。
- 接收方:
- 接收到数据包后,发送 ACK 确认。
- 如果数据包重复,接收方会丢弃重复的数据包并重新发送 ACK。
问题: - 如果 ACK 丢失或在超时后到达,发送方可能会错误地重传数据包。 - 性能低下,因为发送方在等待 ACK 时不能发送其他数据包,导致链路利用率低。
示例:
- 假设链路带宽为 1 Gbps,传播延迟为 15 ms,数据包大小为 8000 比特:
- 发送方利用率(Utilization): $$ U_{\text{sender}} = \frac{L / R}{RTT + L / R} = \frac{8000 / 10^9}{30 \times 10^{-3} + 8000 / 10^9} \approx 0.00027 $$
- 传输吞吐量(Throughput): $$ \text{Throughput} = \frac{8000 \text{ bits}}{30 \times 10^{-3} \text{ s}} = 266.67 \text{ kbps} $$
- 在 1 Gbps 的链路上,这种协议的吞吐量仅为 266.67 kbps,链路利用率极低。
管道化协议(Pipelined Protocols)
为了提高链路利用率和传输效率,管道化协议允许发送方在等待接收方确认(ACK)的同时发送多个数据包。这种方式可以显著减少因等待确认而导致的链路空闲时间,从而提高整体的吞吐量。常见的管道化协议有两种:Go-Back-N(回退N步) 和 Selective Repeat(选择性重传)。

Go-Back-N(GBN)协议
GBN 协议通过滑动窗口机制实现管道化传输:
- 发送方:
- 使用一个滑动窗口来管理未确认的数据包。
- 窗口大小为 N,表示可以发送但未确认的数据包数量。
- 如果超时未收到 ACK,将重新发送窗口中的所有数据包。
- 接收方:
- 仅接收按顺序到达的数据包。
- 对于乱序到达的数据包,接收方会丢弃并发送重复的 ACK。
示例:
- 假设窗口大小为 4,发送方发送了 4 个数据包(0, 1, 2, 3),但第 2 个数据包丢失。
- 接收方会收到 0 和 1,发送 ACK1。
- 第 3 和 4 个数据包乱序到达,接收方会丢弃并发送重复的 ACK1。
- 发送方超时后,重新发送 2, 3, 4, 5 数据包。
选择性重传(Selective Repeat)协议
选择性重传协议通过单独确认每个数据包来提高效率:
- 发送方:
- 使用一个滑动窗口来管理未确认的数据包。
- 如果超时未收到 ACK,只重新发送未确认的数据包。
- 接收方:
- 为每个正确接收的数据包单独发送 ACK。
- 对于乱序到达的数据包,接收方会缓冲这些数据包,并在适当的时候按顺序交付。
示例:
- 假设窗口大小为 4,发送方发送了 4 个数据包(0, 1, 2, 3),但第 2 个数据包丢失。
- 接收方会收到 0 和 1,发送 ACK0 和 ACK1。
- 第 3 和 4 个数据包乱序到达,接收方会缓冲这些数据包,并发送 ACK3。
- 发送方超时后,只重新发送第 2 个数据包。