传输层是承接应用层和网络层的关键一环,传输层基于网络层提供的服务将主机与主机之间的通信封装为端与端之间的通信,实现了两台主机进程之间的数据交付,并且为上层应用屏蔽了复杂的底层网络细节,建立了网络的抽象模型。围绕以上特性,本章探讨传输层使用的技术。
(1)传输层多路复用/分用功能与端到端传输
传输层通过 多路复用 和 多路分用 实现多个应用进程共享网络层服务。
- 多路复用:发送方传输层将多个应用进程的数据(来自不同套接字)封装成数据段,然后传递给网络层。
- 多路分用:接收方传输层根据数据段中的端口号,将数据交付给正确的套接字(即相应进程)。
端口:16 位整数(0–65535),用于标识主机上的特定进程。
- 熟知端口(0–1023):分配给标准服务,如 HTTP(80)、HTTPS(443)、FTP(21)、SSH(22)、DNS(53)。
- 注册端口(1024–49151):用户应用程序使用,需要向 IANA 注册。
- 动态/私有端口(49152–65535):客户端临时使用。
套接字(Socket):IP 地址 + 端口号的组合,唯一标识网络中的一个端点。套接字是应用层与传输层之间的编程抽象。
传输层提供两种核心服务模式:无连接的 UDP 和面向连接的 TCP。
(2)UDP(用户数据报协议)
UDP 提供无连接、不可靠的数据传输服务,不保证顺序,不进行重传。
特点:
- 无连接:发送前无需建立连接,每个 UDP 数据段独立处理。
- 轻量:头部开销小(仅 8 字节),无拥塞控制和流量控制。
- 支持组播和广播。
- 应用场景:对延迟敏感、容忍丢包、实时性要求高的场景(如 DNS 查询、VoIP、视频直播、在线游戏)。
UDP 数据段格式:
- 源端口(2 字节)、目的端口(2 字节)、长度(2 字节,包括头部和数据)、校验和(2 字节,覆盖头部和数据及伪头部)。
- 校验和计算:包含 UDP 伪头部(源 IP、目的 IP、协议号、UDP 长度),用于检测从网络层到传输层的差错。
典型应用:
- 远程过程调用(RPC):客户调用远程服务时,UDP 的低延迟适合请求-响应交互。
- 实时传输协议(RTP):通常运行在 UDP 上,传输音视频媒体流,允许少量丢包。
(3)TCP(传输控制协议)
TCP 提供面向连接、可靠、有序的字节流服务。
特点:
- 面向连接:数据传输前需经过三次握手建立连接。
- 可靠传输:使用序号、确认、重传保证数据不丢失、不重复、按序到达。
- 流量控制:基于滑动窗口机制,协调发送速率避免接收方缓存溢出。
- 拥塞控制:动态调整发送速率,避免网络过载。
- 全双工通信:支持双向同时传输数据。
TCP 数据段格式:
- 源端口、目的端口(各 2 字节)
- 序号(4 字节,本段第一个字节的序号)
- 确认号(4 字节,期望收到的下一个序号,表示之前的数据都已收到)
- 数据偏移(4 位,头部长度)
- 标志位:ACK(确认有效)、RST(复位)、SYN(同步序号)、FIN(终止连接)、URG(紧急指针有效)、PSH(立即推送)
- 窗口大小(2 字节,接收方给出的剩余缓存空间)
- 校验和(2 字节,覆盖头部、数据和伪头部)
- 紧急指针(2 字节,与 URG 配合)
- 选项(可变长,如最大段大小 MSS、时间戳、窗口缩放因子)
可靠传输机制:
- 序号机制:每个字节都有序号,ACK 确认的是累积收到的最高序号的下一字节。
- 确认机制:接收方发送 ACK,可延迟确认(通常 200ms)或捎带在数据中。
- 重传机制:发送方维护重传计时器,超时未收到 ACK 则重传。超时时间 RTO 根据往返时间 RTT 动态计算(Jacobson 算法)。
流量控制:通过接收窗口(rwnd)实现。接收方在 ACK 中通告自己的可用缓存大小,发送方不能超过该窗口。
(4)TCP 连接管理
三次握手建立连接:
- 客户端发送 SYN 段(seq=x,SYN=1),进入 SYN_SENT。
- 服务器回复 SYN+ACK(seq=y,ACK=x+1,SYN=1),进入 SYN_RCVD。
- 客户端发送 ACK(ACK=y+1),进入 ESTABLISHED;服务器收到 ACK 后也进入 ESTABLISHED。
必要性:防止旧的重复连接请求突然到达服务器而产生错误;双方协商初始序号。
四次挥手释放连接:
- 主动关闭方发送 FIN(seq=u),进入 FIN_WAIT_1。
- 被动关闭方回复 ACK(ACK=u+1),进入 CLOSE_WAIT;主动方进入 FIN_WAIT_2。
- 被动方发送 FIN(seq=v),进入 LAST_ACK。
- 主动方回复 ACK(ACK=v+1),进入 TIME_WAIT(等待 2MSL 后关闭),被动方关闭。
TCP 状态机:包括 LISTEN、SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT_1/2、CLOSE_WAIT、TIME_WAIT、CLOSED 等状态。
(5)TCP 计时器管理
四种常见计时器:
- 重传计时器:超时未收到 ACK 则重传,RTO 基于 RTT 估算(使用 Karn 算法处理重传歧义)。
- 持续计时器:当接收窗口为 0 时启动,定期发送零窗口探测,防止窗口更新丢失导致的死锁。
- 保活计时器:长时间空闲时发送探测段,用于检测连接是否存活(默认 2 小时)。
- 时间等待计时器:TIME_WAIT 状态时长 2MSL(最长报文段寿命),确保最后一个 ACK 可重发并延迟释放端口。
RTT 估算:Jacobson 算法使用加权移动平均:SRTT = α * SRTT + (1-α) * RTT_sample(α 通常 0.875)RTTVAR = β * RTTVAR + (1-β) * |SRTT - RTT_sample|RTO = SRTT + 4 * RTTVAR
Karn 算法指出:重传后的 RTT 样本不应参与计算,且采用指数退避。
(6)TCP 拥塞控制
拥塞控制的目标是避免网络过载,公平共享带宽。TCP 使用窗口机制:拥塞窗口(cwnd)与接收窗口(rwnd)的最小值为实际发送窗口。
四个阶段:
- 慢启动:cwnd 从 1 个 MSS 开始,每收到一个 ACK 增加 1 个 MSS(指数增长),直到达到慢启动阈值 ssthresh。
- 拥塞避免:cwnd 每 RTT 增加 1 个 MSS(线性增长),直到出现丢包(超时或收到三个重复 ACK)。
- 快速重传:发送方收到三个重复 ACK 后立即重传丢失段,无需等待超时。
- 快速恢复(TCP Reno):将 ssthresh 设为 cwnd/2,cwnd 设为 ssthresh + 3,然后进入拥塞避免。
AIMD(加性增乘性减):拥塞避免阶段线性增加;丢包后将窗口减半(乘性减)。此算法保证了 TCP 流的公平性(多个流共享瓶颈链路时逐渐收敛到公平带宽分配)。
(7)新一代传输协议 QUIC
TCP 在移动网络、高延迟、多路复用下存在头部阻塞等问题。QUIC(Quick UDP Internet Connections)是基于 UDP 的新一代低时延传输协议。
发展历程:由 Google 提出,现已成为 IETF 标准(RFC 9000),是 HTTP/3 的底层传输协议。
优化思路:
- 多流复用:在一个连接内支持多个独立流,某个流丢包不影响其他流(解决 TCP 头部阻塞)。
- 0-RTT 连接建立:结合加密握手,可在首个数据包中携带数据,减少延迟。
- 连接迁移:使用连接 ID 而非 (IP, port) 标识连接,支持移动设备切换网络时连接不断。
- 改进的拥塞控制:每个流独立拥塞控制,可插拔算法(如 BBR)。
数据段格式:长头部(版本协商)和短头部(常规传输),包含连接 ID、包号、帧类型等。
连接管理:基于非对称加密的握手,结合 TLS 1.3,实现安全与连接建立并行。
QUIC 通过“流”这一概念,实现了更灵活的传输模型,特别适用于 Web 和实时应用。