rdt系列:可靠数据传递 <伊落丹> illidan.modeler [at] gmail.com Northern Capital, Republic of Pandaren Of the Net, by the Net, for the Net rdt 2.0 上一回中,接收方与发送方通过一条有比特错误的链路相连接,接收方只管接收而没有任何反馈给发送方。因而产生了较多的丢包。 所得的结果为: pks. received: 1956 pks. lost: 1609 动一下脑筋:为什么是这个结果呢? PER~=1609/(1609+1956)=0.451 我们先来推一推理论上的PER。BER设置的是1e-4,则每1个比特无错的概率约是1-1e-4,每个包长为8000bit,则一个包都没有错误比特的概率是(1-1e-4)^8000。那么1个包有错的概率就是1-(1-1e-4)^8000=0.551. 这个值跟仿真所得的值差好多啊,怎么回事? 注意观察的看官已经发现,配置参数文件omnetpp.ini中,包的大小不是一个常数,而是指数分布的随机数,即 **.**.pkSize = exponential(8000) 如果把它改成常数,那么会怎么样?留等各位看官查验。 今天的正题的rdt 2.0. 按照[Kurose 2002] 3.4小节的图3.10可以看出,rdt2.0协议新增加的是接收方的确认机制。当接收方收到一个包,它会给发送方一个“回执”,告诉发送方,数据包是否被正确接收了,正确接收的反馈叫ACK,错误接收的反馈叫NACK。 那么在实际的产品中,比如TCP,它只用ACK,没有NACK。但NACK可以通过ACK来隐含地表现。这个将在rdt系列后面版本介绍。 这种接收方发送回执的机制,统称为Automatic Repeat reQuest (ARQ)。直白地讲,就是听者说:“我没听清,你再说一遍”(NACK)或者 “嗯,我听到了”(ACK)。ARQ机制可以用在各个协议层次,比如数据链路层(L2),或运输层(L4)。位于运输层的TCP用的就是一种ARQ。在3G和4G无线通信中,又发明了一种新的ARQ,叫混合ARQ或H-ARQ。HARQ是利用物理层的编码技术对ARQ的一种改进。有兴趣的看官可以去维基百科了解一下。 对于这个ARQ,我们在模型中就是按照它的原理来实现的: 1)发送方每发送一个数据包时,保留它的副本 2) 接收方根据接收到的数据包是否有比特错误,决定产生ACK或NACK包,发送给发送方 3)发送方得到ACK则销毁副本,发送下一个包(如果有的话);得到NACK则重传之前保留的副本 来看仿真结果,果然没再有数据包丢失。如果传的是一系列网页,那么就可以正确地看到网页啦! shost.gen: pks. sent: 3651 last pk id: 3651 rhost.sink: pks. received: 3650 pks. lost: 0 细心的看官可能会问,同样的链路,接理你还是有接近一半的错误包,这些是要重传的。怎么最后所能接收到的数据包数是上次是一样多的呢? 且听下回分解吧。 模型下载: rdt2.0 @ bitbucket |
通信人家园 (https://www.txrjy.com/) | Powered by C114 |