java:基于UDP在应用层application
当前位置:以往案例 > >java:基于UDP在应用层application
2019-05-12

概要:

设计一个研究不同协议protocol下,基于UDP在应用层application layer实现端对端end-to-end的可靠的信息传输。

要求用JAVA实现三个不同的滑动窗口协议sliding window protocols: Stop-and-wait, Go Back N和Selective Repeat,在应用层,使用UDP接口。注意stop-and-wait protocol可以被视为滑动窗口协议的特例,其中发送者和接收者的窗口大小都是1.

在这三个滑动窗口协议中,要求制作两个协议的端点protocol endpoints分别作为发送者和接收者;这些端口同样作为应用程序application programs。数据交流是单向的,需要把一个大文件通过一个链接link,用小文件从发送者转移到接收者。假设这个链接link的带宽和延迟是对称的。

为了测试协议的运行以及它们的特性,需要用到Dummynet这个软件,它是一个链接模拟器。注意,发送者和接收者将在同一个虚拟机里运行以上三个协议(Stop-and-wait, Go Back N和Selective Repeat)并通过Dummynet模拟的链接互相交流。在这个作业里,只需要Dummynet的基本功能去模拟一个符合条件的链接(条件为带宽、延迟和丢包率)。


过程指导:

必须能在DummynetSL6 VM中运行。
1, 可以有一个公共文件夹和公共程序包,不过这些都要上交。
2, 发送端在长时间等待确认信息ACK,但一直未收到时,需要自动关闭。
3, 请在代码中加上注释。
4, 在每段代码前,请注明学生信息,比如/* John Doe 1234567 */


1a:基础架构(在理想条件下的大文件传输)

设计一个发送和接收的终端来传递大文件:

1,在localhost上通过UDP协议,把一系列小的文件(最大1KB, 1KB=1024 bytes)通过Dummynet模拟的两条链接(一条in,一条out)来传输。这两条链接的参数为:10Mbps带宽、5ms 单向传播延迟和0%丢包率。如此设置下,一个总的往返传播延迟为20ms。

2,在发送者的代码里,在每次包的传输之后插入一个至少10ms的缓冲沟(a 10ms gap, i.e., sleep for 10ms):
在Dummynet里设置默认队列长度queue size为50(最大100)。因为发送者的发送率一般比链接速度link speed,10Mbps要快,所以队列不可避免的会溢出、丢包。因为是在理想条件下,所以建议设置一个10ms的缓冲沟。如果丢包情况持续出现,那就把缓冲沟的时间增大。注意,只有在1a部分才能插入缓冲沟,从1b部分往后,这个缓冲沟将被移除。

3,在这些传输的数据消息中,发送者一定要有一个16位消息序列号的开头部分(为了在后面的部分重复过滤接收端),还要有一个字节标志来标明最后一条消息(end-of-file)。举个例子:


4,把发送者和接收者命名为Sender1a.java和Receiver1a.java,其中接收者需要把传输后的信息存到本地文件夹里(传输后的信息要从包中去掉开头部分header)。


详细指导:

1,发送端需要如下的命名,并且一定要接受控制段command line的选项:
java Sender1a
注意:
是对应接收端的IP地址。因为接收端和发送端都在同一个机子上,可以是127.0.0.1或者是localhost
是接收端的端口号
是要传输的文件名
举个例子:java Sender1a localhost 54321 sfile


2,接收端需要如下的命名,并且一定要接受控制段command line的选项:
java Receiver1a
注意:
是接收端将要用的端口号
是要传输的文件名
举个例子:java Receiver1a 54321 rfile


3,预期结果:文件成功传输到接收端,接收端和发送端的文件必须一致(must be identical at a binary level)





1b:Stop-and-wait

在1a的基础上,添加一个stop-and-wait协议,尤其是RDT3.0。

提示:需要两个有限状态机(finite state machines, FSM);一个作为RDT3.0的发送端,另一个作为RDT3.0的接收端。当发送端FSM表示为in时,RDT3.0接收端FSM将不存在,会变为RDT2.2接收端并表示为in。在开始做RDT3.0协议之前,先想想为什么RDT2.2这么重要。

1,把做好的发送端和接收端这两个程序命名为Sender1b.java和Receiver1b.java。在这个部分,需要定义一个确认信息(acknowledgement (ACK) message),让接收端用来告知发送端消息已送达。接收端需要用发送端提供的序列号来丢弃重复的文件(Discarding duplicates at the receiver end using sequence numbers put in by the sender is also required)。通过在发送方端使用一个小的重传超时(retransmission timeout),可以在实现中测试重复检测功能的工作。

确认信息的格式如下:


2,关于Dummynet的设置,丢包率调整为每个链接(in和out)都为5%,其他不变(10Mbps带宽、每个链接5ms单向传播延迟)。实验不同的重传超时和与之对应的重传和吞吐量(throughput)


详细指导:

1,发送端需要如下的命名,并且一定要接受控制段command line的选项:
java Sender1b
、、的定义同作业1a
应该为一个正整数,单位是毫秒(millisecond)
举个例子:java Sender1b localhost 54321 sfile 10

2, 接收端的命名同作业1a

3,期望输出:(1)文件成功传输到接收端,接收端和发送端的文件必须一致(must be identical at a binary level)

(2)发送端一定要在一行之内输出一系列的重传和吞吐(in Kbytes/second);不允许显示其他的终端输出内容;举个例子:以下输出表示重传了10次,吞吐量为200Kbytes/second
10 200
4,把观察结果填写在表格内。对于问题1,在编写发送端时,需要计算重传次数并记录平均吞吐量(单位是KB/s),吞吐量的定义是文件大小(单位KB)除以传输时间(单位秒)。传输时间是第一个消息发出的时间到收到最后一条消息的确认信息(ACK)的时间。在发送端完成发送并退出之前,打印出平均吞吐量。

5,对于问题2,讨论重传数量和吞吐量对于重传超时的影响。同时基于交流效率的观点,指出最佳的超时值。(举个例子:能最小化重传数量的超时值)


作业2a:Go-Back-N

在Sender1b.java和Receiver1b.java的基础上添加Go-Back-N 协议,可以通过让发送端端口大小(Window size)大于1来实现。把发送端和接收端命名为Sender2a和Receiver2a。

详细指导:

1,发送端需要如下的命名,并且一定要接受控制段command line的选项:
java Sender2a
其中都和以前一样
是一个正整数
举个例子:java Sender2a localhost 54321 sfile 10 5

2,接收端和以前一样。

3,期望输出:(1)文件成功传输到接收端,接收端和发送端的文件必须一致(must be identical at a binary level)

(2)发送端一定要在一行之内输出吞吐量(in Kbytes/second);不允许显示其他的终端输出内容;举个例子:以下输出表示重传了10次,吞吐量为200Kbytes/second:
200


4,在模拟器的发送端实验不同的窗口大小(window size从1开始每次乘以2(1,2,4,8…))以及不同的单向传播延迟(5ms,25ms,100ms)。在5ms单向传播延迟中,使用在作业1中发现的最佳重传量。在25ms和100ms时重新调整重传量,求一个最佳值。在实验时,模拟链接使用如下数据:在in和out链接中,带宽设置为10Mbps,丢包率为0.5%。把测试结果写入表格里。

2b:Selective Repeat


在线提交订单