Chapter 5

传输层

端到端通信的核心:TCP可靠传输与UDP高效传输

5.1传输层概述

传输层核心功能 HOT

  • 端到端通信(进程到进程),区别于网络层的主机到主机
  • 复用和分用:多个进程共用网络层,通过端口号区分
  • 差错控制、流量控制、拥塞控制
  • 传输单位:TCP报文段、UDP用户数据报

端口号 KEY

  • 范围:0-65535
  • 熟知端口(0-1023):FTP(21)、SSH(22)、SMTP(25)、DNS(53)、HTTP(80)、HTTPS(443)
  • 登记端口(1024-49151)
  • 动态端口(49152-65535)

无连接服务与面向连接服务

对比项 面向连接(TCP) 无连接(UDP)
连接建立必须建立连接(三次握手)无需建立连接
可靠性可靠传输(序号+确认+重传)不可靠,尽力而为
传输方式面向字节流面向数据报
流量控制有(滑动窗口)
拥塞控制有(慢开始/拥塞避免等)
首部开销大(20字节+选项)小(8字节)
适用场景文件传输、网页浏览、邮件视频语音、实时游戏、DNS查询
是否按序保证按序交付不保证按序
通信端点一对一(全双工)一对一、一对多、多对多

5.2TCP协议

TCP特点 HOT

  • 面向连接、可靠传输、面向字节流
  • 全双工通信
  • 有流量控制和拥塞控制
  • 报文段格式:源端口、目的端口、序号、确认号、数据偏移、标志位、窗口、校验和
  • TCP报文段首部:
    • 源端口(2字节):发送方端口号
    • 目的端口(2字节):接收方端口号
    • 序号(4字节):本报文段数据第一个字节的序号
    • 确认号(4字节):期望收到对方下一个字节的序号,ACK=1时有效
    • 数据偏移(4位):TCP首部长度,以4字节为单位,最大60字节
    • 保留(6位):预留,设为0
    • 标志位(6位):
      • URG:紧急指针有效
      • ACK:确认号有效
      • PSH:推送操作,立即交付应用层
      • RST:复位连接
      • SYN:同步序号,建立连接用
      • FIN:发送方数据发完,释放连接
    • 窗口(2字节):接收窗口大小rwnd,用于流量控制
    • 校验和(2字节):强制检验,含伪首部
    • 紧急指针(2字节):URG=1时有效,紧急数据字节数
    • 选项:MSS、窗口扩大、时间戳、SACK等,最多40字节

TCP三次握手

动画
步骤 0 / 5
点击播放按钮开始动画演示

三次握手详解 HOT

  • 第一次:Client → Server,SYN=1,seq=x
  • 第二次:Server → Client,SYN=1,ACK=1,seq=y,ack=x+1
  • 第三次:Client → Server,ACK=1,seq=x+1,ack=y+1
  • 为什么不能两次:防止失效连接请求到达服务器

TCP四次挥手

动画
步骤 0 / 5
点击播放按钮开始动画演示

四次挥手详解 HOT

  • 第一次:Client → Server,FIN=1,seq=u
  • 第二次:Server → Client,ACK=1,seq=v,ack=u+1
  • 第三次:Server → Client,FIN=1,ACK=1,seq=w,ack=u+1
  • 第四次:Client → Server,ACK=1,seq=u+1,ack=w+1
  • TIME_WAIT状态:等待2MSL后关闭
  • 为什么需要TIME_WAIT:
    1. 确保最后一个ACK到达(若Server未收到ACK,可重传FIN,Client重新发送ACK)
    2. 防止失效的连接请求报文段出现在本连接中(让本连接期间产生的所有报文段从网络中消失)

TCP可靠传输机制 HOT

  • TCP通过以下机制保证可靠传输:
    1. 序号(seq):TCP首部有序号字段,数据的每一个字节都有编号
      • 序号字段值指本报文段所发送数据的第一个字节的序号
      • 初始序号(ISN):连接建立时随机选择
    2. 确认(ACK):累计确认,确认号表示期望收到对方下一个字节的序号
      • ACK=1时确认号字段才有效
      • 收到不连续的数据时,先缓存,等缺失部分到达后再上交
      • TCP通常采用延迟确认(收到两个最大报文段或延迟500ms内发送ACK)
    3. 超时重传:发送方在规定时间内未收到确认,重传报文段
      • 重传超时时间(RTO):动态计算,略大于加权平均往返时间RTT_s
      • Karn算法:重传报文段的往返时间样本不被采用,避免二义性
      • 超时重传时RTO加倍(指数退避)
    4. 选择确认(SACK):接收方告知发送方哪些数据已收到,只重传丢失的
      • 需要在选项字段中携带SACK信息
      • 提高传输效率,类似数据链路层的选择重传
  • 快重传:收到3个重复ACK就立即重传,不必等待超时(见拥塞控制部分)

TCP流量控制 KEY

  • 目的:让发送方的发送速率不超过接收方的处理能力,防止接收方缓存溢出
  • 方法:滑动窗口机制,接收方在TCP首部的窗口字段通知自己的接收窗口大小(rwnd)
  • 发送窗口 = min(拥塞窗口cwnd, 接收窗口rwnd)
  • 流量控制过程:
    1. 建立连接时,双方通告自己的初始窗口大小
    2. 接收方在ACK中携带当前窗口大小
    3. 发送方根据接收窗口调整发送量
    4. 接收窗口=0时,发送方停止发送数据
  • 死锁问题:接收方发送了窗口为0的ACK后,后续发送的非零窗口通知丢失,发送方一直等待
    • 解决方法:发送方设置持续计时器,窗口为0时定期发送探测报文(1字节),询问接收窗口大小
  • 糊涂窗口综合征:发送方每次只发少量数据,导致大量小报文,效率低
    • 解决:Nagle算法——收集足够数据再发送,或接收方延迟确认
    • Nagle算法:数据积累到一个MSS或收到ACK时才发送
发送窗口大小 = min(cwnd, rwnd)

5.3TCP拥塞控制

拥塞控制算法 HOT

  • 慢开始:cwnd从1开始,每RTT翻倍(指数增长)
  • 拥塞避免:cwnd每RTT加1(线性增长)
  • 快重传:收到3个重复ACK立即重传
  • 快恢复:ssthresh=cwnd/2,cwnd=ssthresh,执行拥塞避免
  • ssthresh(慢开始门限):cwnd达到ssthresh时由慢开始转为拥塞避免

拥塞控制窗口变化曲线

动画
步骤 0 / 27
点击播放按钮开始动画演示

5.4UDP协议

UDP特点

  • 无连接、不可靠、面向数据报
  • 无流量控制和拥塞控制
  • 首部仅8字节:源端口(2)+目的端口(2)+长度(2)+校验和(2)
  • 适用场景:DNS、视频、语音等实时应用

UDP数据报与检验

  • UDP首部(8字节):
    • 源端口:2字节,发送方端口,可选(不需要时填0)
    • 目的端口:2字节,接收方端口,必须
    • 长度:2字节,UDP首部+数据的总长度,最小值为8
    • 校验和:2字节,可选,全0表示不检验
  • UDP检验和计算:
    • 计算时需加上伪首部(12字节):源IP(4)+目的IP(4)+0(1)+协议(1)+UDP长度(2)
    • 伪首部不传输,仅用于校验,确保数据报送达正确的主机和进程
    • 检验范围:伪首部 + UDP首部 + UDP数据
    • 计算方法:二进制反码求和,结果取反填入校验和字段
    • 接收方重新计算,若结果全1(即无错误),则通过
    • UDP检验和是可选的(与TCP不同,TCP是强制的)
  • 注意:
    • UDP是面向报文的,对应用层交下来的报文,添加首部后直接交给网络层
    • 一次发送一个UDP报文,报文边界不合并也不拆分
    • 没有流量控制和拥塞控制,适合实时应用(音视频、游戏)

TCP vs UDP 对比

比较项 TCP UDP
连接方式 面向连接 无连接
可靠性 可靠传输 不可靠
传输方式 字节流 数据报
首部大小 20字节 8字节
流量控制
拥塞控制
适用场景 HTTP/FTP/SMTP DNS/视频/语音