《计算机网络(第5版)》第五章 运输层

《计算机网络(第5版)》第五章 运输层

一、运输层协议概述

1. 运输层的作用

  • 端到端通信 :真正的通信端点是主机中的进程,而不是主机本身
  • 复用与分用
    • 复用:发送方多个应用进程使用同一个运输层协议传送数据
    • 分用:接收方运输层将数据正确交付给目的应用进程
  • 运输层向高层用户屏蔽网络核心细节
  • 网络层提供主机之间的逻辑通信,运输层提供应用进程之间的端到端逻辑通信

2. 运输层的两个主要协议

协议 全称 特点 服务
UDP 用户数据报协议 无连接,不可靠,面向报文 尽最大努力交付
TCP 传输控制协议 面向连接,可靠,面向字节流 可靠交付,全双工

3. 运输层的端口

  • 端口:软件端口,用于标志应用层进程(16位,0~65535)
  • 端口分类
    • 熟知端口 (0~1023):指派给重要应用程序
      • FTP:21, TELNET:23, SMTP:25, DNS:53, TFTP:69, HTTP:80, SNMP:161
    • 登记端口(1024~49151):需在IANA登记
    • 短暂端口(49152~65535):客户端临时使用
  • 套接字(Socket):IP地址 + 端口号,唯一标识一个通信端点
  • TCP连接:由两个套接字唯一确定 {IP1:port1, IP2:port2}

二、用户数据报协议(UDP)

1. UDP特点

  • 无连接,不建立/释放连接
  • 尽最大努力交付,不保证可靠
  • 面向报文:应用层交给UDP多长的报文,就原样发送(不合并不拆分)
  • 无拥塞控制
  • 支持一对一、一对多、多对一、多对多通信
  • 首部开销小(8字节)

2. UDP首部格式(8字节)

字段 长度 说明
源端口 2字节 需要对方回信时使用,否则填0
目的端口 2字节 交付报文时必须使用
长度 2字节 UDP用户数据报总长度(最小8字节)
检验和 2字节 检测传输是否有错,有错则丢弃

3. UDP检验和计算

  • 伪首部 (12字节):临时添加,用于计算检验和,不向下传送
    • 源IP地址(4)、目的IP地址(4)、全0(1)、协议(1, 17)、UDP长度(2)
  • 计算范围:伪首部 + UDP首部 + 数据(若长度为奇数则补全0字节)
  • 计算方法:二进制反码求和,结果为全1表示无差错

三、传输控制协议(TCP)概述

1. TCP主要特点

  • 面向连接,必须先建立连接,结束后释放
  • 每条TCP连接只能有两个端点(点对点)
  • 可靠交付:无差错、不丢失、不重复、按序到达
  • 全双工通信,两端都有发送缓存和接收缓存
  • 面向字节流
    • TCP把应用程序交下来的数据看成无结构的字节流
    • TCP不知道字节流的含义
    • 接收方应用程序收到的字节流必须与发送方发出的完全一样

2. TCP连接

  • 端点:套接字(Socket)= IP地址 + 端口号
  • TCP连接 = {socket1, socket2} = {(IP1:port1), (IP2:port2)}
  • 同一个IP地址可以有多个TCP连接,同一个端口号可以出现在多个不同连接中

四、可靠传输的工作原理

1. 停止等待协议

原理:发送方每发送一个分组,就停止等待接收方的确认;收到确认后再发下一个。

三种情况

  • 无差错:发送 → 接收 → 确认 → 发送方收到确认 → 发下一个
  • 分组丢失(超时重传):发送方启动超时计时器,超时未收到确认则重传
  • 确认丢失或延迟:若确认丢失,发送方超时重传,接收方收到重复分组则丢弃并重发确认

注意

  • 每发送完一个分组必须暂时保留已发送分组的副本(以备重传)
  • 分组和确认都需要编号,以便识别重复分组
  • 超时计时器时间应略大于平均往返时间RTT

信道利用率:U = Td / (Td + RTT + Ta)(Td为发送时间,Ta为确认发送时间),通常较低。

2. 连续ARQ协议(滑动窗口协议)

  • 流水线传输:发送方可连续发送多个分组,不必每发一个就停下来等待确认
  • 滑动窗口:发送窗口内的分组可以连续发送,收到确认后窗口向前滑动
  • 累积确认:接收方只对按序到达的最后一个分组发送确认,表示该分组之前的所有分组都已正确收到
  • Go-back-N:如果某个分组丢失,发送方重传从丢失分组开始之后的所有分组

五、TCP报文段的首部格式

TCP首部最小20字节,最大60字节(可选字段)。固定部分各字段:

字段 长度 说明
源端口 16位
目的端口 16位
序号 32位 本报文段所发送数据的第一个字节的序号(mod 2^32)
确认号 32位 期望收到对方下一个报文段第一个字节的序号,且确认该序号之前所有数据已收到
数据偏移 4位 TCP首部长度(单位32位字,最小5,最大15)
保留 6位 保留为今后使用,应为0
URG 1位 紧急指针有效
ACK 1位 确认号有效(连接建立后所有报文段ACK=1)
PSH 1位 推送,接收方应尽快交付应用层
RST 1位 复位,连接出现严重差错,释放连接
SYN 1位 同步,用于连接建立(SYN=1表示连接请求或接受)
FIN 1位 终止,用于释放连接
窗口 16位 接收窗口大小(流量控制),单位字节
检验和 16位 计算范围:伪首部+TCP首部+数据
紧急指针 16位 URG=1时有效,指出紧急数据的字节数
可选字段 可变 如MSS(最大报文段长度)、窗口扩大、SACK、时间戳等
填充 可变 使首部长度为4字节的整数倍

关键点

  • 序号:TCP是面向字节流的,序号基于字节编号(不是报文段编号)
  • 确认号:期望收到的下一个序号,同时隐含确认之前所有数据(累积确认)
  • 检验和:与UDP类似,需要伪首部(但协议字段=6)

六、TCP可靠传输的实现

1. 以字节为单位的滑动窗口

窗口概念

  • 发送窗口:允许发送的字节序号范围(由接收窗口和拥塞窗口共同决定)
  • 接收窗口:接收方允许接收的字节数(通过TCP首部的"窗口"字段通告)
  • 滑动 :收到确认后,窗口向前滑动

发送方发送窗口内的三种状态

  • 已发送并已确认(窗口外左侧)
  • 已发送但未确认(窗口内)
  • 允许发送但尚未发送(窗口内)
  • 不允许发送(窗口外右侧)

接收方

  • 接收窗口内的数据:期望收到,收下并缓存
  • 按序到达的数据交给应用层,并滑动窗口
  • 失序到达的数据暂存,等待缺失部分补齐

2. 超时重传时间的选择

  • RTT:报文段发出到收到确认的时间
  • 加权平均RTT(平滑RTT)RTTs = (1-α)·RTTs + α·RTT,α推荐0.125
  • RTT偏差RTTd = (1-β)·RTTd + β·|RTT - RTTs|,β推荐0.25
  • 超时重传时间RTORTO = RTTs + 4·RTTd

Karn算法:发生重传的报文段不用于计算RTT;且当重传时,RTO加倍(指数退避)

3. 选择确认SACK

  • 若接收方收到失序数据,可告知发送方哪些数据已收到(需要SACK选项)
  • 发送方只重传缺失的数据,避免重复传输

七、TCP流量控制

1. 利用滑动窗口实现流量控制

  • 接收方通过TCP首部的"窗口"字段告知发送方自己的接收窗口大小(rwnd)
  • 发送方保证未确认数据量不超过接收窗口
  • 零窗口 :接收窗口=0,发送方停止发送,并启动持续计时器
    • 持续计时器超时后,发送方发送零窗口探测报文(1字节),接收方回复当前窗口

2. 传输效率考虑

  • Nagle算法:减少小分组数量。在已发送数据未确认前,将后续小数据合并发送;或等到数据达到MSS再发
  • 糊涂窗口综合征:接收方每次只通告很小的窗口。解决:接收方窗口小于一定值(如MSS)时通告0;发送方避免发送小数据

八、TCP拥塞控制

1. 拥塞控制的一般原理

  • 拥塞:对网络资源的需求超过可用量,导致性能下降
  • 拥塞控制:全局性过程,防止过多数据注入网络
  • 流量控制:端到端问题,控制发送速率不压垮接收方
  • TCP拥塞控制基于拥塞窗口(cwnd),实际发送窗口 = min(cwnd, rwnd)

2. 几种拥塞控制方法

慢启动(Slow Start)

  • 初始cwnd=1 MSS(或2-4个MSS)
  • 每收到一个ACK,cwnd加倍(指数增长)
  • 直到cwnd ≥ 慢启动阈值(ssthresh)

拥塞避免(Congestion Avoidance)

  • cwnd达到ssthresh后,每经过一个RTT,cwnd增加1 MSS(线性增长)
  • 目的:避免网络拥塞

快重传(Fast Retransmit)

  • 接收方每收到一个失序报文段,立即发送重复ACK(不等待)
  • 发送方连续收到3个重复ACK ,立即重传丢失报文段(不等超时)

快恢复(Fast Recovery)

  • 收到3个重复ACK时:ssthresh = cwnd/2,cwnd = ssthresh + 3 MSS(或直接设为ssthresh)
  • 然后进入拥塞避免阶段

拥塞控制流程图解

复制代码
     cwnd
      |
  慢启动    拥塞避免
  指数增长   线性增长
      |        |
    ssthresh  ssthresh

超时与重复ACK的处理

  • 超时:ssthresh = cwnd/2,cwnd = 1 MSS,重新慢启动(慢启动+拥塞避免
  • 收到3个重复ACK:快重传+快恢复(不回到慢启动)

3. 随机早期检测RED

  • 在路由器中实现,主动检测队列长度,提前以概率丢弃分组(避免全局同步)
  • 使TCP连接在拥塞前就开始减少发送窗口

九、TCP的运输连接管理

1. TCP连接建立(三次握手)

步骤(以客户端A、服务器B为例):

  1. 第一次握手(A → B):A发送SYN=1, seq=x(SYN报文段,不携带数据,消耗一个序号)
  2. 第二次握手(B → A):B收到后,发送SYN=1, ACK=1, seq=y, ack=x+1(SYN+ACK报文段)
  3. 第三次握手(A → B):A收到后,发送ACK=1, seq=x+1, ack=y+1(可携带数据,若不携带则不消耗序号)

连接建立后,全双工通信。

2. TCP连接释放(四次挥手)

  1. 第一次挥手 (A → B):A发送FIN=1, seq=u(FIN报文段,消耗一个序号),A进入FIN-WAIT-1状态
  2. 第二次挥手 (B → A):B收到FIN后,发送ACK=1, seq=v, ack=u+1,B进入CLOSE-WAIT 状态。A收到后进入FIN-WAIT-2状态
  3. 第三次挥手 (B → A):B发送完所有数据后,发送FIN=1, ACK=1, seq=w, ack=u+1,B进入LAST-ACK状态
  4. 第四次挥手 (A → B):A收到FIN后,发送ACK=1, seq=u+1, ack=w+1,A进入TIME-WAIT 状态(等待2MSL),B收到后进入CLOSED状态

2MSL等待(Maximum Segment Lifetime):

  • 保证A最后发送的ACK能到达B(若丢失,B会重发FIN,A可再确认)
  • 防止"已失效的连接请求报文段"出现在新连接中

3. TCP有限状态机

关键状态转换:

  • LISTENSYN-SENT(主动打开)
  • LISTENSYN-RCVD(被动打开)
  • SYN-SENTESTABLISHED(收到SYN+ACK)
  • ESTABLISHEDFIN-WAIT-1(主动关闭)
  • ESTABLISHEDCLOSE-WAIT(被动关闭)
  • TIME-WAITCLOSED(经过2MSL)

十、重要公式与数值总结

公式/数值 说明
UDP首部长度 8字节
TCP首部最小长度 20字节
TCP端口号范围 0~65535
熟知端口 0~1023
TCP序号空间 2^32
RTO = RTTs + 4·RTTd 超时重传时间
慢启动初始cwnd 1~4 MSS
快重传阈值 3个重复ACK
2MSL时间 2 × MSL(通常2分钟)
持续计时器 防止零窗口死锁

十一、UDP与TCP对比总结

特性 UDP TCP
连接 无连接 面向连接
可靠性 不可靠(尽最大努力) 可靠(确认、重传、序号)
流量控制 有(滑动窗口)
拥塞控制 有(慢启动、拥塞避免等)
报文边界 面向报文(保留) 面向字节流(无边界)
首部开销 8字节 20~60字节
通信模式 一对一、一对多、多对一、多对多 点对点
应用示例 DNS, SNMP, 实时音视频 HTTP, FTP, SMTP, Telnet