资源预览内容
第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
第9页 / 共26页
第10页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
实验七、传输层可靠传输协议GBN编程实验报告一、实验目的:1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。二、实验指导:参考教材。三、实验要求:编程实现一个GBN传输协议,采用编程语言不限,要求能将发送一一接收流程以及处理方法 表现出来.附源代码及注释并附上实验结果截图。一、GBN.h#pragma once#include 基础功能模块的数据结构声明#define BIDIRECTIONAL 1/* change to 1 if youre doing extra credit andwrite a routine called B_output */如果你想做酷文解码和写一个程序叫B_output就改变值为1/* a msg is the data unit passed from layer 5 (teachers code) to layer 4 (students code). It contains the data (characters) to be delivered to layer 5 via the students transport level protocol entities.*/一个“msg”是从第五层传送到第四层的数据单元.它包含通过传送层协议被传送到 第五层的数据 struct msg char data20;/* 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 students must follow. */一个数据包从第四层传送到第三层的数据单元.声明提 前定义的学生必须遵守的数据包结构 struct pkt int seqnum; int acknum; int checksum;char payload20;#define WINDOWSIZE 8#define MAXBUFSIZE 50#define RTT 15.0#define NOTUSED 0#define NACK -1#define TRUE1#define FALSE0#define A0#define B1网 络 仿 真 部 分 数 据 结 构声明 * struct event float evtime;/* event time */ 事件时间int evtype;/* event type 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#defineFROM_LAYER51#defineFROM_LAYER32#defineOFF0#defineON1 基 础 功 能 模 块 的 函 数 声 明 * void ComputeChecksum(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_timerinterrupt();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 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;/* 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 */ 从第五层到达的信息的次序int ntolayer3;/* number sent into layer 3 */被传送到第三层的数据/* number lost in media */ 在媒介中static int nlost = 0;心r LE AU数据丢失static int ncorrupt = 0;/* number corrupted by media*/被媒介毁坏的数据static int expectedseqnum = 0;/* expected sequence number atreceiver side */在接收者这边接收到预期的序列数据static int nextseqnum;/* next sequence number to use insender 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;/* packet 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;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-checksum;packet-checksum = checksum;/检查是否出错int CheckCorrupted(struct pkt packet) int checksum;int i;checksum = packet.seqnum;checksum = checksum + packet.acknum;for ( i=0; i20; i+ )checksum = checksum + (int)(packet.payloadi);if ( (packet.checksum+checksum) = 0 ) return (FALSE);else return (TRUE);/A端向外发送数据/* called fr
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号