若干年以前,陪同学去八达岭长城。返程时在长城脚下坐公共汽车回来,对该公交站印象深刻。
游客们排成不知道拐了多少个弯的U型队伍进站,幸好有一群肩上插着红旗的北京大妈们帮忙送走一拨一拨的游客。整个场面浩大,但又井然有序。估计今天还是这个场景。
最简单的情况是,游客们都没啥要求,完全按照先来先走的顺序,依次登上回城的公交。大妈们处理起来也简单。但是问题是遇到下面类型的游客:
你们项目组一拨人去长城来了个高大上的TeamBuilding,结果你冲到上车的地方,发现人没全,最重要的是老大也没来,而你们项目组同事,情比金坚,想要一个个连在一起走,不愿意拆开走,于是只能等等同事们...
于是公交站派来两位大妈,大妈甲和大妈乙,分别站在你们这拨人的对首和队尾,就负责维持你们顺序,但也不能因为你们这一波在等而耽误别的游客,于是再派出大妈丙去招呼后来新的游客。
若等一段时间,人都全了,那皆大欢喜,你们一波人上车。若最终人没来全,那也不管了,来了多少上多少。而后,大妈甲和大妈乙将你们送上车后,又被派去维持类似的一拨游客的顺序了。
看完了这个,你应该明白,其实这里说大体上的就是UM的接收过程。其实这里的大妈甲和大妈乙、丙分别对应了协议中的VR(UR)、VR(UX)、UR(H)。
好,先有个直观印象,接下来就要讲讲RLC的UM模式。鉴于UM是理解AM模式的基础,因此UM模式将分几个章节详细讲解。今天只是做个引子。
首先要解释一下为啥发送窗口和接收窗口都是序列号空间的一半问题。
这个问题来源于TCP的滑动窗口机制,以一个简单的例子来是说明:假设SN空间为1bit,即发送0、1;若收发窗口大小也为2,即发端发送0、1,再发送1、0,那收端接收到了这个0,他会认为是第一轮的0,还是第二轮的0呢?
为避免该问题,限制一次不能发送太多包。可以认为是将序列空间分开成两半,一次仅发送一半序列号空间的数据,接收方就不会出现识别的问题了。
再解释一个问题,就是收端的收包原则,就是收端需要等到连续的数据包才能拿去拆解包。
可以理解为,在发送端的时候,SDU被拆散成一个个PDU,在收端需要将这些PDU一个个按照顺序凑拢起来,才可以正常恢复成SDU。这就是数据接收过程中为啥要对非连续到达的包进行等待的原因,因为有空缺的到达包,还是无法解析为SDU。
解析明白以上俩问题,以一个简单的例子来是说明收端如何处理。从协议看,大家都头大...
但是你要知道,收端处理过程无非就是分别针对数据包顺序到达和没有按照顺序到达的种种场景。把各种场景弄明白,就差不多了。
假设序列号空间是0-19,窗口大小为10。
首先说明一个基本变量,即接收窗口,该上边缘即VR(UH),该值总是指向收到的最大序号包的下一个。因此VR(UH)的含义就是窗口上边缘,下边缘就是VR(UH)-10;因为VR(UH)的挪动导致整个窗口右移。
1)最基本的场景,顺序接收:
初始时候,VR(UH)=0,收到一个包0,VR(UH)=1,再收到一个包1,VR(UH)=2,再收到一个包2,VR(UH)=3...以此继续进行。此时你会看到窗口也是逐步往右移动。
在收到包9后,VR(UH)=10,
在收到包10后,VR(UH)=11,此时下边缘=1,包0送去组包
在收到包11后,VR(UH)=12,此时下边缘=2,包1送去组包
…
…
在收到包19后,VR(UH)=20,此时下边缘=10,包9送去组包。下一个期待的包又为0,相当于走完一圈
2)收到一个序号很大的包,发生跳变的包的场景:
初始时候,VR(UH)=0,收到一个包0,VR(UH)=1,但下一个包竟然是14,此时VR(UH)=15,而窗口上界挪动到了15,而下界挪动到了15-10=5.即窗口是从5到15之间,即便再收到包1,2,3,4,也都当成无效的包丢弃。
这么做的物理含义是?
可以理解为发方本来在正常发送数据包,突然发送了一个很大序号的包,意味着发送方铁了心不会再发送很久之前序号很老的包了,既然对方如此无情,那你何必苦等,翻开新的一页,开始接收窗外的新数据。之后,即便后续收到很老的包,果断丢弃之。
3)收到非连续的的包的场景
也就是说,有包没有及时到达,此时就需要启动定时期来进行等待。其处理过程就有点前头我们讲解的公交站的例子。
虽然我在写作中,一贯坚持能够几句话说明白,就坚决不画图。但是估计该过程是不画图,也说不明白,就放在下一章节结合图来说明。
北京治疗白癜风手术价格怎样治白癜风