计算机网络原理.实验五

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验五、传输层可靠传输协议GBN编程实验报告

序号:姓名:学号:成绩

一、实验目的:

1、编程实现简单可靠的数据传输GBN协议,模拟可靠数据传输

2、理解TCP协议可靠传输的差错检测、重传、累计确认、定时器的可靠传输策略。

二、实验指导:

参考教材。

三、实验要求:

编程实现一个GBN传输协议,采用编程语言不限,要求能将发送――接收流程以及处理方法表现出来.附源代码及注释并附上实验结果截图。

#include

#define BIDIRECTIONAL 0 /* change to 1 if you're doing extra credit */

/* and write a routine called B_output */ 如果你想做酷文解码和写一个程序叫B_output就改变值为0

/* 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. */ struct msg

是从第五层传送到第四层的数据单元,它包含了通过传送层协议被传送到第五层的数据{

char data[20];

};

/* 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 payload[20];

};

/********* STUDENTS WRITE THE NEXT SEVEN ROUTINES *********/

#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

int expectedseqnum; /* expected sequence number at receiver side */ 在接收端预期序列号

int nextseqnum; /* next sequence number to use in sender side */ 下一个序号在发送方使用

int base; /* the head of sender window */

发送方窗口的负责人

struct pkt winbuf[WINDOWSIZE]; /* window packets buffer */

窗口包缓冲区

int winfront,winrear; /* front and rear points of window buffer */ 前后点的窗口缓冲区

int pktnum; /* packet number of window buffer */

包数量的窗口缓冲区

struct msg buffer[MAXBUFSIZE]; /* sender message buffer */

发送消息缓冲区

int buffront,bufrear; /* front and rear pointers of buffer */

前方和后方的缓冲区的指针

int msgnum; /* message number of buffer */

消息数量的缓冲

int packet_lost =0;

int packet_corrupt=0;

int packet_sent =0;

int packet_correct=0;

int packet_resent =0;

int packet_timeout=0;

void ComputeChecksum(packet)//计算校验和

struct pkt *packet;

{

int checksum;

int i;

checksum = packet->seqnum;

checksum = checksum + packet->acknum;

for ( i=0; i<20; i++ )

checksum = checksum + (int)(packet->payload[i]);

checksum = 0-checksum;

packet->checksum = checksum;

}

//检查是否出错

int CheckCorrupted(packet)

struct pkt packet;

{

int checksum;

int i;

checksum = packet.seqnum;

checksum = checksum + packet.acknum;

for ( i=0; i<20; i++ )

checksum = checksum + (int)(packet.payload[i]);

if ( (packet.checksum+checksum) == 0 )

return (FALSE);

else

return (TRUE);

}

//A端向外发送数据

/* called from layer 5, passed the data to be sent to other side */

A_output(message)

来自第五层,通过数据派往另一边

struct msg message;

{

int i;

struct pkt sendpkt;

/* if window is not full */

if ( nextseqnum < base+WINDOWSIZE ) {

printf("----A: New message arrives, send window is not full, send new messge to layer3!\n");

/* create packet */如果窗口没有满

sendpkt.seqnum = nextseqnum;

sendpkt.acknum = NOTUSED;

for ( i=0; i<20 ; i++ )

相关文档
最新文档