实验目的
运用各种编程语言实现基于 Go-Back-N 的可靠数据传输软件。
实验环境
系统:Mac OS X 10.13.1
语言:Java
开发平台:eclipse
内部库:java.net,java.util
实验过程
代码设计
为了完成本次试验的要求,我编写了两个Java代码文件,分别实现server端功能和client端功能:
- server端代码流程
主要算法流程如下所示,server端实现在一定丢包率范围内接收数据包并且回传ACK: - client端代码流程
主要的算法流程如下,client端主要实现数据包的传送以及延迟处理:
主机ip获取
在启用Go-Back-N之前,我们首先需要获得个人电脑的IP。在Mac OS X系统,使用终端命令ifconfig即可直接查看主机IP,具体如下:
丢包率为0下的测试
为了验证代码的正确性,我首先先把丢包率设置为0查看了具体的传输流程,代码执行结果如下:
窗口长度 windowSize = 4;
数据包总数 num = 10;
超时限制 Timer = 1000ms
执行结果如下:
丢包率为10%下的测试
为了继续验证代码的正确性,而后我把丢包率设置为10%查看了具体的传输流程,代码执行结果如下:
小结
本次实验中,我们完成了java的网络编程,模拟了GBN算法的运行,对GBN协议有了进一步的了解。
在GBN协议中,接收方会丢弃所有失序的分组,尽管丢弃一个正确接收但是失序的分组有点浪费。但是根据GBN的原理。假定当前期望的编号是n,但是n+1提前达到。因为数据必须是有序交付,接收方可能缓存分组n+1,然后在他收到并交付分组n后,再将该分组交付到上层。但是如果n丢失,则n和n+1的分组都会被重发,因此,接收方只需要丢弃分组n+1即可。
这种方法的优点是接收方缓存简单,即接收方不需要缓存任何失序分组。对于发送方来说,他只需要维护窗口的下边界和和nextseqnum在窗口中的位置。对于接收方来说,只需要维护下一个按序接收的分组的序号。
代码附录
1 | /************************发送方************************/ |
1 | /************************接收方************************/ |