TCP滑动窗口协议

哎,研究了两个小时也算是看懂了GBN(滑动窗口协议)扩展FSM的描述,关于滑动窗口协议如下图:

TCP滑动窗口协议

红色方框代表发送方(或者说是客户机)要发送的分组(或者说是报文)左边就是客户机已经发送并且得到服务器应答的分组,红色方框右边的分组就是还不能发送的分组,工作过程是这样的:比如现在方框的最左边的编号是31,那么当31发送完后,32在发送,一直到50,只有31得到服务器的应答后红色方框整体才向右移动,若是31一直得不到应答,就算31后面的都得到了应答,窗口(说红色方框有点不专业哈,能懂就行!!!)是不会向右移动的,哦对了,窗口里面由两部分组成,一部分就是报文正在实际的物理通道中传输的,还有一部分就是客户机正要发送的报文,那么也就是说,按顺序编好的报文只有依次(注意是依次,重要事只强调几遍)得到应答,窗口才会向右移动(这句话的意思就是后面那些不能发送才能得到权利被发送)。

下面我们来研究的更加深入来看看FSM描述:

先看发送方(也就是客户机方面的):

TCP滑动窗口协议

FSM描述图

找了很久的图片来自一篇博客的:https://blog.csdn.net/qq_20233867/article/details/78242170?locationNum=8&fps=1

虚线表示发送方初始,这里的base表示窗口的的最左边也就是最早的未确认分组的序号比如上图的31;nextseqnum表示下一个将要发送的分组序号(再说一遍上面的分组分为4个部分,第一个就是发送了并得到应答的分组,比如上图序号的26-30;第二和三部分都在窗口里面分别代表正在发送未得到应答的分组和即将发送的分组,上图没画就不比如了;第四部分就是还未能得到被发送权利的分组,比如序号为50以后的)所以base就是第二部分的开始序号;nextseqnum就是第三部分的开始的序号。N代表窗口序号的个数,换句话就是要发送的分组的个数。

假设这里有n个分组的前6个分组,窗口的大小N = 6如下图:

TCP滑动窗口协议

首先虚线表示初始base = nextseqnum = 1,N = 6那么base 和nextseqnum 指向序号为1的分组;if(nextseqnum < base + N)表示的意思是判断是否还有要发送的分组,学过数学的应该灰机算吧->_->然后把nextseqnum 对应的序号做成包对应if 的下面的语句,然后就是发送包对应udt_send,此时由于base = nextseqnum = 1满足if(base = nextseqnum)就开启定时器(定时器的作用就是在规定时间内若是发送的分组得不到应答客户机就会再次发送数据,重发就是可靠数据传输的核心,前提是数据不对的情况),最后nextseqnum++(此时nextseqnum = 2;base = 1)。然后我们来看FSM描述图的最下面,首先发送方接收到接收方的应答数据包,若是数据包在传输的过程中没有损坏,那么base = getacknum(rcvpkt) + 1,也就是发送方发给接收方分组序号(这个序号也等于接收方发送应答分组给发送的序号) + 1,那么此时base = 2;换句话就是该分组得到了应答,窗口要向右移动而根据base的定义,base 就要+1,那么也就满足下面的if(base = nextseqnum )使得定时器就会停止,那么问题来了,若是这个分组得不到应答会怎样???比如从开始的base = nextseqnum = 1然后是发送数据,再然后开启定时器,nextseqnum ++,再然后发送方就会等待应答分组,若是一直得不到应答若是到了定时器的时间(看FSM发送方图的右边就有timeout),那么发送方就会重新发送数据包(报文或者分组),但是这个数据包指的是已发送但没确认的分组

。由于此时base = 1,nextseqnum = 2,那么就会又再次发送序号为1的分组,若是序号为1的分组任然得不到应答,导致nextseqnum 不挺的自加,那么由于base未得到应答导致,base到nextseqnum 的数据再次重发,那么你又会想到,若是1得不到应答,而2到后面的分组得到应答会是怎样的情况,假设这里nextseqnum =2得到应答,那么再看FSM发送方描述图的下面的if语句就会导致定时器再次开启,然后由于base未1的序号得不到应答base的支部会++所以当超时的时候再次发送序号base到nextseqnum 的数据包,所以base不变,其他的都别想动。还有一点就是,若果发送方接收到有损失的应答分组,发送方什么也不做,除了再次进入等待完整无暇的应答分组。比如序号1的应答错误,而定时器在之前就被开启,若是在规定时间得不到完好的应答包就会再次重新发送数据。

我们再来看看接收方的FSM的描述图:

TCP滑动窗口协议

接收方FSM描述图

图片来自同样一篇博客(图实在太难找了,见谅哈),同样虚线代表开始(初始值),expectedseqnum(代表期望的序号) = 1,sndpkt就是序号为0的应答包,按照正常的线路走就是,初始->接收到完整的由发送方发来的数据包然后就是提交到应用层,然后expectedseqnum++,也就代表接收方期望得到下一个分组的数据包,同样的道理,若是发送方发来的数据有误怎么办???default(默认)udt_send(sndpkt)什么意思???凉拌,继续发送上一个应答的分组比如expectedseqnum =1 ,检测包有问题就跳到默认,而根据sndpkt = make_pkt(0,ACK,checksum),这里的sndpkt 就是包为0的数据包(假设序号1的分组前面是0),那么就继续发送分组为0的应答包,正好满足,你发来的包有问题,我就让你等待直到超时再次发送。

以上就是发送方和接收方FSM最为详细的解释,没有之一!!!慢慢看自然看的懂的!!!

2018/11/8 23:33 慕名兰


分享到:


相關文章: