前言
在学习3.5节TCP传输之前,我们需要先了解到可靠数据的传输原理,对于网络通信安全来说,确保信息的完整性是必不可少的。信息的完整性意为,数据在主机与主机的传输过程中,信息未被恶意攻击所篡改,或者保证数据不会损坏,可靠数据传输虽然不是保证这些的主体,因为没有完全可靠的数据传输信道,但是这也是保证数据传输过程中数据不会损坏的重要因素。如果的确要将所有网络中最为重要的“前10个”问题排名的话,可靠数据传输僵尸名列榜首的候选者。
书中的这一节主要考虑单向数据传输,数据是由发送端到接收端的。
一、构造可靠传输协议
书中将按照简单——>复杂的过程来将可靠数据传输协议展现出来,介绍协议的版本分别为:rdt1.0、rdt2.0、rdt3.0.
1.rdt1.0
rdt1.0称作经完全可靠信道的数据传输,这个版本的协议非常简单易懂,我们将底层传输信道看作完全可靠的。这里给出rdt1.0的FSM(有限状态机)协议图:
FSM简称状态机(State Machine),表示“有限个“状态以及在这些状态之间进行转换(Transation)和动作(Action)等行为的数学模型。FSM是一种算法思想,简单而言,有限状态机由一组状态、一个初始状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成。现实世界中存在大量具有有限个状态的系统:钟表系统、电梯系统、交通信号灯系统、通信协议系统、正则表达式、硬件电路系统设计、软件工程,编译器等,有限状态机的概念就是来自于现实世界中的这些有限系统。了解了FSM的概念后,我们来看书中的这两张图。
图a为rdt1.0的发送端,rdt为可靠传输的表示方法,发送端初始等待系统上层调用,得到系统上层调用需要发送的信息后,将数据打包pack=make_pkt(data),并使用可靠信道传输rdt_send(pack),将打包的数据发送出去。
图b为rdt1.0的接收端,接收端等待发送的消息,使用可靠信道接收到发送端传输过来的包的信息后,使用extract(packet,data),并deliver_data(data)解包传输至上层。这样一组包的信息就从发送端到接收端完成了此次协议,该协议十分简单易懂,几乎没有什么别的操作,协议完全基于传输过程完全可靠,该协议优点是,因为有了完全可靠的传输信道,所以接收端不用传输接收完成的ACK确认报文发回至接收端,很方便(这么完美的信道当然是非常方便,但实际过程中这样的协议不太适用现阶段的很多网络传输)。
2.rdt2.0
rdt2.0称为经具有比特差错信道的可靠数据传输,这个协议模型已经接近现阶段实际生活中的条件,底层信道更为实际的模型是分组中的比特可能会受损的模型,在讲述该模型协议之前,我们回顾一下正常讲话的流程,例如老师对你下达了命令。
老师:回家路上记得带好伞。
你:收到。
在正常进行交流的同时,当发送端(老师)发送了一个报文,接收端(你)会对这句话进行一个肯定or否定的回复。如果接收端(你)没有听清楚老师的话,会让发送端(老师)再重复一遍这段话,这些传输回复的报文称为控制报文,用于发送方确认接收方是否接收到发送的信息,是否传输数据有误,如果传输数据有误则需要重发,基于这样的重传机制的可靠数据传输协议称为自动重传请求(ARQ)协议。ARQ包含了三种协议功能(1.差错检测2.接收方反馈3.重传),下图为rdt2.0的协议FSM图,其中采用了差错检验、肯定确认与否定确认:
我们可以从这个图上看到,相比于1.0的发送端FSM图,发送端多了一个状态(等待ACK或NAK),这里就是接收接收端是否正确接收发送短信息的标志。
图a,为发送端,初始状态下,等待上层的调用,与1.0相似的是,将上层需要发送的data打包,不同的是,多加入了一个Checksum(校验和),这里是为了发送到接收端之后,接收端对这个传输的信息进行检测,是否传输过程中有丢包或者损坏,对比校验和,如果相等则证明接收消息正确。我们先不讲图a右侧状态,我们按照正常数据报文传输的过程来讲,所以我们先看图b。
图b,为接收端,初始状态下接收到发送端发送的消息,这里对发送端的消息进行检查,如果正确则解包将data数据取出,并朝发送端发送ACK正确接收报文,如果在报文传输过程中有错误,校验和不正确,则发送不正确NAK标志给发送端。
我们最后再来看图a,图a右侧状态接收错误的报告NAK时候,重新将这个data的数据包重新发送,如果接收到的消息是ACK报文,则证明传输完成,传输完成则什么都不做,等待上层调用发送下一个数据包消息。从这里我们可以看出,整个发送端发送下一个数据包的标志是,只有得到接收端确认发送的数据没有错误才会进行下一个包的发送操作,这样的协议我们称之为停等协议。
你也许想说这个接触到实际的协议是否可以直接运作在网络中,但是还是有个致命的缺点的,我们没有考虑到ACK与NAK报文的传输是否完整,如果接收端发送的ACK数据报文也丢包,没有传输到发送端,则整个协议流程会卡死。
3.rdt2.1
为了解决2的最后提出的问题,我们将数据分组中添加一个新的字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。下图是rdt2.1的FSM图:
我们可以从这两张协议图中看出2.1比2.0协议多出了一倍的状态,发送方加入了对接收端发送的ACK与NAK报文的确认,如果发送方接收到接收方发送的ACKorNAK报文错误则重发数据包,如果接收正确则不做任何操作。
4.rdt3.0
rdt3.0又称为经具有比特差错的丢包信道的可靠数据传输,第1、2、3点rdt的版本阐述的都是数据损坏行为,未考虑到,数据可以产生的丢包行为,rdt3.0解决了数据传输过程中的丢包行为,但如何确定是否有包丢失并进行合理处理,rdt3.0中加入了倒计数定时器,在一定的时间量过期后,可中断发送方,rdt3.0做到:1.每发送一个分组启动计时器。2.丢包行为导致定时器中断。3.定时器终止。下图为rdt3.0的FSM图:
在rdt3.0书中介绍的最后提出了rdt3.0的运行,比特交替协议:
图中分别定义了,条件是a:无丢包操作。b:分组丢失。c:丢失ACK。d:过早超时。的接收方和发送方所进行的操作。但这一切协议都是停等协议,必须要求一个序号完全到达之后才发送下一个分组,这会导致的问题就是效率非常低下,可用的包的传输效率使用不当,所以基于这个问题,提出了流水线可靠传输据传输协议。
二、GBN
在GBN协议中,允许发送方发送多个分组,并不是需要停等的一个分组,书中提供的GBN Java小程序,网站如下:https://media.pearsoncmg.com/bc/abp/cs-resources/products/product.html#student,isbn=0133594149
中的配套网站,进入网站后可以看到交互式动画。(这里使用了网页翻译,所以显示的是中文,其实是英文网站)
选择第三章的javaGBN小程序可以看到:
我们清楚地看到这个协议中的基序号与窗口长度,基序号从0开始,窗口长度为4.协议在发送方发出接受方确认收到后,会反向发送ACK报文:
蓝色块为接收方接收到了ACK后已被确认,黄色块是正在发送确认ACK报文。我们可以清楚的看到,在前两个已被确认的ACK接收到后,移动了滑块,确认了我们发送的报文是在这个范围内。所以GBN协议也被称作滑动窗口协议。
下面两张图给出了协议的FSM描述与传输框架:
我们可以看到,在分组窗口为4的情况下,如果中间有分组2丢失则接收方拒绝接受分组2之后的所有消息(丢弃),是因为包的数据必须按照有序交付,在分组2超时后,系统重新发送分组2与2之后的数据。这个协议有一个缺点就是,如果中间发生丢包行为,会一直不间断地进行重传操作,无论丢失包之后的包是否正确到达接收端,接收端一律丢弃。
为了解决上述问题,改进的GBN如下:
这里改进的核心就是,针对所丢失的包进行重传,而不是重新传输从丢失的包到丢失包+N的这一段的数据,这里所带来的便捷提升的效率是之前的几倍。
这个改进后的协议特点与注意事项是:只有接收方接收到了特定的丢失的包后,才会交付这一段内的所有包从图3-26就可以看出,而不是一直接收下去,一直接受下去会导致序号重叠,导致接收方接收到的序号不知道是新的数据还是老的数据,所以这里的滑动窗口N也是有限制的,这里必须要求N窗口长度必须小于或等于序号空间大小的一半,以图3-26来看,序号空间大小为10,则窗口长度必须小于等于5.
总结
这一节的知识点就讲到这里啦~~~~~ 因为码字码了好久,所以总结估计卸不了太多东西,我这里也有这本书的电子版哈,如果需要我评论区问我我会发。其实这节刚开始的部分比较好懂,后面这一部分尤其是GBN,需要结合文中的协议流程图去理解会快太多了,真的,欢迎大家交流学习哈,我可能有些地方理解不到位的地方大家也可以多交流。