计算机网络原理.实验五
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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++ )