传输层基本概念#
定位与功能#
- 位置:传输层位于应用层和网络层之间
- 核心功能:
- 向下:利用网络层提供的服务,为不同主机上的应用程序提供通信服务
- 向上:屏蔽底层网络的复杂性(如多跳路由、网络拓扑),让应用程序感觉像是在两个终端进程之间直接建立了一条“虚拟管道”
- 通信抽象:
- 网络层提供的是主机到主机 (Host-to-Host)的通信
- 传输层提供的是进程到进程 (Process-to-Process)的通信(逻辑上的端到端通信)
- 套接字 (Socket):应用层和传输层的接口,也是应用程序和网络之间的 API
传输层的服务限制#
- 网络层现实:Internet 的网络层提供的是“尽力而为 (Best-effort)”的服务
- 不保证:交付成功、按序交付、数据完整性、延迟和带宽
- 传输层能做的:通过差错恢复、重排序等手段提供可靠、按序的交付(如 TCP)
- 传输层做不到的:无法提供的延迟保证和带宽保证
复用与分用#
这是传输层实现“进程到进程”交付的核心机制。
基本定义#
- 复用 (Multiplexing) [发送端]:传输层从多个套接字收集数据,封装头部信息(如端口号),交给网络层发送
- 分用 (Demultiplexing) [接收端]:传输层从网络层收到数据后,根据报文段头部的信息,将数据交付给正确的套接字
标识机制:端口号 (Port)#
- 作用:用于标识主机上的不同进程(套接字)
- 长度:16比特(取值范围 ~ )
- 分类:
- 熟知端口 (0~1023):公共协议使用(如 HTTP 80, FTP 21)。
- 注册端口 (1024~49151):需注册使用。
- 动态/私有端口 (49152~65535):客户端通常使用系统自动分配的这类端口。
UDP 与 TCP 分用的区别#
| 特性 | UDP 分用 | TCP 分用 |
|---|---|---|
| 标识依据 | 二元组 <目的IP, 目的端口> | 四元组 <源IP, 源端口, 目的IP, 目的端口> |
| 套接字行为 | 不同源 IP/Port 发往同一个目的端口的数据,进入同一个套接字 | 每个连接(不同的源客户端)都有独立的连接套接字处理 |
| 服务器结构 | 通常只用一个套接字服务所有客户 | 使用一个监听套接字等待请求,为每个客户创建新的连接套接字 |
| 源信息作用 | 仅用于发送响应,不用于分用导航 | 用于区分不同的连接,决定交付给哪个套接字 |
UDP#
UDP 是一种“躺平”的协议,提供最低限度的传输服务
UDP 特点#
- 无连接:发送数据前不需要建立连接,没有握手延迟
- 尽力而为:不保证可靠性(丢包不重传)、不保证顺序
- 面向报文:
- 保留应用层报文的边界。
- 应用给多少,UDP 发多少;接收方每次
recv一个完整的报文 - 对比 TCP:TCP 是字节流,应用层感知不到报文边界
- 无速率控制:不进行拥塞控制和流量控制,应用层可以让 UDP 尽可能快地发送
UDP 报文结构#
UDP 头部非常简单,只有 8 字节。
- 源端口号 (Source Port):16 bits,可选,用于回信
- 目的端口号 (Destination Port):16 bits,用于分用
- 长度 (Length):16 bits,UDP 头部 + 数据的总字节数
- 校验和 (Checksum):16 bits,用于检测报文在传输中是否出错(可选)

Checksum 计算与原理#
- 计算范围:伪头部 (Pseudo-header) + UDP 头部 + 数据
- 伪头部:取自 IP 头部(源IP、目的IP、协议号、UDP长度),目的是防止 IP 地址错误导致的误投递

- 计算算法
- 将内容划分为一系列 16-bit 的整数。
- 将所有整数相加。
- 回卷:如果相加结果溢出(最高位有进位),将进位加到最低位。
- 最后结果取反,填入 Checksum 字段。
- 接收方验证:
- 对收到的报文段(包含 Checksum)进行相同的求和计算。
- 如果结果为 全 1 (0xFFFF),则认为无错;否则丢弃
- 局限性:无法检测出所有错误(如两个 16 位整数同一位置同时翻转)
- 为什么还需要 Checksum?
- 虽然链路层有检错,但在路由器内存或主机内部传输时仍可能出错,checksum 足以应付这些小概率事件
- 计算开销小
- 更高级的差错检验可以由应用层实现
UDP 的实现细节#
- 缓冲区:
- 发送方:通常无缓冲区。数据组装好头部后直接交给网络层
- 接收方:有缓冲区。每个 Socket 一个缓冲区,存储来自不同发送方的报文
为什么/何时使用 UDP?#
- 适用场景
- 流媒体:对延迟敏感,容忍少量丢包(TCP 的重传会导致延迟)。
- DNS/SNMP:单次请求/响应模式,建立连接的开销占比太大。
- 广播/多播:TCP 只能点对点。
- 如果在 UDP 上需要可靠性:必须由应用层自己实现(如验证、重传)
总结与对比#
| 维度 | UDP | TCP |
|---|---|---|
| 连接性 | 无连接 | 面向连接 |
| 传输单位 | 报文 (保留边界) | 字节流 (无边界) |
| 可靠性 | 不可靠 (尽力而为) | 可靠传输 (重传、排序) |
| 控制机制 | 无 (发多快由应用决定) | 流量控制、拥塞控制 |
| 分用标识 | 二元组 (目的IP, 端口) | 四元组 (源IP, 源端口, 目的IP, 目的端口) |
| 首部开销 | 小 (8 字节) | 大 (20 字节以上) |