高分求救:同学作业要求自己编写一个协议,用UDP传输一个文件,要求能够控制丢包和错包的百分比,还有实现流量控制

mei324 2005-05-19 01:27:43
目标:设计和实现一个可靠的数字传输协议。
要求:做一个MTP(my transport protocol), 允许一个发送方和一个接受方之间在UDP基础上单向传输数据,用相反的方向传输确认信息(acknowledge)。 MTP必须基于Go-Back-N(GBN) 协议。
1.发送方和接收方的程序代码主要包含在以下文件: mtp_sender.c(或者mtp_sender.java) 和mtp_receiver.c(或者mtp_receiver.java).
2.在mtp_sender中利用一个参数(mtp_sender共有4个参数)实现一个模块PLD(Packet Loss and Delay)控制丢包的百分比。后面将详细讲到。
3.MTP协议必须使用Go-Back-N(GBN)滑动窗口协议的序号(sequence number),累计确认(cumulative acknowledgements), 计时器(timers),发送缓存等来实现传输,而且应该允许管道传输(能够同时传输多个包)。发送方的窗口,N,将作为发送方的一个参数。(提示:只需要一个计时器,与最早的一个未被确定的包相连)。
4.不必实现流量控制和碰撞控制。
5.准确的MTP包格式由你自己决定,头能够包含任何你认为必要的信息,不过重要的是要包含序号。数据部分必须包含32个字节。确认包与数据报的头文件格式完全一样,唯一不同的是确认包不包含数据部分。包的格式类似于:
|Header fields (variable size)|Data (32 bytes)|
所有需要的信息都需要在MTP头文件中提供,不能使用封装MTP包的UDP数据报头文件中的信息。

下面是两个程序和参数的基本描述:
MTP_Sender:
1.接受5个参数,
1)RECEIVER_HOST_IP:接收方的IP地址。
2)RECEIVER_PORT:接收方的端口号。
3)file.txt:要传送的文本文件名。
4)WINDOW_SIZE: GBN协议使用的窗口大小。
5)Pdrop:MTP丢包的百分比。介于0-1之间。比如:假如Pdrop =0.5, 意味着50%被传输的包将被PLD丢弃。
2.MTP_Sender首先打开一个UDP SOCKET(允许操作系统捕获端口号)。
3.MTP_Sender必须假设file.txt中总有数据等待传输。所以只要传输方窗口有空间,MTP_Sender就应该从文本文件中读取下32个字节的数据,建立一个前面提到格式的MTP包然后传送给PLD. 注意:最后一个包可能小于32个字节,这完全取决于文本文件剩下了多少字节。
4.PLD 模块:
1)这个模块是作为MTP_Sender的一部分,使用最后一个参数(Pdrop )控制丢包百分比。
2)生成一个0-1之间随机的数字,如果选定的百分比Pdrop大于这个随机数,传送包,如果小于这个 数字,丢弃包。
3)假如Pdrop大于随机数,包将被传送,MTP_Sender应该将MTP包封装在UDP数据报中,通过UTP SOCKET传送给MTP_Receiver.(用RECEIVER_HOST_IP和RECEIVER_PORT作为相应的目标IP地址和端口号)。
5.一旦整个文件传输完毕(传输方的窗口为空),MTP_Sender关闭UDP SOCKET,终止程序。
6.MTP_Sender应该维护一个日志文件:mtp_sender_log.txt,记录所有的事件以及时间发生的时间。文件格式应该是: Time, Event, Packet Details。Time是你的本地系统时间, Event是发生在那个时间的时间,比如“transmitted packet x”, “dropped packet y”, “received an ACK with sequence number z”,等等。Packet Details应该包含相应MTP包的具体信息,比如头和数据部分(假如它是数据包的话)。不要记录UDP头。每一条记录一行。准确的格式自己决定。建议: 在程序中实现这个功能,一个比较好的地方是紧跟在每个事件发生之后。
7.MTP_Sender从MTP_Receiver处通过发送方用来传送数据的同一个包接收确认信息。MTP_Sender必须将确认信息从UDP数据报中解析出确认信息,然后作为每个GBN协议操作处理。注意:确认信息应该绕过PLD module的处理。
8.一旦整个文件被MTP_Sender可靠的传输完毕,关闭UDP SOCKET.

MTP_Receiver:

1.MTP_Receiver应该接受2个参数
1)RECEIVER_PORT: MTP_Receiver将打开UDP SOCKET的端口号以用来接受数据报。
2)file.txt: 存储发送方传送过来的文本的文件名。
2.接收方应该首先在RECEIVEPORT上打开一个UDP侦听socket,等待从发送方的数据报
3.接收方建立一个新的文本文件file.txt。所有的到达数据都被存储在这个文件中。
4.MTP_Receiver首先从UDP数据报中解析出MTP包。决定这个包是否应该被接收还是被丢弃。
5.既然正在执行GBN协议,发送方不需要接受窗口。接收方必须用正确的顺序接受MTP数据包。任何错序或者重复的包都必须被丢弃。对每一个被接收的包,接收方应该解析出MTP包中的数据部分并且写入file.txt. 假如你的协议能够正确执行,结果的文本文件应该跟发送方的文件一摸一样。
6.发送方应该维护一个日志文件:mtp_receiver_log.txt,记录所有的事件以及时间发生的时间。文件格式应该是: Time, Event, Packet Details。Time是你的本地系统时间, Event是发生在那个时间的时间,比如“received packet x”, “received out-of-order packet y”, “transmitted an ACK with sequence number z”,等等。Packet Details应该包含相应MTP包的具体信息,比如头和数据部分(假如它是数据包的话)。不要记录UDP头。每一条记录一行。准确的格式自己决定。建议: 在程序中实现这个功能,一个比较好的地方是紧跟在每个事件发生之后。
7.既然接收方不确定最后一个数据包将什么时候到达,不要关闭UDP SOCKET。 接收方程序只能用CTRL_C来终止。


联系方式:msn:peiyu623@hotmail.com
qq:18169829


...全文
433 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cxydbydyq 2005-06-30
  • 打赏
  • 举报
回复
是计算机网络的作业吗?哪个学校阿?一个作业搞这么多飞机,要求蛮多的~
csu_zyj 2005-06-30
  • 打赏
  • 举报
回复
我建议取download一个java通讯程序看看思路
csu_zyj 2005-06-30
  • 打赏
  • 举报
回复
没有人会?
sunshine5246 2005-05-19
  • 打赏
  • 举报
回复

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧