通信人家园

标题: [OMNeT++网络仿真]rdt系列:可靠数据传递  [查看完整版帖子] [打印本页]

时间:  2010-11-6 21:00
作者: illidan     标题: [OMNeT++网络仿真]rdt系列:可靠数据传递

概论与安装

OMNeT++是网络仿真软件界的后起之秀。网络仿真,从上世纪80年代起,在通信、联网的新技术的研究中,都不乏它的身影。我原来在我的博客里也写了一些相关的帖子,打算整理到论坛来。

OMNeT++是什么东东呢?官方的回答是:

OMNeT++ is an extensible, modular, component-based C++ simulation libraryand framework, primarily for building network simulators
.

这可能是自卖自夸,那么可以看第三方的评论,有工夫有兴趣的可以参考如下文献:
http://ctieware.eng.monash.edu.au/twiki/bin/view/Simulation/OMNeTppComparison
http://seacorn.ptinovacao.pt/sim_tools.html

理论的东东先不搞那么多,先动手一下。下面讲讲这个东东要怎么安装。以ubuntu操作系统为例(8.04以上):
1. Download the simulator archive from omnetpp.org
2. sudo tar zxf omnetpp-3.4b2-src.tgz -C /usr/local/ ; cd /usr/local/omnetpp-3.4b2 ; ln -s /usr/local/omnetpp-3.4b2/ usr/local/omnetpp ; export OMNETPP_HOME=/usr/local/omnetpp
3. sudo apt-get install blt-dev giftrans doxygen libxml2-dev graphviz imagemagick
4. sudo apt-get install tcl8.4 tk8.4 tcl8.4-dev tk8.4-dev
5. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH/ $OMNETPP_HOME/lib
6. export TCL_LIBRARY=/usr/share/tcltk/tcl8.4
7. export PATH=$PATH/ $OMNETPP_HOME/bin
8. ./configure;make
(其中5,6,7步的三个命令可以加到 ~/.bashrc 中,以免每次要手工输入.)

以上假设使用tk8.4, omnetpp3.4. 如果使用tk8.5或omnetpp4.x,操作过程类似。

[ 本帖最后由 illidan 于 2010-11-8 23:39 编辑 ]
时间:  2010-11-8 13:08
作者: hzpasj

谢谢LZ分享,希望可以分享更多的资料,加油
时间:  2010-11-8 23:37
作者: illidan     标题: rdt系列:可靠数据传递

rdt系列:可靠数据传递

<伊落丹> illidan.modeler [at] gmail.com
Northern Capital, Republic of Pandaren


Of the Net, by the Net, for the Net


博主要在此讲解OMNeT++网络仿真。网络仿真的入门教材可参考omnetpp.org提供的TicToc系列,这可算作入门级。博主要讲的大约是初级。除了实际操作之外,还想提高一下课程的理论水平(至少比TicToc系列高吧),于是决定傍一本名教材。最终选了寓真理于通俗的[Kurose 2002]  (注1)。

rdt指的是reliable data transfer。取材自[Kurose 2002] Sec 3.4。讲的是构建数据传输协议的一些基本要素。

这些数据传输协议的要素包括:可靠传输、流量控制、拥塞控制等。在实际的产品中,这些原理应用在在了TCP/IP家族的TCP、UDP,还应用在3GPP家族的RLC(AM模式)、MAC-hs等方面。

本系列将通过网络仿真的方式,使这些原理更加直观明了。

rdt 1.0

这个协议实际上只有接收和发送。如果发生丢包,也全然不理;更多描述请见[Kurose 2002] Sec 3.4。

我们来亲眼看看,它到底能丢包到什么程度。

在仿真模型中,发送方(simple source)不断地发包。数据包经过一条单向链路(不妨叫下行链路,姑且可认为这是3GPP系列的HS-PDSCH信道的原型),链路的Bit Error Rate是1e-4。接收方(sink)会检查数据包是否有比特错误,如果有则认为收到了一个有错误的数据包。最终用{错误数据包数/数据包总数}来表征错误包率,这只是象征一下,如果链路中有比特错误,那么数据传递协议如果不作为,那么会有会丢失多少数据包。

仿真拓扑的示意图:


仿真的结果是:
pks. received: 1956
pks. lost: 881

正确接收的是1956个包,错误而丢弃的是881个包。如果这是网页浏览,那么这个网页早就显示不出来了(HTML里少了一个尖括号,网页浏览器就显示不了这个网页)。那么怎么才能在有错误的链路上正确地接收数据包呢?

各位看官先想想。或听下回分解。



仿真模型下载
rdt 1.0 @ bitbucket


[Kurose 2002] Kurose,  J.F., and Ross, K.W.::   "Computer Networking: A Top-Down Approach Featuring the Internet".  2nd Ed. Addison Wesley / Pearson Education, 2002

[ 本帖最后由 illidan 于 2010-11-8 23:45 编辑 ]
时间:  2010-11-10 20:59
作者: illidan     标题: rdt系列:对抗数据包出错

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