计算机网络GBN和路由算法实验报告.docx
- 文档编号:28896958
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:29
- 大小:318.94KB
计算机网络GBN和路由算法实验报告.docx
《计算机网络GBN和路由算法实验报告.docx》由会员分享,可在线阅读,更多相关《计算机网络GBN和路由算法实验报告.docx(29页珍藏版)》请在冰豆网上搜索。
计算机网络GBN和路由算法实验报告
计算机网络实验报告
----GBN和路由算法
姓名:
房皓
学号:
13410801教师:
尹辉
GBh模拟实验
1.实验目的
运用java编程语言实现基于Go-Back-N的可靠数据传输软件。
2.实验意义
通过本实验,使学生能够对可靠数据传输原理有进一步的理解和掌握。
3.实验背景
Go-Back-N的有限状态机模型表示如下图所示:
rdt_send(data)if(nexteeqnum
computechksum
make_pkt(sndpktfnextseqnum)),nextseqnumxJota;chksum)udi_send(sndpkt(nextseqnumj)
if(base==nextseqnum)
start」inn的
nextseqnum-nextseqnurm+1
1
etse
start_timer
udtjend(sndpkt(base))udt_send(sndpkt(base+))
udt_send(sndpkt(nextseqnum-1])
(a)
rdt_rcv(rcvpkt)&&
notcorrupt(rcvpkt)故&
hasseqnum(rcvpkt,expectedseqnum^)extract(rcvpktrdata)
deliveL_data(data)
make_pkt(sndpkt?
ACK,expectedsBq仃um)udjt_send(sndpld)
(b)
图为Go-Back-N的有限状态机模型(a)发送端(b)接受端
4.实验步骤
(1)选择java编程语言编程实现基于Go-Back-N的可靠数据
传输软件。
(2)在实际网络环境或模拟不可靠网络环境中测试和验证
自己的可靠数据传输软件。
5.实验环境
(1)实验语言:
JAVA
(2)实验平台:
Eclipse
(3)引用库函数:
随机(Random)库、计时库(Timer)
6.类概览与描述
(1)Sender类:
继承于Thread(线程)类,模拟发送方的一切功能,主要功能函数有:
A.Publicvoidrun()启动函数,标识开始发送数
据包
B.Sender()――构造函数,分配并初始化窗口值
C.Publicvoidgetack(intack)ACK接收函数,接
收接收方返回的ACK并进行验证是否为期待的ACK值(若不是,则重发)
D.Publicvoidtime()定时器函数,初始化定时,
计时并记录超时与否的状态
(2)Receiver类:
继承于Thread(线程)类,模拟接收方的
一切功能,主要功能函数有:
A.Publicvoidrun()启动函数,标识开始等待并
接收数据包
B.VoidReceive(intdata,Senders)数据包接收函
数,功能强大!
主要包括:
接收数据包,验证数据包,判断与丢弃数据包,发送ack等
(3)Timers类:
继承于TimerTask(计时器)类,具有自定
义定时与超时提醒的功能,主要功能函数有:
A.Publicvoidrun()启动函数,标识开始计时(这
里预设的是2秒的时间),超时后提醒并且停止计时器
B.PublicTimers()――构造函数,清0计时器,等待
下一次启动
(4)GBN类:
继承于Thread(线程)类,是主函数类,具
有本程序的核心功能,这里先作一部分简单介绍,主要函数功能有:
A.Staticvoidsenddelay(intx)throws
InterruptedExceptionPublicTimers()随机延
迟函数,模拟数据包发送传输过程中的随机延
迟,常用延迟值分别为:
300ms,750ms,1200ms,
3000ms等
B.Publicstaticvoidmain(String[]args)throws
lOException,InterruptedException()主函数,
功能强大,主要包含以下几大方面:
1开启发送端与接收端(包括计时器)
2超时或者ACK不匹配等情况导致的发送方
重新发送数据包
3(第一次)发送当前窗口内的数据包
4随机函数模拟数据包发送过程中的丢包
情况
5实时更新与显示当前窗口内的数据包情
况
6统计每一个数据包被发送过的次数(含重
发)并最终显示出来
C.staticvoidOutputWindow(Senders)输出
当前窗口状态函数。
7•代码展示与描述
(一)Sender类
importjava.util.Timer;
publicclassSenderextendsThread{
publicintwindowsize=4;//发送方窗口长度设为3
publicString[]data={"data1","data2","data3",
"data4","data5"
"data6","data7"};
//模拟七个数据包
public
int
sign[]={0,1,2,3,4,5,6};
//为7个数据包标号
public
int
localack=-1;
//保存最近收到的ACK
public
Timerslitime=null;
//定时器(这里定为2秒)
public
int
switches=0;
//超时标志,1为超时
public
int
windowsign[];
//当前窗口内待发的数据分组的序号
public
int
acksign[]={1,1,1,1,1,1,1};
//为0表示收到正确ACK,为1表示收
到错误的ACK,必须重发!
public
int
sent[]={1,1,1,1,1,1,1};//发送标记,1未发送,0已发送
public
int
acknowledged[]={1,1,1,1,1,1,1};
//
接收标记,
1未接收,0已接收
public
Sender(){
windowsign
=newint[windowsize];
//给窗口分配指定大小的空间
//窗口初始化时存放前3个序号
for(inti=0;i }publicvoidrun(){ System.out.println(”发送方: 现在开始发送分组数据! "); } publicvoidgetack(intack){ System.out.println("发送方: 收到了ACK,序号为"+ack+",现在开始确认! ); if(ack! =localack+1){ System.out.println("发送方: 经验证,这不是发送方正期待的ACK,即 将重发序号为"+(localack+1)+"的数据分组! “); //acksign[localack+1]=1; } else{ localack=ack;//表示正确确认了ACK acksign[localack]=0; } } publicvoidtime(){ switches=0;//标志初始化为0 litime=newTimers(); Timerlimit=newTimer(); limit.schedule(litime,0,100); } } (二)Receiver类 importjava.util.Random; publicclassReceiverextendsThread{publicintlastdata=-1; publicintexpectdata; publicSendersender; publicvoidrun(Senders){ sender=s; System.out.println(”接收方: 现在接收分组数据! "); } voidreceive(intdata,Senders){ sender=s;//发送方的参数传递 System.out.println("接收方: 收到了序号为"+data+"的分组! "); 示警告 } (三)Timers类 //开关为-1表示超时,并且停止计时器 publicTimers(){ System.out.println("发送方: 现在开始计时”); switches=0;//启动计时器时全部初始化 limit=0; } (四)GBN类 import.*; importjava.util.Random; importjava.io.*; publicclassGBNextendsThread{ senddelay(intx,inty)throwsInterruptedException{ System.out.println("发送数据分组"+y+"时发生延迟: 300毫秒! elseif(x==2) {sleep (750);System. out.println( "发送数据分组"+y+"时发生延迟: 毫秒! ");} elseif(x==3){ 1200毫秒! ");} sleep (1200);System. out .println( "发送数据分组 "+y+"时发生延迟 elseif(x==4){ 2500毫秒! ");} sleep (2500);System. out .println( "发送数据分组 "+y+"时发生延迟 elseif(x==5){ 3000毫秒! ");} sleep (3000);System. out .println( "发送数据分组 "+y+"时发生延迟 750 else; } staticvoidOutputWindow(Senders){ intran=newRandom().nextlnt(4); intrandelay=newRandom().nextlnt(6); s.time(); senddelay(randelay,s.localack+1);//设置随机值,模拟数据传 输延迟 if(ran! =1){ re.receive(s.localack+1,s); //设置随机值,模拟数据丢包过程 if(s.localack>=0) if(s.acksign[s.localack]==0){ if(s.localack+3<=6)s.sent[s.localack+3]=0;OutputWindow(s); } } elseSystem.out.println("序号为"+(s.localack+1)+"的分组在 传给接收方途中发生了丢包! "); } if(i! =s.sign.length){ if(i==0){ System.out.println(); System.out.println(”发送方: 现在发送序号为0~2的数据分组 "); s.sent[0]=0; s.sent[1]=0; s.sent[2]=0; System.out.println(); intran1=newRandom().nextInt(4); intrandelay1=newRandom().nextlnt(6); s.time();//计时开始(2秒时间) senddelay(randelay1,0);//设置随机值,模拟数据传 输延迟 if(ran1! =1){ re.receive(s.sign[0],s); //设置随机值,模拟数据丢包过程 if(s.acksign[0]==0){ s.sent[3]=0; s.acknowledged[0]=0; OutputWindow(s); } } elseSystem.out.println("序号为"+"0"+"的分组在传给接收 方途中发生了丢包! “); 输延迟 方途中发生了丢包! 输延迟 方途中发生了丢包! i++; 〃retimes[O]++; intran2=newRandom().nextInt(4); intrandelay2=newRandom().nextlnt(6); s.time();//计时开始(2秒时间) senddelay(randelay2,1);//设置随机值,模拟数据传 if(ran2! =1){ re.receive(s.sign[1],s); //设置随机值,模拟数据丢包过程 if(s.acksign[1]==0){ s.sent[4]=0; 〃retimes[4]++; s.acknowledged[1]=0; OutputWindow(s); } } elseSystem.out.println("序号为"+"1"+"的分组在传给接收 ); i++; 〃retimes[1]++; intran3=newRandom().nextInt(4); intrandelay3=newRandom().nextlnt(6); s.time();//计时开始(2秒时间) senddelay(randelay3,2);//设置随机值,模拟数据传 if(ran3! =1){ re.receive(s.sign[2],s); //设置随机值,模拟数据丢包过程 if(s.acksign[2]==0){ s.sent[5]=0; 〃retimes[5]++; s.acknowledged[2]=0; OutputWindow(s); } } elseSystem.out.println("序号为"+"2"+"的分组在传给接收 ); i++; 〃retimes[2]++; else{ System.out.println(); if(s.sent[i]==0){ System.out.println(”发送方: 现在发送序号为"+i+"的数据分 细,); } else System.out.println(”发送方: 现在发送序号为"+i+"的数据分组"); intran=newRandom().nextInt(4); intrandelay=newRandom().nextlnt(6); s.time();//计时开始(2秒时间) senddelay(randelay,i);//设置随机值,模拟数据传输延迟 if(ran! =1){ re.receive(s.sign[i],s);//设置随机值,模拟数据丢包过程 if(s.acksign[i]==0){ if(i+3<=6){ s.sent[i+3]=0; //System.out.println(”发送方现在发送序号为 "+(i+3)+"的数据分组"); } s.acknowledged[i]=0; OutputWindow(s); } } elseSystem.out.println("序号为"+i+"的分组在传给接收方途中 发生了丢包! “); //System.out.println("i=="+i); //System.out.println("s.localack"+s.localack); i++; } } else break; } /*System.out.println();System.out.println("以下是每个数据分组被发 送过的次数的统计结果"); for(inti=0;i<7;i++) //显示关于每个数据包发送次数的统计表序号为"+i+"的数据分组被发送过的次数为: System.out.println(" "+retimes[i]);*/ System.out.println( "全部数据发送完毕! “); } System.exit(0); } 8.程序运行结果部分截图 旻点扛咗三卷丈为Ew巴: 丈三话=芸兰f=£左止IT三孟奄, V: 在定爲吐序号曲~2的占捷+总 工二站更士蛊er£网乞;25%毛芳; 仝5论。 分尹2兰吒旦孚.二亏全申i^TS'L 盘云方=逗三产冷寸廿 董次方: U負f丰兮料1吏寸 拥&方,3&Ar*£不鼻豪Q听罷埒的,務护畤鬣査弄.撤曲權鼻豈盘呈看授蚕刖牧掘务砂^羽MK: xj^: i+t-rfir-! : i亲豪鱼厘是廿眉吐叮2廿)农金宫曰祥重交学令力0骂皑捋弓! if 盘h肓nat==aerr 戈: 兰士伝丄片攻空云尼: 75Q^v 专主方=攻皇丁若E右2㈱ir三: 就方三谨独据张匡不县彌方屛蒂些壬.崟孑迄咚抵去笄.碗方雄客巨邕最寺尉E訥应韵MK,砂方: ttSITACK・序*方-h坯疋尸右更秋: 1>廉厘・况不霜垮■反亭号烧韵佃丹迟! XJT.总空崇二于号才0巧3? 世: *二 变二: T&冬产芒占衬 益二吉疙〒咗6■打戈空总咗: ? 弓3电} 吳主苫=土皇丁丰寻主召拦夕豈: 生-七: 庁白左才匚三昱字疙于基.疫壬玄产些5■三云PUMRCK 更西方「苗KX.丰爭朋.臥耳球柔叮! 岂r■宦二內扛汁送霄疋为' 霁0令■二星曹早朱出崔子号甘1坊桂尿厲5;肖士迄 界1^1二>3煦卞站是事廿肯2前恃聽认季盂至丁三: =2号签二至m铁半是学冬方2出塔史臥士古圭士圧 齐了专窗-至尹士却总丰勺了叫却亍扭-工土穴旁寸丘 S=.=5Slr! -rt 主苍拦1为&二空哎壬些•贮t登由生兰】邑£益注订: 莊三戈二弓号方1■刊办告才止艾云序至花严芟「廿 豆三占持三汪1盯裒主订三•3M^: 妾吐方;诳旳t幷收正是肝璋峙舟呈玉奩爭冷齐目玉哲空茅占匚心 .j: i.TACK.手号;tl.悅哥W.i 全h芒二方片叶止岂定吉: 3? &号飼=車商啓短敗狂甲寻岩丄期认士JSS工■ 士1号盍二堇面稈盘対壘呼号占3争蓿贼财*刪趾 S2号去二埜閒尋锻输M号扫4封牲吏>'-上衣茎士逞: 苇刁号肖二蛊丙芹氛韵走于号扫5濟心? »*行电! 录盘方匹誉丘近爭令肖2釣即用寸运 xi*,證空严詁计廿 更二才婕芒迄2汙曼至寒広1200<*- 尹空为立打井咗楼淄標枚方准中文至了昙晝: 亘M于: 規三京二严勺方2刊住圭寸艺 生工方: 巨主产壬3廿 支MSSr传三汪2片妄主云三•750^! 兼厂斌孟了嘩号同2和寸丘[ 羡诂•言盘嗚土迄左总怡甫电步.i£i#rfeiIasr±^A匚K: X? +TACK.亨号为2.K=r? i^v-.! 刍才走二丐拘亍11岂豪专: 产0号丟: : 里百哼瓷*总产号亡m兰与芒认比苛兰士丘 黑1导■査二里百将诙为益学寻曲菊柱蒂认莫氓注'. 捺2号囱二至面申芸再昱字号±5丰与芒讥犬占秀亍汪 jfi3V1二養前¥氛封谑于号方6却忙重FBM*砂; 工: 唬三工土尹号方弓笛乂些扌二 SiiT.哎三产弋 二盘立兰十三弓£土主孟远;12^0%t: : 严丁弓巧宁隘三讦倉査匚方盘土策哇才壬耳‘ 妄总〒: 现W3tS帝专沟刁肘掘严H芟迪芟;a==^* iiit^T? ii3! -i±^=;7501^! fti*: 芳-: ..¥.•.二: 一-%严亠上爲亠科哄: 衣三=产三£三二*二二PQK 氏皿芒: 丈M丁已EK”手仔方扎短壬产芒弟*: 当h畫匚内扌廿丘弓运為- 隼0号留二鬲面宰荻和星1FV/4前苛更认韵幻6汙五 聲1¥存二垂西翦恋射迪F? 母为乐曲詣乃认対旳f万国: 恥2住因二亘瓷君三定遐枣燔丸&韓峙诞讣豹tr更h: i: 第了哇廉二巨怪空了.=H? S¥r-7 三: 弍壬: 在三生: ±壬号兰卓谜h至严壬 童圭庁: 秃左尸冷卩廿 宰4、戒乙丁寻■号±4护升忘’ MM.喷换甘送疋迪环集時封.»«*<*Eat! t7FE? tACK: ^5.TACK.宁号之4.在吒产融聃认: 土穷■匚力出牙眩圭芒舟= #0芒住二兰至孝二曲毘J芒主5兰七壬臥主蛊圭寸运 黑3■号百二垂面■埠童捋是荽号方広护? 魂认釣斟&曲匡! »2^*32&st.井m后镒宙口、运举方没有罢童峑拥m牙澄厂 第M号育二三说女丁,芒云音醤宙二-反世方盘有警宣世茁歳海升迄了! 二二T: 匚三二_鼻7二自7: 誥吧-: 二 更=5■: 靈三尹更: 一汙 變工吉省二疽5土崔生辽主: 120&=: 头E左王了*号拒5並寸W: ■•仿壬删昭匸正逼瞬蒸琴再•务31它#岸耳旦三封£刃甌10 圧STACK.丰号鰹5.氐在用沿讥; 卷忙竇二内舒分皿岂况吿: 畀B今童二呈生与土与昱尹号R昌却巴技讥兰处哙n匡 弟1老置二己乞兰丁.产豈芝实麦二■■二丘芳左唱兰工注兰J1卷拧蛙了黑2母愛兰W是仝7.戸益芝窑住二-贸云兰左穹黑三云列暫崔升生了! 黑了号育二E甩土丁•#且看帘盲口、號峑: ? 富书弐交全洞監海廿五了! 文&子号穴E帥站窖分送 3tE=Sril 三二乂昼r』6土工圭总主: 3004^ W-工方: 七乳了丰呂左右半牙三 疑氐订: 于直君三■三己刍产苻与? : •至三言汙绘备旦玉矿己前甌K: 袁送畫: ^ITACK.芋干士&班在菇求*- 当厂宴二龙行才£兰淀再『 *9^*=^A$r,釜卫电ispn-妙: ! r畫菊赛妙豈1*HS分ii丁! ftl^lcEAfiT,汽且拾話■九妙: J湮夸? ! 科却彌甘谊了: 穷2週■董二三巫空T.Fi^^Tz-耳买妙弟聽才迫了: 案了号會二三蛊空了.MZ百當左二-it圭兰左夸芙壬士土士圭: r£T 鱼于「砥0二頁壬 路由算法实验 1.实验目的 1.深入理解分布式路由选择算法,以最简单的DV算法来增 强对路由算法的认识 2.理解、掌握和利用距离向量算法 3.所实现的路由器模拟Internet上的IP路由器。 它能确定网络的最短路由,并在这些利用上传输分组。 2.实验意义 通过本实验,使学生能够对路由原理和路由算法有进一步的 理解和掌握。 3.实验背景 距离矢量算法,也称为Bell
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机网络 GBN 路由 算法 实验 报告