本篇笔记是 计算机网络-自顶而下分析 第六版 第三章的学习笔记。
基本概念
运输层协议是运行在端系统而不是在路由器中实现的。在发送端,运输层将从发送应用程序进程接收到的报文转换成运输层分组,用因特网术语来讲该分组称为运输层报文段 segment。实现的方法(可能)是将应用报文划分为较小的块,并为每块
加上一个运输层首部以生成运输层报文段 然后,在发送端系统中,运输层将这些报文段传递给网络层,网路层将其封装成网络层分组(即数据报)并向目的地发送。:网络路由器仅作用于该数据报的网络层字段;即它们不检查封装在该数据报的运输层报文段的字段 在接收端,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层 运输层则处理接收到的报文段,使该报文段中的数据为接收应用进程使用。
与网络层的关系
网络层提供了主机之间的逻辑通信,而运输层为运行在不同主机上的进程之间提供了逻辑通信。然而,即使底层网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务。即使底层网络协议是不可靠的,也就是说网络层协议会使分组丢失、篡改和冗余,运输协议也能为应用程序提供可靠的数据传输服务。
概述运输层服务
因特网网络层协议有一个名字叫 IP ,即网际协议 IP 主机之间提供了逻辑通信 IP 的服务模型是尽力而为交付服务( besl- e[[ort delivery service)。这意味着 IP 尽它”最大的努力”在通信的主机之间交忖报文段,但它并不做任何确保
特别是,它不确保报文段的交付 不保证报文段的按序交付,不保证报文段数据的完整。由于这些原因, IP 被称为不可靠服务 (unreliable service) 在此还要指出的是,每台主机至少有一个网络层地址,即所谓的 IP 地址。
UDP TCP 最基本的责任是,将两个端系统间 的交付服务扩展为运行在端系统上的两个进程之间的交付服务 将主机间交付扩展到进程间交付被称为运输层的多路复用( transport -layer multiplexing) 与多路分解( demultiplexing) 。
与 IP 一样, UDP 也是一种不可靠的服务,即不能保证一个进程所发送的数据能够完整无缺地(或全部! )到达目的进程。
TCP 为应用程序提供了几种附加服务 首先,它提供可靠数据传输( reliable dala tTansfer) 通过使用流量控制、序号、确认和定时器(本章将详细介绍这些技术), TCP 确保正确地、按序地将数据从发送进程交付给接收进程。
TCP 还提供拥塞控制( congestion conlrol) 。TCP 力求为每个通过一条拥塞网络链路的连接平等地共享网络链路带宽 这可以通过调节 TCP 连接的发送端发送进网络的流量速率来做到 在另一方面, UDP 流量是不可调节的 使用 UDP 传输的应用程序可以根据其需要以其愿意的任何速率发送数据。
多路复用和多路分解
如何实现
多路复用的要求是
- 套接宇有唯一标识符
- 每个报文段有特殊字段来指示该报文段所要交付到的套接字
这些特殊字段是源端口号字段 (source port oumber field) 和目的端口号字段 (destination port nurnber field)。端口号’是一个 16 比特的数,其大小在 0-65535。
0-1023 范围的端口号称为周知端口号( well- known porl number) ,是受限制的,这是指它们保留给诸如 HTTP (它使用端口号 80) 和盯’p (它使用端口号 1)之类的周知应用层协议来使用。
假设主机 A B 进行 UDP 通信,主机 能够运行多个进程,每个进程有自己的 UDP 套接字及相应的端口号。当从网络到达 UDP 报文段时,主机 通过检查该报文段中的目的端口号,将每个报文段定向(分解)到相应的套接字。
一个 UDP 套接字是由一个二元组来全面标识的,该二元组包含一个目的 地址和一个目的端口号。
服务器主机可以支持很多并行的 TCP 套接字,每个套接字与一个进程相联系,并由其四元组(源地址,源端口,目的地址,目的端口)来标识每个套接字。
无连接服务 UDP
报文结构
UDP 首部只有 4 个字段(源端口号,目的端口号,长度,检验和),每个字段由两个字节组成。长度字 32 比特段指示了在 UDP 报文段中的字节数(首部加数据) 。因为数据字段在一个 UDP 段中不同于另一个段中,需要一个明确的长度。接收方使用检验和来检查该报文段中是否出现了差错。
UDP 检验和
发送方的 UDP 对报文段中的所有 16 比特字的和进行反码运算,求和时遇到的任何溢出都被回卷。得到的结果被放在 UDP 报文段中的检验和字段。在接收方,如果没有差错,全部的数据段 16 比特字加上检验和的和将是 1111111111111111。
为什么 UDP 提供了检验和。许多链路层协议,包括流行的以太计算机网协议,也提供了差错检测,其原因是不能保证源和目的之间的所有链路都提供插座检测。这就是说,也许这些链路中的一条可能使用没有差错检测的协议。此外,即使报文段经链路正确地传输,当报文段存储在某台路由器的内存中时,也可能引入比特差错。在既无法确保连链路的可靠性,又无法确保内存中的差错检测的情况下,如果端到端数据传输服务要提供差错检测, UDP 就必须在端到端基础上在运输层提供差错检测。这是 个在系统设计巾被称颂的端到端原则( end - end principle)。
因为假定 IP 是可以运行在任何第二层协议之上的,运输层提供差错检测作为 种保险措施是非常有用的 虽然 UDP 提供差错检测,但它对差错恢复无能为力。 UDP 的某种实现只是丢弃受损的报文段; 其他实现是将受损的报文段交给应用程序并给出警告。
可靠数据传输原理
本节一步步研究一系列协议,逐步构建一个无错、可靠的数据传输协议。
经完全可靠信道的可靠传输 rdt 1.0
首先考虑最简单的情况,即底层信道是完全可靠的。
在这个简单的协议中,一个单元数据与一个分组没差别。,所有计算机#### 经具有比特差错信道的可靠数据传输 rdt 2.0
底层信道更为实际的模型是分组中的比特可能受损 在分组的传输、传播或缓存的过程中,这种比特差错通常会出现在网络的物理部件中 我们眼下还将继续假定所有发送的分组(虽然有些比特可能受损)将按其发送的顺序被接收。
协议使用了肯定确认与否定确认,这种形式使得接收方可以让发送方知道那些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这种重传机制的可靠传输协议被称为 自动重传请求(Automatic Repeat reQuest,ARQ)协议。
ARQ 协议还需要另外三种协议功能来处理存在比特差错的情况。
- 差错检测 需要一种机制以使接收方检测到何时出现了比特差错
- 接收方反馈 因为发送方和接收方通常在不同端系统上执行,可能相隔数千英里,发送方要了解接收方情况(此时为分组是再被正确接收)的唯一途径就是让接收方提供明确的反馈信息给发送方
- 重传 接收方收到有差错的分组时,发送方将重传该分组文
目前该协议有一个致命缺陷,没有考虑到 ACK 或者 NAK 分组受损的可能性。
可以在发送方收到受损的 ACK 或 NAK 分组时,重传当前数据分组,但是这种方法引入了 冗余分组,其根本困难在于接收方不知道它上次所发送的 ACK 或者 NAK 是否被发送方正确地收到,因此它无法事先知道接收到的分组是新的还是一次重传。
解决这个问题的一个简单方法,是在数据分组增加一个新字段,让发送方对其数据分组编号,即将发送数据的分组的序号放在该字段,接收方只需要检查序号即可确定收到的分组是否一次重传。对于停等协议,1 比特序号就足够了,因为它可以让接收方知道发送方是否正在重传前一个发送分组(接收到的分组序号与最近收到的分组序号相同),或是一个新分组(序号变化了)。
具有比特差错的丢包信道的可靠数据传输 rdt 3.0
问题是怎么检测丢包以及发生丢包后该做什么。为了解决检测丢包的问题,还需要增加新的协议机制。
假定发送方传输一个数据分组,该分组或者接收方对该分组的 ACK 发生了丢失,如果发送方愿意等待足够长的时间以便确定分组已丢失,则它只需要重传该数据分组即可。这个时间至少应当是发送方和接受方之间的一个往返时延,加上接收方处理一个分组所需要的时间。
为了实现基于时间的重传机制,需要一个倒计数定时器。发送方需要做到:1. 每次发送一个分组时,启动一个定时器 2. 响应定时器中断 3. 终止定时器
流水线可靠数据传输协议
上述 rdt 3.0 协议的问题在于它是一个停等协议,对于信道的利用率太低。如果每次可以发送多个分组,那么需要增加以下机制:
- 必须增加序号范围,每个输送中的分组必须有一个唯一的序号,而且也许有多个输送中未确认的报文
- 协议的发送方和接收方也许必须缓存多个分组
- 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失、损坏和延时过大的分组。解决流水线的差错恢复有两种基本方法:回退 N 步和选择重传
回退 N 步
那些已被发送但还未被确认的分组的许可序号范围可以被看成是一个在序号范围内长度为 的窗口 随着协议的运行,该窗口在序号空间向前滑动。因此 N 常被称为窗口长度 (window size) , GBN 协议也常被称为滑动窗口协议。
为什么要限制这些被发送的、未被确认的分组的数目为 N 呢?流量控制是对发送发施加限制的原因之一,拥塞控制则是另一个原因。