引言
基于上次的基本特性中的可靠传输特性,我们对其进行详细的分析。
对了,在讲解TCP前,先对缓存进行一个简单的描述。我们都听说过缓存这个东西,我们发来的数据,会暂时写入到缓存中进行预处理,随后从缓存中将数据发送出去。
比如当我们访问某个网页或应用程序时,系统会首先检查缓存中是否已经保存了该页面或应用程序的副本。如果有就从缓存中直接取用了。适当的清理缓存可以提高系统性能,但如果缓存清理太多会导致系统变慢。
对于TCP通信而言,缓存控制了数据收发的速度,让数据可以流畅稳定不出差错的进行发送。
停止等待协议
为什么要设置这个协议?
第一点:因为在网络环境中,TCP处理报文是很细致的,主机需要配合TCP运作进行额外的数据处理。所以,如果数据的发送速度和TCP处理报文的速度不匹配,将会导致数据溢出,也就是发送过量数据导致TCP不能及时处理从而通信崩溃。
我们针对这个问题引入了反馈机制来调节发送速度。
第二点:数据在传输中容易出现错误。TCP是面向字节流的,如果有的字节流发生问题(如:出错和丢失),那么通信质量就无法保证了。
我们针对这个问题引入了超时定时器和重传机制。
第三点:紧接上面的传输问题,丢失数据后我请求重传,但是重传来的数据我只需要一次,要避免反反复复接收重传的报文.
我们针对这个问题使用序号标记数据和确认报文。(ACKn表示对n-1号及其以前各编号数据的确认,期望下次收到n号数据。)
好了,上述的问题你应该懂能看懂,但是解决方法你肯定很懵,后续几张就将围绕这些黄体的标记字展开。
停止等待协议的工作流程
停止等待协议:通信系统中,规定发送方每发送一帧后就要停下来等待接收方的确认返回,仅当接收方确认正确接收后再继续发送下一帧。
就好像咱们现实生活中排队买东西一样,大家都在排队,只有等前一个人交易完了,我们后面的人才能接着交易。中途如果插队,或者别人还没交易完你就抢着付款,售货员和顾客都不会同意的。
上面是一个简单的流程图,我们对该图进行一个解释!
我们先看左边,这是发送端的一个运作情况。
发送端
1.主机要发送一个数据(data),此时我们设V(S)是发送状态变量,V(S)=0表示现状态设备还没有发送数据。
2.我们将数据放入缓存(Buffer),在此之前,我们再设N(S)为发送序号。将发送状态变量V(S)写入N(S),并给数据贴上标记data_No后置入缓存。
3.接下来缓存(Buffer)将我们的数据(data_No)发送出去。
4.此时开启定时器,定时器进入等待状态
5.如果数据发送到了,会返回一个ACKn,这个ACKn中的n值变成携带发送状态变量V(S)+1,表示我收到了数据,从而将新的V(S)值(假定是1)返回给缓存,缓存看到V(S)变成了1,就知道数据发送成功了,它可以继续发送后面的数据了。
在定时器的限定时间内,倘若我没有收到ACKn的回复,则证明数据传输失败,我会反馈给缓存让其继续发送没有收到的信息。
注:
还记得引言中对缓存的描述吗?缓存中发送过的数据会以副本形式保留一段时间,当信息发送失败收到重传请求时,会将副本发送出去。只有当对方收到报文并返回ACKn以后,才会删除缓存中的副本。
如果收到了多个相同的ACKn报文,则代表接收端的数据重复接收了!
复制了一份,继续,我们在看右边
接收端
1.发送端没法送来任何数据,自然我们接收端就处于V(R)=0的状态,表示没有数据到达这边。
2.很快,数据传送来了,但是我们要确认收到的data是否正确。
3.发送来的数据中携带的N(S)发送序列会和V(R)接受序列进行比对,因为N(S)发送来的时候与V(S)相同都是0,正好和V(R)是相等的。那么此时,接收端收下数据给主机,并在自己的V(R)更新状态序列上+1,将其赋值给ACKn中的n返回给发送端,表示我收到了数据,你可以继续进行接下来的发送了。
倘若N(S)≠V(R)或者收到的data有问题。都不会将V(R)进行更新,而是直接赋予ACKn,也就是n仍然是0.当发送端收到ACKn时发现对端居然没有更新ACK,那么就继续发送缓存中的副本给对端。
如果接收端发现自己的ACKn无法发到发送端,不慌,发送端的定时器超时后会解决这个问题!
注:发送端和接收端要同时看,就能对停止等待协议有了更深刻的了解。也可以更加详细的了解TCP三次握手了。
后续
我在网上找了个简述版本的,虽然不那么细致,但是很精炼,非常不错!
① 发送方每次仅将当前信息帧作为待确认帧保留在缓冲存储器中;
② 当发送方开始发送信息帧时,随即启动计时器;
③ 当接收方收到无差错信息帧后,即向发送方返回一个确认帧;
④ 当接收方检测到一个含有差错的信息帧时,便舍弃该帧;
⑤ 若发送方在规定时间内收到确认帧,即将计时器清零,继而开始下一帧的发送;
⑥ 若发送方在规定时间内未收到确认帧,(即计时器超时),则应重发存于缓冲器中的待确认信息帧。
上述讲了停止等待协议的工作流程,但是重传机制还没有描述。
发送端对出错的数据帧进行重传可以是自动进行的,因而这种差错控制的体制常简称为ARQ(Automatic Repeat Request)——自动重传请求(不过叫它自动请求重传更合适)。
后续篇幅会讲述重传问题!