赞
踩
运输层协议为运行在不同主机上的应用进程之间提供了逻辑通信功能,使得不同主机好像直接连在一起一样
运输层协议是在端系统中而不是在路由器中实现的。网络路由器仅作用于网络层分组(即数据报)的网络层字段,而不检查封装在该数据报的运输层报文段的字段。
运输层为运行在不同主机上的进程间提供了逻辑通信,而网络层提供了不同主机之间的通信。
以下面的例子类比:
有A和B两个家庭,每个家庭分别有12个孩子,两家孩子之间互相写信。每个家庭由一个孩子负责收发邮件,A家庭是Ann,B家庭是Bill。A家庭由Ann将所有兄弟姐妹的信件收集好之后交给邮政服务的邮车上,并将收到的信件分给兄弟姐妹。B家庭的Bill也是一样的工作。
对比这个例子中,就有:
运输层协议只工作在端系统,负责将应用进程的报文移动到网络边缘(即网络层)
运输层能够提供的服务常常受限于底层网络层协议的服务模型。
例如:网络层协议无法为主机之间发送的传输层报文段提供时延或带宽保证的话,运输层协议也就无法为进程之间发送的应用层程序报文提供时延或带宽保证。
即使底层网络协议不能再网络层提供相应的服务,运输层协议也能提供某些服务。
例如,即使网络层协议会是分组丢失、篡改和冗余,运输层协议也能为应用程序提供可靠的数据传输服务。
在介绍因特网运输层协议前,先简单了解一下因特网的网络层协议:
因特网提供的网络层协议为:网际协议(IP),网络层的分组称为数据报
再来讲运输层协议:
因特网提供的运输层协议有两种:TCP和UDP,运输层的分组称为报文段
运输层提供的服务包括:
除了因特网之外,多路复用和多路分解是在所有计算机网络中都需要的。
多路分解 & 多路复用:
运输层具体是怎么实现多路复用和多路分解的呢?
UDP和IP一样是不可靠的,它在IP的基础上,只是做了复用/分解功能以及少量的差错检测。同时UDP是无连接的,在发送报文段之前,发送方和接收方的运输层实体之间没有握手。
由于缺乏拥塞控制,UDP能够导致发送方和接收方之间的高丢包率,并挤垮TCP会话,这是一个潜在的严重问题。
既然UDP有这么多缺点,为什么还有很多应用要用UDP协议呢?
以下是UDP的报文结构:
应用层数据占用UDP报文段的数据字段
UDP报文段首部有四个字段,除了前面提到的方便多路复用与多路分解的源端口号和目的端口号字段,还有长度和检验和字段。
发送方对UDP报文段中所有16比特字的和进行反码运算,求和时遇到的任何溢出都被回卷,得到的结果存放在检验和字段。
接收方将全部的16比特字(包括检验和字段)加在一起,如果分组中没有引入差错,得到的结果将是1111111111111111。如果这些比特之一是0,该分组就已经出现了差错。
虽然UDP提供差错检测,但是对差错恢复无能为力。UDP的某种实现只是丢弃受损的报文段,其他实现是将受损的报文段交给应用程序并给出警告。
从简单的模型开始,一步一步构建完美、可靠的数据传输协议
假定:底层信道是完全可靠的。
在上述的有限状态机(FSM) 定义中:
由于底层信道完全可靠,接收端不需要提供任何反馈信息给到发送方
假定:分组中的比特可能受损,但所有分组按发送的顺序被接受
这种假定情况下,需要引入肯定确认和否定确认,使得发送方知道哪些内容被正确接收,哪些接收有误需要重传。基于这样重传机制的可靠数据传输协议称为自动重传请求(Automatic Repeat reQuest, ARQ)协议。
ARQ协议需要以下三种协议功能来处理存在比特差错的情况:
上图中即rdt2.0的FSM,需要注意的是:当发送方处于等待ACK或NAK的状态时,不能从上层获取更多的数据,因此rdt2.0协议也被称为停等协议。
rdt 2.0协议存在一个致命的缺陷:没有考虑到ACK和NAK分组受损的可能性。那么如何解决这个问题呢?可以考虑以下几种可能的解决方法:
上述可能的解决方法中,可以采用的方案是冗余分组。而对于冗余分组的缺点,可以这样解决:让发送方对其数据分组编号,并在数据分组中添加一个新字段存放该序号。接收方只需要检查序号即可确认收到的分组是否是一次重传。而对于停等协议,序号仅需要区分前一个分组和现分组,因此有 0 和 1 两种序号,1比特的序号就能完全满足需求。
由于假定不丢失分组,ACK和NAK不需要指明它们要确认的分组序号,发送方知道接收到的NAK和ACK分组(无论是否含糊不清)是为了响应最近发送的数据分组。
以下是rdt2.1的FSM,是在rdt2.0的基础上引入冗余分组的改进结果:
对于rdt2.1协议还可以做进一步改进:
当收到错误的分组时,接收方不发送 NAK,而是发送 ACK + 上一个正确分组的序号。当发送方收到同一个分组的 2 个 ACK 时也可以判断出接收方没有收到被确认 2 次的分组后的所有分组,此时就需要进行重传。
这就是rdt2.2协议,下面是rdt2.2的FSM
假定:除了比特受损外,底层信道还会丢包
此时的协议需要处理的问题有两个:怎么检测丢包以及发生丢包之后该做什么?
对于这两个问题,这里考虑让发送方来解决。
当发送方发送的数据分组或者接收方对该分组发送的ACK丢失了,那么发送方长时间无法收到ACK,在逻辑上就可以认为发生了丢包,此时仅需要重传分组即可。
为了基于时间来判断是否重传,发送方需要一个倒计数计时器,发送方需要做到:每发送一次分组就启动一次计时器,等待一段时间没收到 ACK 就重传并重启计时器,收到 ACK 后终止计时器。
那么如果一个分组没有丢失,而是经历了特别大的时延,超过了倒计数计时器设定的时间,此时发送方也会重传该分组,这就引入了冗余数据分组。但是在rdt2.2协议中,对这种冗余数据分组的情况已经完全可以解决了。
以上是rdt3.0发送方的FSM,对于接受方,rdt3.0引入的定时器对于接收方并没有任何影响,因此接收方参见rdt2.2中的接收方。
由于分组的序号在0和1之间交替,rdt3.0协议也被称为比特交替协议。
rdt3.0协议已经是一个功能正确的协议,但该协议仍然是一个停等协议,它的性能让人难以满意。
为了说明rdt3.0协议的性能问题,这里定义发送方(或信道)的利用率为:发送方实际忙于将发送比特送进信道的那部分时间与发送时间之比。
假定:
在停等协议的情况下,发送方的利用率为:Usender=L/R / (RTT + L/R) = 0.008 / 30.008 = 0.00027。在发送速率高达1Gbps的链路下,实际的利用率却只有万分之2.7。
解决上述性能问题的方法是:不以停等协议运行,允许发送方发送多个分组而无须等待确认,这种技术称为流水线。
流水线对于可靠数据传输协议的影响如下:
对于回退N步协议而言,允许发送方发送多个分组(当有多个分组可用时)而不需要等待确认。但协议受限于在流水线中未确认的分组数不能超过最大允许数N。N被称为窗口长度,GBN协议也因此被称为滑动窗口协议(sliding-window protocal)。
以下是GBN协议的窗口示意图,其中:
一个分组的序号承载在分组首部的一个固定长度的序号字段中。如果该序号字段的比特为k,则该序号的范围为[0, 2k-1]。在一个有限的序号范围内,所有涉及序号的运算必须使用模2k 运算(即序号空间可以被看作是一个长度为2k的环)。
以下是一个基于ACK、无 NAK的GBN协议的发送方和接收方的扩展FSM。
对于发送方,需要响应的事件有三种:
对于接收方:
以下是回退N步的运行示意图:
GBN协议的缺点:
当窗口长度和带宽时延都很大时,单个分组的差错就能引起GBN重传大量分组,而许多的分组其实没有必要重传
选择重传(SR)协议对GBN协议进行了优化:
发送方仅需重传那些它怀疑在接收方出错(丢失或受损)的分组,这要求接收方逐个地确认正确接受的分组。接收方也需要引入窗口,以此限制流水线中未完成、未被确认的分组数。
接收方和发送方虽然都有窗口,但是两者并不总是能看到相同的结果,因此两者的窗口并不总是一致的。
发送方关注的事件和动作如下:
接收方关注的事件和动作
以下是选择重传协议的运行示意图:
需要注意的是,窗口的长度必须比序号空间足够小,两者具体的关系是:窗口长度必须小于等于序号空间大小的一半。
下面的例子是当窗口长度比序号空间小1时会出现的问题:
上述的讨论中,我们假定分组在发送方与接收方之间的信道中不能被重新排序,这在发送方和接收方由单段物理线路相连的情况下是合理的。实际情况下,是会发生分组重新排序的,即一个具有序号或确认好x的分组的旧副本可能会出现,即使发送方或接收方的窗口中都没有包含x。
为了确保一个序号不被重新使用,直到发送方"确信"任何先前发送的序号x都不再在网络中位置,可以假定一个分组在网络中的"存活"时间不会超过固定最大时间量。
TCP报文段由首部字段和一个数据字段组成。
数据字段由MSS限制
首部字段包括:
TCP协议采用超时/重传机制处理报文的丢失问题,但是超时时间应该怎样设置才合理呢?很显然,超时时间必须大于该连接的往返时间(RTT),即一个报文发出到它被确认的时间。
先考虑简化情况,即发送方只用超时机制来恢复报文段的丢失。
TCP发送方有三个与发送和重传有关的事件:
TCP连接的每一侧主机都为连接设置了缓存,当收到正确的、按序的字节后,TCP连接将数据放入缓存,相关联的应用从该缓存中读取数据。当应用程序读取数据相对缓慢,而发送方发送得太快、太多,缓存很容易溢出。
流量控制 VS 拥塞控制
如何做流量控制?
存在的问题和解决方案
TCP连接的创建需要通过三次握手:
TCP连接的终止需要**四次挥手:**以客户端关闭连接为例
在一个TCP连接的生命周期中,运行在每台主机中的TCP协议在各种TCP状态之间变迁。以下分别是客户端和服务端的TCP状态变迁图。
TCP连接中,当一台主机接收到一个报文段,其端口或源IP地址与其主机上进行的套接字都不匹配时,该主机会向源发送一个重置报文,报文首部的RST标志位被置为1 。而在UDP中,该主机则会发生一个ICMP数据报。
如图所示,做以下假设:
以下是主机A的连接性能结果
如图所示,与情况1相似,做以下假设:
以下是主机A的连接性能结果
如图所示,做以下假设:
以下是主机A的连接性能结果:
根据网络层是否为运输层拥塞控制提供显示帮助,可以将拥塞控制方法分为两种:
TCP采用的拥塞控制方法是:让每一个发生者根据所感受到的网络拥塞程度来限制其能向连接发送流量的速率。因此属于端到端拥塞控制
要实现以上方法,需要关注以下几个问题:
TCP为确定合适的发送速率,应遵循以下指导性原则:
TCP拥塞控制是通过TCP拥塞控制算法实现的,该算法分为3个部分:慢启动、拥塞避免和快速恢复。其中,慢启动和拥塞避免是TCP的强制部分,两者的差异在于对收到的ACK做出反应时增加cwnd长度的方式。
以下是TCP拥塞控制的FSM描述:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。