收藏 分享(赏)

云南大学软件学院计算机网络原理实验六实验报告.doc

上传人:精品资料 文档编号:10600658 上传时间:2019-12-04 格式:DOC 页数:26 大小:130KB
下载 相关 举报
云南大学软件学院计算机网络原理实验六实验报告.doc_第1页
第1页 / 共26页
云南大学软件学院计算机网络原理实验六实验报告.doc_第2页
第2页 / 共26页
云南大学软件学院计算机网络原理实验六实验报告.doc_第3页
第3页 / 共26页
云南大学软件学院计算机网络原理实验六实验报告.doc_第4页
第4页 / 共26页
云南大学软件学院计算机网络原理实验六实验报告.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

1、实验六、传输层可靠传输协议 GBN 编程实验报告序号: 姓名: 学号: 成绩 指导老师: 一、实验目的:1、通过编写实现一个简单可靠的数据传输协议 GBN的发送和接收代码,模拟可靠数据传输2、理解 TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。二、实验指导:参考教材。动画演示:http:/ a packet is the data unit passed from layer 4 (students code) to layer 3 (teachers code). Note the pre-defined packet structure, which all stud

2、ents must follow. */struct pktint seqnum;int acknum;int checksum;char payload20;#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE 1#define FALSE 0#define A 0#define B 1/网络仿真部分数据结构声明*struct eventfloat evtime; /* event time */int evtype; /* event typ

3、e code */int eventity; /* entity where event occurs */struct pkt *pktptr; /* ptr to packet (if any) assoc w/ this event */struct event *prev;struct event *next;/* possible events: */#define TIMER_INTERRUPT 0 #define FROM_LAYER5 1#define FROM_LAYER3 2#define OFF 0#define ON 1/基础功能模块的函数声明*void Compute

4、Checksum(struct pkt *packet);/计算校验和int CheckCorrupted(struct pkt packet);/检查数据是否出错void A_output( struct msg message);/A端向外发送数据void A_input(struct pkt packet);/A端接收数据void A_timerinterrupt();/A计时器超时void A_init();/A端初始化void B_output(struct msg message); void B_input(struct pkt packet);void B_timerinter

5、rupt();void B_init();/网络仿真部分的函数声明*void init(); /初始化仿真器float jimsrand();/随机数发生器0,1/处理事件列表部分的函数声明*void generate_next_arrival();/产生下一个到达的分组void insertevent(struct event *p);/向事件列表中插入一条新的事件void printevlist();/打印事件列表/*/*计时器模块*void stoptimer(int);/停止计时器void starttimer(int,float);/启动计时器/*/*网络各层之间传送模块*void

6、tolayer3(int AorB,struct pkt packet);/向第 3层发送信息void tolayer5(int AorB,char datasent20);/向第 5层发送信息二、 GBN.c#include “GBN.h“#include #include #include extern int TRACE = 1; /* for my debugging */为我的调试 extern int nsim = 0; /* number of messages from 5 to 4 so far */目前为止信息的数字是从 5到 4extern int nsimmax = 0

7、; /* number of msgs to generate, then stop */如果信息产生的数字为 0,然后就停止extern float time = 0.000;float lossprob; /* probability that a packet is dropped */数据包可能会丢失float corruptprob; /* probability that one bit is packet is flipped */这一点的数据包可能会被弹出去float lambda; /* arrival rate of messages from layer 5 */ 第五层

8、到达的信息的次序int ntolayer3; /* number sent into layer 3 */被传送到第三层的数据static int nlost = 0; /* number lost in media */在媒介中数据丢失static int ncorrupt = 0; /* number corrupted by media*/ 被媒介毁坏的数据 static int expectedseqnum = 0; /* expected sequence number at receiver side */ 在接收者这边接收到预期的序列数据static int nextseqnum

9、; /* next sequence number to use in sender side */ 下一个序列数据使用在发送者这边static int base; /* the head of sender window */ 发送者的头窗口 struct pkt winbufWINDOWSIZE; /* window packets buffer */ 数据包缓冲区窗口 static int winfront,winrear; /* front and rear points of window buffer */ 窗口缓冲区的前方点和后方点 static int pktnum; /* p

10、acket number of window buffer */ 窗口缓冲区的数据包个数 struct msg bufferMAXBUFSIZE; /* sender message buffer */ 发送消息缓冲区 int buffront,bufrear; /* front and rear pointers of buffer */ 缓冲区的前指针与后指针 static int msgnum; /* message number of buffer */ 信息数量的缓冲int packet_lost =0; int packet_corrupt=0;int packet_sent =0

11、;extern int packet_correct=0;extern int packet_resent =0;int packet_timeout=0;extern struct event *evlist = NULL; /* the event list */计算校验和void ComputeChecksum( struct pkt *packet) int checksum;int i;checksum = packet-seqnum;checksum = checksum + packet-acknum;for ( i=0; ipayloadi);checksum = 0-chec

12、ksum;packet-checksum = checksum;/检查是否出错int CheckCorrupted(struct pkt packet)int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i 0.0: “);/fscanf(fp,“%f“,scanf(“%f“,printf(“nEnter TRACE: “);/fscanf(fp,“%d“,scanf(“%d“,printf(“nn“);srand(9999); /* init random num

13、ber generator */sum = 0.0; /* test random number generator for students */for (i=0; i 0.75)printf(“It is likely that random number generation on your machinen“ ); printf(“is different from what this emulator expects. Please taken“);printf(“a look at the routine jimsrand() in the emulator code. Sorry

14、. n“);exit(0);*/printf(“%f“,avg);ntolayer3 = 0;nlost = 0;ncorrupt = 0;time=0.0; /* initialize time to 0.0 */generate_next_arrival(); /* initialize event list */随机数发生器float jimsrand() double mmm = 2147483647; /* largest int - MACHINE DEPENDENT! */float x; /* individual students may need to change mmm

15、 */ x = rand()/mmm; /* x should be uniform in 0,1 */return(x); /*/*事件处理部分*void generate_next_arrival()double x,log(),ceil();struct event *evptr;float ttime;int tempint;/if (TRACE2)/printf(“-GENERATE NEXT ARRIVAL: creating new arrivaln“);x = lambda*jimsrand()*2; /* x is uniform on 0,2*lambda */* havi

16、ng mean of lambda */evptr = (struct event *)malloc(sizeof(struct event);evptr-evtime = time + x; evptr-evtype = FROM_LAYER5;if (jimsrand()eventity = A;elseevptr-eventity = B;insertevent(evptr);/向事件列表中插入一条新的事件void insertevent(struct event *p) struct event *q,*qold;if (TRACE2)/printf(“ INSERTEVENT: ti

17、me is %lfn“,time);/printf(“ INSERTEVENT: future time will be %lfn“,p-evtime); q = evlist; /* q points to front of list in which p struct inserted */if (q=NULL)/* list is empty */ evlist=p;p-next=NULL;p-prev=NULL;elsefor (qold = q; q !=NULL q=q-next)qold=q; if (q=NULL)/* end of list */ qold-next = p;

18、p-prev = qold;p-next = NULL;else if (q=evlist)/* front of list */ p-next=evlist;p-prev=NULL;p-next-prev=p;evlist = p;else /* middle of list */ p-next=q;p-prev=q-prev;q-prev-next=p;q-prev=p;/打印事件列表void printevlist()struct event *q;int i;printf(“-nEvent List Follows:n“);for(q = evlist; q!=NULL; q=q-ne

19、xt)printf(“Event time: %f, type: %d entity: %dn“,q-evtime,q-evtype,q-eventity);printf(“-n“);/启动计时器void starttimer(int AorB,float increment)struct event *q;struct event *evptr;if (TRACE2)printf(“n-A: START TIMER: starting timer at %fn“,time);/* be nice: check to see if timer is already started, if so

20、, then warn */* for (q=evlist; q!=NULL q = q-next) */for (q=evlist; q!=NULL ; q = q-next)if ( (q-evtype=TIMER_INTERRUPT return;/* create future event for when timer goes off */evptr = (struct event *)malloc(sizeof(struct event);evptr-evtime = time + increment;evptr-evtype = TIMER_INTERRUPT;evptr-eve

21、ntity = AorB;insertevent(evptr); /停止计时器/* called by students routine to cancel a previously-started timer */void stoptimer(int AorB) /* A or B is trying to stop timer */struct event *q,*qold;if (TRACE2)printf(“n-A: STOP TIMER: stopping timern“);/* for (q=evlist; q!=NULL q = q-next) */for (q=evlist;

22、q!=NULL ; q = q-next) if ( (q-evtype=TIMER_INTERRUPT /* remove first and only event on list */else if (q-next=NULL) /* end of list - there is one in front */q-prev-next = NULL;else if (q=evlist) /* front of list - there must be event after */ q-next-prev=NULL;evlist = q-next;else /* middle of list *

23、/ q-next-prev = q-prev;q-prev-next = q-next;free(q);return;/printf(“Warning: unable to cancel your timer. It wasnt running.n“);/向第三层发送信息/* TOLAYER3 */void tolayer3(int AorB,struct pkt packet)struct pkt *mypktptr;struct event *evptr,*q;float lastime, x, jimsrand();int i;ntolayer3+;/* simulate losses:

24、 */if (jimsrand() 0) printf(“ TOLAYER3: packet being lostn“);return;/* make a copy of the packet student just gave me since he/she may decide */* to do something with the packet after we return back to him/her */ mypktptr = (struct pkt *)malloc(sizeof(struct pkt);mypktptr-seqnum = packet.seqnum;mypk

25、tptr-acknum = packet.acknum;mypktptr-checksum = packet.checksum;for (i=0; ipayloadi = packet.payloadi;if (TRACE2)printf(“ TOLAYER3: seq: %d, ack %d, check: %d “, mypktptr-seqnum,mypktptr-acknum, mypktptr-checksum);for (i=0; ipayloadi);printf(“);/* create future event for arrival of packet at the oth

26、er side */evptr = (struct event *)malloc(sizeof(struct event);evptr-evtype = FROM_LAYER3; /* packet will pop out from layer3 */evptr-eventity = (AorB) % 2; /* event occurs at other entity */evptr-pktptr = mypktptr; /* save ptr to my copy of packet */* finally, compute the arrival time of packet at t

27、he other end.medium can not reorder, so make sure packet arrives between 1 and 10time units after the latest arrival time of packetscurrently in the medium on their way to the destination */lastime = time;/* for (q=evlist; q!=NULL q = q-next) */for (q=evlist; q!=NULL ; q = q-next) if ( (q-evtype=FRO

28、M_LAYER3 evptr-evtime = lastime + 1 + 9*jimsrand();/* simulate corruption: */if (jimsrand() payload0=Z; /* corrupt payload */else if (x seqnum = 999999;elsemypktptr-acknum = 999999;if (TRACE0)printf(“ TOLAYER3: packet being corruptedn“);/if (TRACE2) /printf(“ TOLAYER3: scheduling arrival on other si

29、den“);insertevent(evptr); /向第五层发送信息/* TOLAYER5 */void tolayer5(int AorB,char datasent20)int i; if (TRACE2)printf(“ TOLAYER5: data received: “);for (i=0; i#include #include extern int TRACE ; /* for my debugging */ extern int nsim ; /* number of messages from 5 to 4 so far */ extern int nsimmax; /* n

30、umber of msgs to generate, then stop */extern float time;extern int packet_correct;extern int packet_resent;extern struct event *evlist;int main()struct event *eventptr;struct msg msg2give;struct pkt pkt2give;int i,j;char c; init();A_init();B_init();while (1) eventptr = evlist; /* get next event to

31、simulate */if (eventptr=NULL)goto terminate;evlist = evlist-next; /* remove this event from event list */if (evlist!=NULL)evlist-prev=NULL;if (TRACE = 2)printf(“nEVENT time: %f,“,eventptr-evtime);printf(“ type: %d“,eventptr-evtype);if (eventptr-evtype=0)printf(“, timerinterrupt “);else if (eventptr-

32、evtype=1)printf(“, fromlayer5 “);elseprintf(“, fromlayer3 “);printf(“ entity: %dn“,eventptr-eventity);time = eventptr-evtime; /* update time to next event time */if (nsim=nsimmax)break; /* all done with simulation */if (eventptr-evtype = FROM_LAYER5 )generate_next_arrival(); /* set up future arrival

33、 */* fill in msg to give with string of same letter */ j = nsim % 26; for (i=0; i2)printf(“ MAINLOOP: data given to student: “);for (i=0; ieventity = A)A_output(msg2give); elseB_output(msg2give);else if (eventptr-evtype = FROM_LAYER3)pkt2give.seqnum = eventptr-pktptr-seqnum;pkt2give.acknum = eventpt

34、r-pktptr-acknum;pkt2give.checksum = eventptr-pktptr-checksum;for (i=0; ipktptr-payloadi;if (eventptr-eventity = A) /* deliver packet by calling */A_input(pkt2give); /* appropriate entity */elseB_input(pkt2give);free(eventptr-pktptr); /* free the memory for packet */else if (eventptr-evtype = TIMER_I

35、NTERRUPT)if (eventptr-eventity = A) A_timerinterrupt();elseB_timerinterrupt();elseprintf(“INTERNAL PANIC: unknown event type n“);free(eventptr);terminate:printf(“ Simulator terminated at time %fn after sending %d msgs from layer5n“,time,nsim);printf(“ correctly sent pkts: %d n“, packet_correct);printf(“ resent pkts: %d n“, packet_resent);system(“pause“);附源代码及注释四 . 实验小结通过本次试验了解了编程实现简单可靠的数据传输 GBN协议,模拟了可靠数据传输 理解了 TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报