Bootstrap

计算机网络 自顶向下方法 第三章 运输层

Tags:计算机网络

第三章 运输层


3.1 概述和运输层服务

3.1.1 运输层和网络层的关系

  • 网络层提供了 主机 之间的逻辑通信。而运输层为运行在 不同主机上的进程 提供逻辑通信。
  • 运输层协议只工作在端系统上。
  • 运输协议能提供的服务受制于底层网络协议的服务模型。
  • 网络层协议,即 IP 协议,其服务模型是 尽力而为交付服务 ,但不做任何的保证。是 不可靠服务

3.1.2 因特网运输层概述

  • UDP 提供了一种不可靠、无连接的服务。
  • TCP 提供了一种可靠的、面向连接的服务。
  • 进程到进程的数据交付和差错检测是两种最低限度的运输层服务,也是 UDP 能提供的仅有的两种服务。

3.2 多路复用与多路分解

  • 多路分解: 将运输层报文段中的数据交付到正确的套接字。
  • 多路复用: 在源主机从不同的套接字中收集数据块,并为每个数据块封装上首部信息从而生成报文段,然后将报文传递到网络层。
  • 运输层多路复用要求:
    • 套接字有唯一标识符。
    • 每个报文段有特殊字符(端口号)来指示该报文段所要交付到的套接字。
    • 端口号:一个 16 比特的数,在 0 ~ 65535 之间。其中 0 ~ 1023 是周知端口号,是受限制的。

3.2.1 无连接的多路复用与多路分解

  • clientSocket = socket(socket.AF_INET, socket.SOCK_DGRAM) 创建一个 UDP 套接字时,系统会自动为该套接字分配一个未被其他 UDP 套接字使用的端口号。
    也可以用clientSocket.bind(('',23333)) 显式的分配一个端口号。
  • 通常,应用程序的客户端让运输层自动地分配端口号,而服务器则分配一个特定的端口号。
  • 一个 UDP 套接字是由一个包含 目的 IP 地址目的端口号二元组 标识的。

3.2.2 面向连接的多路复用与多路分解

  • TCP 套接字是由一个 四元组(源 IP 地址,源端口号,目的 IP 地址,目的端口号)来标识的。

3.3 无连接运输:UDP

  • 选择 UDP 的原因:
    • 关于何时、发送什么数据的应用层控制更为精细。
    • 无需连接建立。
    • 无连接状态。
    • 分组首部开销小。
  • 用 UDP 建立可靠数据传输机制可以在应用层中实现。

3.3.1 UDP 报文结构

UDP 报文段结构
- 首部只有 4 个字段,每个字段 2 字节。其中,length 指示了 UDP 报文段中的 首部加数据的字节数

3.3.2 UDP 检验和(上图中的 checksum)

  • 检验和 是 UDP 的差错检测机制。其实现方法是:
    1. 将 UDP 报文按 16 比特进行分组。
    2. 将两个 16 比特的数字相加得到一个 32 位的数。
    3. 将 2 中得到的 32 比特数的 高 16 位和低 16 相加。
    4. 重复第 2 步直到得到的和的高 16 位为 0。
    5. 将得到的 16 比特的数按位取反即为 检验和。
      • 注:计算之前的检验和为 0
      • 如果传输没有出错,则在接收方处计算的的检验和将是 11111111111111。若不是,则数据有错。

3.4 可靠数据传输原理

3.4.1 构造可靠数据传输协议

在这节将一步步研究一系列协议,它们一个比一个复杂,最后得到一个无错、完全可靠的数据传输协议。

1. 经完全可靠信道的可靠传输协议: rdt 1.0
  • 这是最简单的情况,假设底层信道是完全可靠的。
  • 有限状态机(FSM):
    • 箭头指示了协议从一个状态变迁到另一个状态。
    • 引起变迁的事件显示在横线的上方。
    • 事件发生时所采取的动作显示在横线的下方。
    • ^ 表示什么都不做。
      下图是发送方和接收方的 有限状态机
      rdt 1.0
  • 发送方:
    • rdt_send(data): 接收较高层的数据。
    • make_pkt(data): 将数据打包成分组。
    • udt_send(packet): 将分组发送到信道中。
  • 接收方:
    • rdt_rcv(data): 从底层信道接收一个分组。
    • extract(packet,data): 从分组中取出数据。
    • deliver_data(data): 将数据传送给较高层。
2. 经具有比特差错信道的可靠数据传输:rdt 2.0
  • 假设底层信道传输的数据可能会有比特差错。但是仍然不会丢包。
  • 在接收方的协议中加入:
    • 差错检测
    • 接收方反馈
      • 肯定确认(ACK)
      • 否定确认(NAK)
    • 重传
      接收到有差错的分组时,发送方重传该分组。
  • 下图是 rdt 2.0 的 FSM:
    rdt 2.0
    • 当发送方处于等待 ACK 或 NAK 的状态时,它不能从上层获得数据。这被称为 停等协议
2.1 rdt 2.1
  • rdt 2.0 中有一个致命的缺陷,就是没有考虑到 ACK 和 NAK 分组受损的可能性。
  • 解决这个新问题的一个简单的方法就是在数据分组中添加一个字段,让发送方对其数据分组编号,即将发送数据分组的 序号 放在该字段。
  • 于是,接收方只需要检查序号即可确定收到的分组是否一次重传。
  • 对于停等协议这种简单的情况,1 比特的序号就足够了。
  • 下图是 rdt 2.1 的 FSM:
    rdt 2.1 sender
    rdt 2.1 receiver
2.2 rdt 2.2
  • 当收到受损的分组时,rdt 2.0 的接收方会发送一个否定确认 NAK。
  • 如果不发送NAK,而是对上次正确接收的分组发送一个 ACK,则也能实现和 NAK 一样的效果。
  • 下图是 rdt 2.2 的 FSM:
    rdt 2.2 sender
    rdt 2.2 receiver
3. 经具有比特差错的丢包信道的可靠数据传输:rdt 3.0
  • 现在假定除了比特受损外,底层信道还会丢包。
  • 在 rdt 3.0 中,丢包的问题让发送方解决。不管是发送的分组丢失,还是接收方返回的确认分组丢失,只要在经过一定的时延后,让发送方重发该分组即可。由此产生的 冗余数据分组 则由接收方通过序号处理。
  • 下图是 rdt 3.0 发送方的 FSM:
    rdt 3.0 sender
  • 因为分组序号在 0 和 1 之间交替,因此 rdt 3.0 有时被称为 比特交替协议
;