# (一)、传输层的基本服务

  1. 传输层功能
    传输层在网络提供的主机间分组传输服务的基础上,扩展到运行在不同主机上的进程之间的报文传输,并且实现了进程间的端到端传输服务,从而使得网络应用只需关注进程间的端到端通信,而不必关心底层网络采用了什么技术、底层网络如何传输数据等,为网络应用使用网络提供了抽象模式,简化了网络应用开发过程。
  2. 传输层寻址与端口
    • 寻址:TCP/IP 体系结构网络的解决办法是在传输层使用协议端口号,利用IP地址+端口号标识一个通信端点。
    • 端口:由 16 位 2 进制数组成,可以编号 65536 个。其中0~1023为熟知端口号,1024~49151为登记端口号,49152~65535为客户端口号或短暂端口号。
  3. 无连接服务与面向连接服务
    • 无连接服务:数据传输之前无需与对端进行任何信息交换(握手),直接构造传输层报文段并向接收端发送。
    • 面向连接:在数据传输之前,需要双方交换一些控制信息,建立逻辑连接,然后再传输数据,数据传输结束后需要再拆除数据。

# (二)、传输层的复用与分解

支持众多应用进程共用一个传输层协议,并将接收到的数据准确交互给不同的应用进程,称为传输层的多路复用与多路分解。
实现复用与分解的关键是传输层协议能唯一标识一个套接字。

  1. 无连接的多路复用与多路分解
    真正唯一标识一个 UDP 套接字的是一个二元组:<目的IP地址、目的端口号>
  2. 面向连接的多路复用与多路分解
    TCP 的套接字是一个四元组:<源IP地址、源端口号、目的IP地址、目的端口号>

# (三)、停-等协议与滑动窗口协议

  1. 可靠数据传输基本原理
    理想的传输信道是不产生差错(比特差)并提供按序交付服务的物理或逻辑信道,则不需要任何措施就能实现可靠数据传输。然而,大部分传输信道都不是理想信道。
    不可靠信道的不可靠性主要表现在:首先,可能发生比特差错(即 0 错成 1 或 1 错成 0)。其次,可能出现乱序(先发的数据报后到达,后发先到)。最后,可能出现数据丢失。
    实现可靠数据传输的措施主要包括几个方面:
    • 差错检测(利用差错码)
    • 确认 (ACK 肯定确认数据包,NAK 否定确认数据包)
    • 重传 (收到 NAK 数据包后重新发送数据包)
    • 序号 (确保数据按序提交,避免数据乱序到达)
    • 计时器 (解决数据丢失问题)
  2. 停-等协议
    自动请求重传协议:ARQ(Automatic RepeatreQuest),最简单的 ARQ 协议就是停-等协议。
    停-等协议的主要特点就是每发送一个报文段后就停下来等待接收方的确认,这也是该协议名称的基本含义。
    基本工作过程:
    • 发送方发动经过差错编码和编号的报文段,等待接收方的确认。
    • 接收方如果正确接收报文段,即差错检测无误且序号正确,则接收报文段,并向发送方发送 ACK,否则丢弃报文段,并向发送方发送 NAK。
    • 发送方如果收到 ACK,则继续发送后续报文段,否则重发刚刚发送的报文段。
      仍然存在许多的变化或细节需要讨论:
    • 关于差错检测:ACK 或 NAK 数据包也可能出现比特差,需要进行差错编码以便进行差错检测。
    • 关于序列号: 停-等协议序列号只需要 1 位就足够了,用来区分是新发的还是重传的报文段。
    • 关于 ACK 和 NAK:实际的协议设计过程中,通常不使用 NAK,而只使用 ACK 进行确认。在 ACK 数据包中带上所确认的报文段序列号,利用重复 ACK 替代 NAK。
    • 关于 ACK 和 NAK 差错:发送方采取“有错推断”原则。
  3. 滑动窗口协议
    停等协议是一个功能正确的协议,但其性能通常不让人满意,它的主要性能问题在于降低了信道利用率。解决该性能问题的方法是:不使用停止-等待的运行方式,允许发送方在没有收到确认前连续发送多个分组。这种协议成为流水线协议或管道协议。
    相对于停-等协议,流水线协议实现可靠数据传输,需要做两点改进:1.增加分组序号范围;2.协议的发送方和接收方必须缓存多个分组。
    最典型的流水线可靠传输协议是滑动窗口协议。
    滑动窗口协议根据采用的确认、计时以及窗口大小等机制的不同,可以有不同类型的滑动窗口协议设计。两种最具有代表性的滑动窗口协议是:
    • 回退 N 步(GO-Back-N, GBN)协议
      发送窗口 ws、接收窗口 wr、基序号、下一个可用序号
      Ws=n,Wr=1,如果计时器超时,发送方从“第一个未确认序号 n”开始全部重发。
    • 选择重传(Selective Repeat, SR)协议
      Ws=n,Wr=n,如果计时器超时,发送方只重发未确认的分组。

# (四)、用户数据报协议(UDP)

用户数据报协议 UDP 是 Internet 传输层协议,提供无连接、不可靠、数据报尽力传输服务。
DNS 是一个使用 UDP 的应用层协议。
适合使用 UDP 的四个原因:1.应用进程更容易控制发送什么数据以及何时发送。2.无需建立连接。3.无连接状态。4.首部开销小。

  1. UDP 数据报结构
    • UDP 首部长度固定是 8 个字节
    • 首部固定包含 4 个字段,每个字段 2 个字节
    • 源端口号+目的端口号,每个字段各占 16 个 Bit
    • 长度+校验和,每个字段各占 16 个 Bit
  2. UDP 校验和
    UDP 校验和提供了差错检测功能。也就是说,UDP 的校验和用于检测 UDP 报文段从源到目的地传送过程中,其中的数据是否发生了变化。

# (五)、传输控制协议(TCP)

传输控制协议(TCP)是 Internet 一个重要的传输层协议。TCP 提供面向连接、可靠有序、字节流、全双工服务。

# TCP 报文段结构

TCP 报文段由首部(20 个字节固定首部+(选项字段、填充字段))字段和一个数据字段组成。固定头部 20 字节(160bit), 各个部分的含义, 重点掌握序号、确认序号字段,有计算。

  • 源端口号和目的端口号字段分别占 16 个 bit 位。(16BIT 端口号+32BIT 的 IP 地址,构成 SOCKET)
  • 序号字段(由发送方填写)占 32 位。序号:TCP 传送的报文段可看成连续的数据流,每个字节都对应一个序号,“序号”指本报文段所发送的数据中第一个字节的序号。
  • 确认序号字段(由接收方填写)占 32 位。确认序号:是指期望接收到对方的下一个报文段的数据的第一个字节的序号。
  • 首部长度(又称数据偏移)占 4 位。首部偏移的计算单位是 32bit(4 个字节),首部长度占 4 位,能表示的最大十进制数是 15,即首部长度的最大值可为 60 字节。
  • 保留字段占 6 位,保留为今后使用,目前为 0。
  • 6 个标志位字段各占 1 位。
    • 紧急比特 URG URG=1 时,表明紧急指针字段有效,发送应用进程应该告诉发送 TCP 此报文段中有紧急数据,应该尽快发送。
    • 确认比特 ACK 只有当 ACK=1 时确认字段才有效
    • 推送比特 PSH TCP 收到 PSH=1 的报文段时,就尽快将报文段中的数据交付接收应用进程,而不再等到整个缓存都填满了后再向上交付。
    • 复位比特 RST RST=1 时,表示 TCP 连接中出现严重差错,必须释放连接再重新建立。
    • 同步比特 SYN 在连接建立时用来同步序号。当 SYN=1 而 ACK=0 时,表明这是一个连接请求报文。
    • 终止比特 FIN 释放一个连接。
  • 接收窗口字段占 16 位。 接收端的缓存窗口。
  • 校验和字段占 16 位
  • 紧急指针字段占 16 位
  • 选项字段,长度可变
  • 填充字段,长度 0~3 字节,取值全 0,其目的是为了使整个首部长度是 4 字节的整数倍。
  • image
  • TCP 报文各字段格式详解 (opens new window)

# TCP 连接管理

  1. TCP 连接管理包括建立连接与连接拆除。TCP 连接通过“三次握手”过程。三次握手的目的是连接服务器指定端口,建立 TCP 连接,并同步连接双方的序列号和确认号,交换 TCP 窗口大小信息。在 socket 编程中,客户端执行 connect() 时。将触发三次握手。
    • 第一次握手(SYN=1, seq=x):
      该报文段(SYN 报文段)中不包含应用层数据,其首部中的同步位 SYN=1,并选择初始序列号 seq=x,表明传送数据时的第 1 个数据字节的序号是 x。
      客户端发送一个 TCP 的 SYN 标志位置 1 的包,指明客户端打算连接的服务器的端口,以及初始序号 X,保存在包头的序列号(Sequence Number)字段里。发送完毕后,客户端进入 SYN_SEND 状态。
    • 第二次握手(SYN=1, ACK=1, seq=y, ack_seq=x+1):
      一旦包含 SYN 报文段的 IP 数据报到达主机 B,主机 B 的 TCP 收到连接请求段后,如同意,则发回确认报文段(SYNACK 段)。SYNACK 报文段表明:主机 B 收到了主机 A 发起建立连接的 SYN 报文段,该段的初始序号为 x,且主机 B 同意建立连接,主机 B 的初始序号是 y。与 SYN 报文段类似,SYNACK 报文段不包含应用层数据,但是也要消耗掉 1 个序号,即初始序号 y。
      服务器发回确认包(ACK)应答。即 SYN 标志位和 ACK 标志位均为 1。服务器端选择自己 ISN 序列号,放到 Seq 域里,同时将确认序号(Acknowledgement Number)设置为客户的 ISN 加 1,即 X+1。 发送完毕后,服务器端进入 SYN_RCVD 状态。
    • 第三次握手(ACK=1,ack_seq=y+1):
      主机 A 收到 SYNACK 报文段后,向主机 B 发送确认报文段,该报文段是对主机 B 的同意连接报文段确认,其中 ACK=1,SYN=0,seq=x+1,ack_seq=y+1。第三次握手的 ACK 报文段可以携带从主机 A 到主机 B 的应用层数据。
      客户端再次发送确认包(ACK),SYN 标志位为 0,ACK 标志位为 1,并且把服务器发来 ACK 的序号字段+1,放在确定字段中发送给对方,并且在数据段放写 ISN 的+1。发送完毕后,客户端进入 ESTABLISHED 状态,当服务器端接收到这个包时,也进入ESTABLISHED 状态,TCP 握手结束。
    • image
  2. TCP 连接建立成功后,便为使用该连接的双方应用进程之间提供了一条端到端全双工的可靠字节流逻辑通信信道,双方应用进程可以使用该连接收发数据。当通信结束时,使用 TCP 连接的两个进程中的任何一方都可以首先请求终止该连接,即断连。当连接断开后,主机分配给该连接的“资源”将被释放。TCP 释放连接过程为“四次挥手过程”。
    • 第一次挥手(FIN=1,seq=x)
      主机 A 向主机 B 发送释放连接报文段,其首部的 FIN=1,序号 seq=x,等待主机 B 的确认
    • 第二次挥手(ACK=1,ack_seq=x+1,seq=v)
      主机 B 向主机 A 发送确认段,ACK=1, 确认序号 ack_seq=x+1,序号 seq=v。
    • 第三次挥手(FIN=1,ack_seq=x+1, seq=w)
      主机 B 向主机 A 发送释放连接报文段,FIN=1,seq=w,ack_seq=x+1。
    • 第四次挥手(ACK=1,seq=x+1,ack_seq=w+1)
      主机 A 向主机 B 发送确认段,ACK=1,seq=x+1,ack_seq=w+1。主机 B 收到该确认段,可以马上释放连接;主机 A 在发出该确认段后,延迟一段时间即释放连接。
    • image

# TCP 可靠数据传输

  1. TCP 能够提供可靠数据传输服务,是通过以下机制来实现
    • 应用数据被分割成 TCP 认为最适合发送的数据块(通常是 MSS),封装成 TCP 段,传递给 IP。
    • 当 TCP 发出一个段后,启动一个计时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,则认为该报文段丢失,将重发这个报文段。当 TCP 收到发自 TCP 连接另一端的数据,将发送一个确认段。
    • TCP 首部设有校验和字段,用于检测数据在传输过程中是否发生差错。
    • 由于 TCP 报文段封装到 IP 数据报中传输,而 IP 数据报的到达可能会经过不同的路径从而造成顺序的错乱。因此 TCP 报文段的到达可能会失序。如果必要,TCP 将根据序号对收到的数据进行重新排序,将收到的数据以正确的顺序交付给应用层。
    • 由于存在网络延迟和重传机制,TCP 的接收端有可能会收到多个重复的报文段,这时接收端需要根据序号把重复的报文段丢弃。
    • TCP 能够提供流量控制。TCP 连接的每一方都在建立时分配一定大小的接受缓冲空间。TCP 的接收端只允许另一端发送接收端缓冲区所能接纳的数据。这可以防止较快主机发送数据太快,导致较慢主机的缓冲区溢出。
  2. 发送方有 3 个与发送和重传有关的事件
    • 从上层应用程序接受数据
    • 定时器超时
    • 收到 ACK
  3. TCP 的确认与重传的典型场景
  4. TCP 接收方生成 ACK 的 4 种策略
  5. TCP 快速重传
    快速重传算法的基本思想是:接收端每收到一个失序的报文段后就立即发出重复确认,以便更早的通知发送端有丢包的情况发生。

# TCP 流量控制

流量控制的目的是协调协议发送方与接收方的数据发送与接受速度,避免因发生方发送数据太快,超出接收方的数据接收和处理能力,导致接收方数据“淹没”,即数据到达速度超出接收方的接收、缓存或处理额能力,导致数据在接收方被丢弃。

# TCP 拥塞控制

拥塞是指太多主机以太快的速度向网络中发送太多的数据,超出了网络处理能力,导致大量数据被分组“拥挤”在网络中间设备(如路由器)队列中等待转发,网络性能显著下降的现象。
拥塞导致后果:数据分组通过网络的时延显著增加;由于队列满导致大量分组被丢弃。

  1. TCP 拥塞控制
    • 分为拥塞未发生和拥塞发生两种情况
    • 拥塞未发生,发送方加快发送速度,直到网络不能承受
    • 拥塞发生,根据接收方的不同响应,发送方做不同的降速
  2. 拥塞未发生时分两个阶段:慢启动和拥塞避免
    • 两个参数:发送拥塞窗口大小、阈值,时间单位是MSS
    • 慢启动:窗口低于阈值时,每过一个 RTT,窗口翻倍。(1,理解课本 P125 图;2,直到窗口大于等于阈值,从慢启动切换到拥塞避免)
    • 拥塞避免:每过一个 RTT,窗口+1,直到拥塞发生
    • 注意:阀值和拥塞是否发生无关,只是控制阶段切换
  3. 拥塞发生时分两种情形:3 次重复确认、超时
    • 两个参数:发送拥塞窗口大小、阈值、时间单位是 MSS
    • 3 次重复确认(快速恢复算法,TCP-Reno 版本)
      • 状态设为拥塞避免
      • 阈值设为当前拥塞窗口一半
      • 拥塞窗口也设为当前拥塞窗口一半
    • 超时(快速重传算法,TCP-Tahoe 版本)
      • 状态切换回慢启动
      • 阈值设为当前拥塞窗口一半
      • 拥塞窗口置 1

# 参考阅读

考核内容与要求

  • 传输层的基本服务
    • 识记:传输层基本服务
    • 领会:复用与分解的基本概念;UDP 与 TCP 实现复用与分解的方法;无连接服务与面向连接服务。
  • 用户数据报协议(UDP)
    • 识记:UDP 特点;UDP 数据报结构
    • 领会:UDP 校验和及其计算
  • 停-等协议与滑动窗口协议
    • 领会:可靠数据传输基本原理;停-等协议工作原理;滑动窗口协议工作原理。
    • 应用:停-等协议信道利用率计算;滑动窗口协议信道利用率计算;滑动窗口协议窗口大小与分组序号字段位数之间的约束关系。
  • 传输控制协议(TCP) - 领会:TCP 特点;TCP 报文段结构;TCP 的可靠数据传输机制;TCP 报文段序号与确认序号;TCP 连接建立过程与连接拆除过程;TCP 计时器超时时间设置;TCP 的流量控制;拥塞控制基本概念;TCP 的拥塞控制。
    • 应用:TCP 报文段序号与确认序号的变化;TCP 流量控制窗口、拥塞窗口、发送窗口的变化。
      本章重点、难点 本章重点是可靠数据传输的基本原理、停-等协议、典型滑动窗口协议(GBN 协议、SR 协议),TCP 的报文段结构、TCP 连接建立与断开过程、TCP 序列号以及确认序列号、TCP 可靠数据传输的机制、TCP 拥塞控制方法。
      本章难点是停-等协议与滑动窗口协议的理解与信道利用率的计算、TCP 的链接管理、TCP 报文段序列号、TCP 的拥塞控制方法。