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 报文结构
- 首部只有 4 个字段,每个字段 2 字节。其中,length 指示了 UDP 报文段中的 首部加数据的字节数。
3.3.2 UDP 检验和(上图中的 checksum)
- 检验和 是 UDP 的差错检测机制。其实现方法是:
- 将 UDP 报文按 16 比特进行分组。
- 将两个 16 比特的数字相加得到一个 32 位的数。
- 将 2 中得到的 32 比特数的 高 16 位和低 16 相加。
- 重复第 2 步直到得到的和的高 16 位为 0。
- 将得到的 16 比特的数按位取反即为 检验和。
- 注:计算之前的检验和为 0
- 如果传输没有出错,则在接收方处计算的的检验和将是
11111111111111
。若不是,则数据有错。
3.4 可靠数据传输原理
3.4.1 构造可靠数据传输协议
在这节将一步步研究一系列协议,它们一个比一个复杂,最后得到一个无错、完全可靠的数据传输协议。
1. 经完全可靠信道的可靠传输协议: rdt 1.0
- 这是最简单的情况,假设底层信道是完全可靠的。
- 有限状态机(FSM):
- 箭头指示了协议从一个状态变迁到另一个状态。
- 引起变迁的事件显示在横线的上方。
- 事件发生时所采取的动作显示在横线的下方。
- ^ 表示什么都不做。
下图是发送方和接收方的 有限状态机:
- 发送方:
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:
- 当发送方处于等待 ACK 或 NAK 的状态时,它不能从上层获得数据。这被称为 停等协议。
2.1 rdt 2.1
- rdt 2.0 中有一个致命的缺陷,就是没有考虑到 ACK 和 NAK 分组受损的可能性。
- 解决这个新问题的一个简单的方法就是在数据分组中添加一个字段,让发送方对其数据分组编号,即将发送数据分组的 序号 放在该字段。
- 于是,接收方只需要检查序号即可确定收到的分组是否一次重传。
- 对于停等协议这种简单的情况,1 比特的序号就足够了。
- 下图是 rdt 2.1 的 FSM:
2.2 rdt 2.2
- 当收到受损的分组时,rdt 2.0 的接收方会发送一个否定确认 NAK。
- 如果不发送NAK,而是对上次正确接收的分组发送一个 ACK,则也能实现和 NAK 一样的效果。
- 下图是 rdt 2.2 的 FSM:
3. 经具有比特差错的丢包信道的可靠数据传输:rdt 3.0
- 现在假定除了比特受损外,底层信道还会丢包。
- 在 rdt 3.0 中,丢包的问题让发送方解决。不管是发送的分组丢失,还是接收方返回的确认分组丢失,只要在经过一定的时延后,让发送方重发该分组即可。由此产生的 冗余数据分组 则由接收方通过序号处理。
- 下图是 rdt 3.0 发送方的 FSM:
- 因为分组序号在 0 和 1 之间交替,因此 rdt 3.0 有时被称为 比特交替协议