计算机网络(自顶向下方法)笔记-运输层01

运输层位于应用层和网络层之间,是分层的网络体系结构的重要部分。该层为运行在不同主机上的应用进程提供直接的通信服务起着重要作用

1.概述和运输层服务

​ 运输层协议为运行在不同主机上的应用进程间提供了逻辑通信功能。从应用层角度看,通过逻辑通信,运行不同进程的主机好像直接相连,无需考虑承载这些报文的物理基础设施的细节。

​ 运输层协议是在端系统中而不是在路由器中实现的。

  1. 在发送端,运输层将从发送程序进程接收到的报文转换为运输层分组,并加上运输层首部形成运输层报文段。
  2. 在发送端系统中,运输层将这些报文段传给网络层,网络层将其封装为网络层分组(数据报)并向目的地发送。
  3. 在接收端,网络层从数据报中提取运输层报文段,并将该报文段向上交给运输层。
  4. 运输层处理接收到的报文段,使该报文段中的数据为接收应用进程使用。

1.1 运输层和网络层的关系

​ 在协议栈中,运输层位于网络层之上。网络层提供了主机间逻辑通信,运输层协议为运行在不同主机上的应用进程间提供了逻辑通信。下面是一个简单的例子来解释这两者的差别:

​ A家庭和B家庭之间通过邮件进行通信,A家庭有成员A1,B家庭有B1,两个人负责把自己家中其他家人的要寄的信件给邮政服务的邮车上,同时负责将收到的邮件分发给其他家人。

​ 该例中,邮政服务为两个家庭提供逻辑通信,它将信件从一个家庭送到另一个家庭,而不是从一个人送到另一个人。A1和B1对于其他家人而言就是邮件服务。可以类比为:

  • 应用层报文=邮件上的字
  • 进程=其他家人
  • 主机(端系统)=家庭
  • 运输层协议=A1和B1
  • 网络层协议=邮政服务(包括邮车)

假如还有A2和B2负责在A1和B1不在的情况下进行邮件的收集和交付。但是它们次数较少,而且还会丢失邮件,没有提供A1和B1的服务集合,这就相当于TCP和UDP的区别了。我们也能很明显的知道,A1(A2)和B1(B2)受限于邮政公司能提供的服务,即运输层协议能提供的服务会受限于网络层协议的服务模型。但是即使网络协议不能在网络层提供相应的服务,运输层协议也能提供某些服务。比如,网络层协议不可靠,但是运输层协议也能为应用程序提供可靠的数据传输服务。

1.2 因特网运输层概述

​ 先简要介绍一下网络层,网络层协议有个名字是IP,即网际协议。IP的服务模型是尽力而为交付服务,它并不做任何的担保,所以IP被称为不可靠服务。而UDP和TCP的最基本责任是将两个端系统间IP的交付服务扩展为运行在端系统上的两个进程间的交付服务,这个扩展被称为运输层的多路复用多路分解

​ 进程到进程的数据交付和差错检查是两种最低限度的运输层服务,同时也是UDP仅能提供的两种服务。UDP与IP一样是不可靠的服务,不能保证进程发送的数据能完整到达目的进程。TCP提供可靠数据传输,通过使用流量控制,序号,确认和定时器确保正确地,按序地将数据从发送进程交付给接收进程,同时TCP还能提供拥塞控制。

2.多路复用与多路分解

​ 当你在下载一个Web页面,并且运行了一个FTP会话和多个Telnet会话,即有多个进程在同时运行。当你计算机中地运输层从网络层接收数据时,它需要将这些数据定向到这些进程中的一个。前面提到过,一个进程有一个或多个套接字,它相当于网络和进程间数据传递的门户。如图所示:

在这里插入图片描述

在接收主机中的运输层并没有直接将数据交付给进程,而是将数据交付给中间的套接字。由于接收主机上可能不止有一个套接字,所以每个套接字都有唯一的标识符,标识符的格式取决于它是UDP还是TCP。

​ 接收主机如何将到达运输层的报文端定向到合适的套接字?每个运输层字段中有几个字段,运输层会检查这些字段,标识出套接字,进而进行定向。将运输层报文端中的数据交付到正确的套接字的工作被称为多路分解源主机从不同套接字中收集数据块,并为每个数据块封装上首部信息进而产生报文段,然后将报文段传递到网络层,所有这些工作称为多路复用。用前面两个家庭的例子来说,B1从邮递员处收到一批邮件,通过查看收件人姓名进而交付给每个家人,这个操作就是分解。将家人的邮件收集起来一同交给邮递员就是复用的操作。

​ 运输层多路复用有两个要求:

  1. 套接字有唯一标识符
  2. 每个报文段有特殊字段来指示该报文段所要交付到的套接字

如图所示,这些特殊字段就是源端口号和目的端口号,0-1023范围的端口号称为周知端口号,比如HTTP的80端口和FTP的21端口。:

在这里插入图片描述

所以分解服务大致为:在主机上的每个套接字能够分配一个端口号,当报文段到达主机时,运输层检查报文段中的目的端口号,并将其定向到相应的套接字。然后报文段中的数据通过套接字进入所连接的进程。UDP的基本操作如上,而TCP要复杂。

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

一个UDP套接字由二元组标识,该二元组包含一个目的IP地址和目的端口号。所以,如果两个不同UDP报文段具有不同的源IP地址和源端口号,但具有相同的目的IP地址和目的端口号,那这两个报文段将通过相同的目的套接字被定向到相同的目的进程。

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

​ TCP套接字由四元组组成(源IP地址,源目的端口号,目的IP地址,目的端口号)。两个具有不同源IP地址或端口号的TCP报文段将被定向到两个不同的套接字。如图所示:

在这里插入图片描述

主机C向服务器B发起了两个HTTP会话,主机A向B发起了一个HTTP会话。主机A选择端口号时和主机C互不相干,可以分配同C相同的端口号。服务器B依旧可以正确分解这两个具有相同源端口号的连接,因为这两个连接由不同的IP地址。所以服务器主机可以支持很多并行的TCP套接字。

3.无连接运输:UDP

​ 运输层的最低限度必须提供一种复用/分解服务,以便在网络层与正确的应用级进程之间传递数据。UDP只是做了运输层协议能够做的最少工作,除了复用/分解服务及少量的差错检验外,几乎没有对IP增加别的东西。有许多应用更适合UDP,比如DNS。原因主要有一下几点:

  • 关于何时和发送什么数据的应用层控制更加精细。应用进程将数据传递给UDP,UDP就会将此数据打包进UDP报文段并立即给网络层。而TCP的话有拥塞控制机制,它不管可靠交付需要多少时间。

  • 无需建立连接。TCP开始数据传输前要三次握手,而UDP不需要准备就可进行数据传输。

  • 无连接状态。TCP需要在端系统中维护连接状态,连接状态包括接收和发送缓存,拥塞控制参数和序号以及确认号的参数。UDP不维护连接状态,也不跟踪这些参数,所以有些服务器当应用程序运行在UDP上时可以支持更多用户。

  • 分组首部开销小。TCP报文有20字节首部开销,UDP仅有8字节开销。

下图是流行的因特网应用和其运输协议:

在这里插入图片描述

​ 使用UDP的应用是可以实现可靠数据传输的,可通过在应用程序自身建立可靠性机制完成。

3.1 UDP报文段结构

​ UDP报文段结构如下图所示:

在这里插入图片描述

其中,长度字段指明了包括首部在内的UDP报文段长度。接收方使用校验和来检查在该报文段中是否有差错。

3.2 UDP校验和

​ UDP校验和提供了差错检测功能,用于确认当UDP报文段从源到目的地移动时,其中的比特是否改变。发送方的UDP对报文段中所有的16比特数的和进行了反码运算,变为校验和。在接收方再将该校验和与收到的比特字相加。如果没错,接收方出的和就全是1。

​ UDP虽然提供了差错检测,但是它无法进行差错恢复,只是丢弃受损的报文段。

4.可靠数据传输原理

​ 借助可靠信道,我们在传输比特时就不会受到损失或丢失,并且数据按序发送。实现这种服务抽象是可靠数据传输协议的责任,但是可靠数据传输协议的下层协议或许是不可靠的,所以这是一项困难的任务。

4.1 构造可靠数据传输协议

  1. 经完全可靠信道的可靠数据传输:rdt 1.0 (rdt表示可靠数据传输协议)

    这是一种最简单的情况,即底层信道是完全可靠的。在这个简单协议中,有完全可靠的信道,接收端不需要任何反馈信息给发送方,因为不用担心差错。

  2. 经具有比特差错信道的可靠数据传输:rdt 2.0

    底层信道更为实际的模型是分组中的比特可能受损。一般当你打电话时确认听到对方讲话会回复ok(肯定确认),没听到会要求对方重复一遍(否定确认),这些控制报文使得接收方可以让发送方知道哪些内容被正确接收。基于这样重传机制的可靠数据传输协议称为自动重传(ARQ)协议。该协议还需要另外三种协议功能来处理存在比特差错的情况:

    • 差错检验:我们首先要知道接收方何时出现了比特差错,UDP的检验字段就是为了这个目的。
    • 接收方反馈:上述的**肯定确认(ACK)**和否定确定(NAK)就是反馈的例子。理论上,用1表示ACK,0表示NAK。
    • 重传:接收方收到差错分组时,发送方将重传该分组。

    注意:当发送方处于等待ACK或NAK时,它不能从上层获得更多数据去发送,直到确认接收方已经正确接收该分组。因为这种行为,rdt 2.0被称为停等协议

    但是rdt 2.0有一个大的缺陷:ACK或NAK分组受损怎么办?发送方无法知道接收方是否正确接收了上一块发送的数据。如果发送方收到含糊不清的ACK或NAK,直接重传当前分组的话,会在信道中引入冗余分组,这种分组的根本困难是接收方不知道发送方是否正确接收到上次的分组,因此它无法知道接收到的分组是新的还是发送方重发的。

    解决上述问题的方法是在数据分组中添加一个新字段,让发送方对其数据分组编号,接收方只要检查序号即可确认收到的分组是否一次重传。

  3. 经具有比特差错的丢失信道的可靠数据传输:rdt 3.0

    假定除了比特受损外,底层信道还会丢包。假定发送方传输一个数据分组,该分组或接收方对该分组的ACK丢失了,发送方都无法收到接收方的响应。如果发送方愿意等足够长的时间以确定分组丢失,然后再重传也可以。但是需要等多久?为了实现基于时间的重传机制,需要一个倒计时定时器,在一个给定的时间量过期后,便可以中断发送方。

数据传输协议的要点:检验和,序号,定时器,肯定/否定确认分组

4.2 流水线可靠数据传输协议

​ 上述的rtd 3.0是一个功能正确的协议,但是由于它是一个停等协议,在性能上不是特别好。为了解决这种性能问题,则不使用停等方式运行,允许发送方发送分组而无需等待确认,这种技术被称为流水线技术。如图所示:

在这里插入图片描述

该技术对可靠数据传输协议带来如下影响:

  • 必须增加序号范围,每个传输中的分组必须有一个唯一的序号。
  • 协议的发送方和接收方两端必须缓存多个分组。发送方应当能缓存已发送但没收到确认的分组,接收方需要缓存已正确接收的分组。
  • 所需序号范围和对缓冲的要求取决于数据传输协议如何处理丢失,损坏及延时过大的分组。解决流水线的差错恢复有两种基本方法:回退N步选择重传

4.3 回退N步(GBN)

​ 在回退N步协议(GBN)中,允许发送方发送多个分组而不需等待确认,但是也受限于流水线中未确认的分组数不能超过某个最大允许数N。下图是发送方看到的GBN协议的序号范围([base, nextseqnum-1]是已经发送还未确认):

在这里插入图片描述

已被发送但是还未确认的分组的许可序号范围可以视为在序号范围内长度为N的窗口,所以N被称为窗口长度。GBN也被称为滑动窗口协议。发送方为了流量控制,不允许设置此类分组为无限制的数目。

GBN发送方必须响应三种类型的事件:

  1. 上层的调用。上层要发送报文时,发送方首先检查发送窗口是否已满。没有满就产生一个分组并发送,且更新相应变量;已满就指示上层该窗口已满。
  2. 收到一个ACK。在GBN协议中,对序号为n的分组的确认采取累计确认,表明接收方已正确收到序号为n的分组和n之前所有分组。
  3. 超时事件。协议的名字回退N步来源于丢失和时延过长分组时发送方的行为。如果出现超时,发送方将重传所有已发送但未确认的分组。

在GBN中,接收方动作如下:如果序号为n的分组被正确接收,并且按序,则接收方为分组发送一个ACK,并将分组的数据部分交付给上层;如果不按序,接收方丢弃该分组(即时分组是正确接收的),并为最近按序接收的分组重新发送ACK。如下图所示:

在这里插入图片描述

4.4 选择重传(SR)

​ 由上一节可知,单个分组的差错能够引起GBN重传大量分组,许多分组是没有必要重传的。选择重传(SR)协议通过让发送方仅重传那些它怀疑在接收方出错(丢失或受损)的分组而避免不必要的重传。下图为SR操作:

在这里插入图片描述

可靠数据传输机制及其用途总结如下图:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值