COMP3331/9331计算机网络与应用
2024年第1学期的转让
版本1.0
到期时间:2024年4月18日星期四上午11:59(中午)(第10周)1.变更日志
版本1.0于2024年3月7日发布。
2.目标和学习目标
对于此任务,您要在UDP协议上实现一个可靠的传输协议。我们将引用您将在本任务中实现的可靠传输协议
简单传输协议(STP)。STP将包括以下大部分(但不是全部)功能如Kurose和Ross的《计算机网络》(第7或第8版ed.)或第4/5周课堂讲稿中的等效部分。这些功能的示例包括超时、ACK、序列号、滑动窗口等。注意,这些功能通常存在于许多传输协议中。因此,这次任务将给你一个机会实现传输协议的一些基本特性。此外,你可能想知道
为什么TCP/IP协议栈的设计者包括这样一个无特征的传输协议UDP。你会发现,在这个任务中,你可以设计自己的传输协议并运行它通过UDP。互联网上的一些多媒体交付服务就是这样,它们有通过UDP实现了他们自己的专有传输协议。QUIC,一种新提出的运输方式该协议还通过UDP运行,并实现诸如可靠性之类的附加功能。回想一下,UDP在一对主机之间提供点对点、不可靠的数据报服务。在这个编程任务,您将开发一个更结构化的协议STP,它确保在数据包丢失的情况下提供可靠、端到端的数据。STP提供字节流像TCP这样的抽象,并使用滑动窗口发送流水线数据段。然而,STP不实现拥塞控制或流量控制。最后,尽管TCP完全允许双向通信,您对STP的实现将是不对称的。会有两个
不同的STP端点,分别为“发送方”和“接收方”。数据包将仅在从发送者到接收者的“正向”方向,而确认将仅在
从接收器返回到发送器的“反向”方向。支持协议中的可靠性,如STP,状态必须在两个端点上维护。因此,与TCP一样,连接设置和连接拆卸阶段将是协议不可分割的一部分。STP应实现滑动窗口协议,其中多个分段可以由发送器以流水线方式发送。与TCP一样,STP将包括Go-Back-N(GBN)和选择性重复(SR)的一些元素。你会使用STP协议从
从发送者到接收者。
发送器程序还必须模拟不可靠通信信道的行为
在发送方和接收方之间。即使UDP段可能会丢失
在我们的测试环境中,损失几乎为零,发送器和接收器将在同一台机器。此外,为了正确测试您的发件人程序的实现,我们将喜欢控制底层信道的不可靠行为。发送器程序应该
任务的更新,包括任何更正和澄清,将发布在
课程网站。请确保您定期查看课程网站以获取更新。
2.
模拟两个方向上STP段的丢失——(i)中的DATA、SYN和FIN段正向和(ii)反向上的ACK段。您可以假设
底层通道永远不会重新排序或损坏STP段(在两个方向上)。请注意,必须通过UDP实现STP。不要使用TCP套接字。你如果使用TCP套接字,则不会收到此分配的任何标记。2.1学习目标
完成此任务后,您将获得以下技能方面的足够专业知识:1.详细了解TCP等可靠传输协议的功能。
2.UDP传输协议的套接字编程。
3.协议和消息设计。
非CSE学生版本:此选项的基本原理是,学生注册的课程不包括计算机科学部分,对编程的接触非常有限
尤其是处理复杂的编程任务。非CSE学生就是学生
未参加CSE项目(单学位或双学位)的学生。例子包括学生仅在机电一体化、航空航天或精算等单一学位课程注册
研究或法律。参加双学位课程的学生,其中包括CSE课程的学位不合格。任何符合此标准并希望使用此标准的学生选项MUST电子邮件[email protected]在3月29日下午5点(星期五,第7周)。如果获得批准,我们将向您发送的非CSE版本的规格分配默认情况下,我们将假设所有学生都在尝试CSE版本的除非他们寻求明确的许可。没有例外。
3.任务说明书
STP应该实现为两个独立的程序:发送方和接收方。你应该实施代 写COMP3331/9331计算机网络与应用从发送器到接收器的数据的单向传输。如图1所示,数据分段将从发送器流到接收器,而ACK分段将从接收器流到发送器。发送器和接收器程序将在同一台机器上的不同终端上运行,因此您可以使用localhost,即127.0.0.1作为程序中发送方和接收方的IP地址。允许我们重申,STP必须在UDP之上实现。不要使用TCP套接字。如果您使用TCP,您的作业将不会收到任何标记。
您会发现查看文本的第3.5.4-3.5.6节(或
第5周讲义)。审查可靠数据传输的基本概念也可能很有用来自第3.4节(或第4周课堂讲稿的相关部分)。课本第3.5节它涵盖了关于TCP的大部分讨论,可在分配页面上下载。图1:这描述了分配设置。文件将从发送方传输到接收方,两者都在同一个服务器上运行机器数据段将从发送方流到接收方,而ACK段将从接收方流到发送方。数据
确认发送器-接收器
UDP套接字1
sender_port指定为参数
UDP套接字2
receiver_port指定为参数
3.
3.1文件名
发件人的主代码应包含在以下文件中:sender.c,或Sender.java或Sender.py。您可以创建其他文件,如头文件或其他类文件,并根据需要命名它们。
发件人应接受以下七个参数:
1.sender_port:发送方将STP段发送到的UDP端口号接受者发送器将通过同一端口接收来自接收器的ACK段。我们建议使用49152到65535之间的随机端口号(动态端口号范围)。
2.receiver_port:接收方希望接收STP的UDP端口号发件人的分段。接收方应通过此向发送方发送ACK段
相同的端口。我们建议使用上述相同范围内的随机端口号。3.txt_file_to_send:必须从发送方传输到的文本文件的名称接收器使用您的可靠传输协议。您可以假设
参数将在具有“read”的发件人的当前工作目录中可用访问权限集(在中的终端执行“chmod+r txt_file_to_send”包含文件的目录,其中txt_file_to_send设置为的实际名称文件
4.max_win:发送方窗口的最大窗口大小(以字节为单位)。这应该是一个无符号整数。实际上,这是发件人可以使用的最大数据字节数以流水线方式进行传输,并且对于其ACK是未决的。max_win必须为大于或等于1000字节(MSS)并且不包括STP报头。什么时候如果max_win被设置为1000字节,STP将有效地充当停止和等待协议,其中所述发送器在任何给定时间发送一个数据段,并等待相应的ACK段。在测试时,我们将确保max_win是的倍数1000字节(例如5000字节)。
5.rto:重传计时器的值,以毫秒为单位。这应该是一个未签名的整数
6.flp:前向丢失概率,是指前向中任何分段的概率方向(DATA、FIN、SYN)丢失。这应该是一个介于0和1(包括0和1)之间的浮点值。如果flp为0.1,则发送器将丢弃其打算丢弃的分段的大约10%发送到接收器。
7.rlp:反向丢失概率,是一个片段在反向方向上的概率(即ACK)丢失。这应该是一个介于0和1(包括0和1)之间的浮点值。如果rlp是0.05,则发送器将丢弃大约5%的接收到的ACK段。发件人应按以下方式启动:
如果您使用Java:
java发送程序发送程序端口接收程序端口txt_file_to_send最大值rto flp rlp如果使用C:
./sender sender_port receiver_port txt_file_to_send最大值如果使用Python:
python3 sender.py sender_port receiver_port txt_file_to_send最大值rto flp rlp4.
在测试过程中,我们将确保提供的7个参数的格式正确。我们不会测试错误的参数、遗漏的参数等。也就是说,这是一个很好的编程实践检查这样的输入错误。
接收器的主代码应包含在以下文件中:receiver.c,或Receiver.java或Receiver.py。您可以创建其他文件,如头文件或
系统,如GitHub,则必须确保您的存储库是私有的。我们不会受理因计算机故障、丢失等相关问题而提出的任何特殊考虑请求文件等。
语言和平台:您可以自由使用C、Java或Python来实现此任务。请选择一种你熟悉的语言。这些程序将在CSE上进行测试Linux机器。因此,请确保您的整个应用程序在VLAB中正确运行。这如果你计划在个人电脑上开发和测试程序,这一点尤为重要(可能使用不同的操作系统或版本或IDE)。请注意,CSE机器支持以下是:gcc版本12.2、Java 17和Python 3.11。您只能使用基本插座以您选择的编程语言提供的编程API。您不能使用任何特殊的现成库或API,为您实现规范的某些功能。如果如果你不确定,最好与论坛上的课程工作人员核实。
我们鼓励您使用课程讨论论坛提问并讨论不同的问题
解决问题的方法。但是,您不应该发布您的解决方案或任何代码论坛上的片段。
6.作业提交
请确保使用规定的文件名。当然,您可能还有其他头文件和/或帮助文件。如果你使用的是C,那么你必须提交一个Makefile和你的代码。这是因为我们需要知道如何解决您拥有的所有文件之间的依赖关系假如运行Makefile后,我们应该有以下可执行文件:sender和接受者
此外,您还应提交一份小报告,report.pdf(不超过2页)。提供您使用的语言(例如C)的详细信息以及代码的组织(Makefile,目录(如果有的话)等)。您的报告必须包含关于您如何实施的简短讨论STP协议。这应该包括整体程序设计、数据结构设计和发送方和接收方的操作说明。同时讨论任何设计权衡
经过考虑和制定。如果您的程序在任何情况下都不起作用,请在此处报告。同时指出您从Web或其他书籍中借来的任何代码段。
您需要提交源代码和报告.pdf。您可以使用提交作业通过VLAB发出命令。确保您与代码位于同一目录中,并且报告,然后执行以下操作:
1.键入tar-cvf assign.tar文件名,例如:17
tar-cvf assign.tar*.java报告.pdf2.接下来,键入:give cs3331 assign assign.tar你应该收到一条信息,说明你提交的结果,确保它被接受。3331和9331应使用相同的命令。
或者,您也可以通过分配页面上的WebCMS3接口提交tar文件。重要注意事项
系统只接受名为assign.tar的文件。所有其他名称都将被拒绝。确保您的程序在提交前在VLAB环境中进行了测试。在里面过去,导师无法编制和管理学生的
程序,同时进行标记。为了避免任何干扰,请确保测试您的在提交作业之前,在VLAB环境中编程。请注意,我们将如果提交的代码在
标记。
您可以在截止日期前提交任意次数。稍后提交
覆盖先前提交的文件,因此请确保提交的文件正确无误。不要等到最后一刻提交,因为可能存在技术或网络错误,您将没有时间以纠正它。
逾期提交罚款:将适用新南威尔士大学标准的逾期罚款,即每天5%最大可用标记,最多可使用5天。这项作业值20分,因此罚款相当于每天晚扣1马克。5天后提交的文件将不被接受。7.抄袭
你要自己写这项作业的所有代码。所有源代码都要经过严格检查针对剽窃,通过高度复杂的剽窃检测软件。这些检查可能包括与互联网网站上的可用代码和前几个学期的作业进行比较。在里面此外,每一份提交的材料都将与本学期所有其他提交的材料进行核对。做不要在论坛上发布这个作业,在那里你可以付钱给程序员为你写代码。我们将正在监测此类论坛。请注意,我们非常认真地对待此事。LiC将决定关于对发现的剽窃案件的适当处罚。最有可能的处罚是减少赋值标记为ZERO。我们知道很多学习都发生在学生身上对话,不希望阻碍这些对话。然而,这很重要,对双方都有帮助其他人和那些被帮助的人不提供或接受任何书面编程语言代码,因为这很容易被原样使用,并导致供应商和
代码的复印机。无论如何,在一张纸上写点什么,但要把它撕碎/拿走当讨论结束时。可以从示例套接字代码中借用一些代码
在网络和书籍中。但是,您必须确认任何借用代码的来源。这意思是当代码出现时(作为注释)提供对书籍或URL的引用。而且在报告中指出代码中被借用的部分。解释您的任何修改
对借用的代码进行了修改(如果有的话)。
生成人工智能工具:禁止使用任何软件或服务搜索或生成信息或答案。如果它的使用被发现,将被视为严重的学术不端行为并受到标准处罚,其中可能包括00FL、停赛和排除。8.评分政策
18
在提交代码之前,您应该严格测试您的程序。您的代码将是手动的使用以下标准进行标记:
测试1-停止并等待可靠通道:2个标记
当作为停止等待协议执行时,我们将测试您的STP实现(max_win=1000)以及当基础信道是可靠的时(flp=rlp=0)。
我们展示了两个程序的实例化,假设实现是用Python实现的。这个C和Java的参数将类似。
python3 receiver.py 56007 59606 FileToReceive.txt 1000python3 sender.py 59606 56007 test1.xt 1000 rto 0我们将测试rto的不同值,并使用不同的文本文件。我们将比较收到的文件,检查发送方和接收方日志,以及其他检查,以确保STP协议在两个端点都得到了正确的实现。
测试2-停止并等待一个不可靠的通道:4个标记
接下来,我们将测试您的STP实现,同时作为停止和等待协议运行(max_win=1000),但在底层通道不可靠的情况下。在第一种情况下,我们将仅在前向方向(rlp=0)上引起分组丢失。发件人将被如下实例化(接收器将被如上实例化):
python3 sender.py 59606 56007 test1.xt 1000 rto flp 0我们将测试rto、flp和不同文本文件的不同值。支票将如上所述进行。(1个标记)
在第二种情况下,我们将只在相反的方向(flp=0)上引起分组丢失。发件人将被如下实例化(接收器将被如上实例化):
python3 sender.py 59606 56007 test1.xt 1000 rto 0 rlp我们将测试rto、rlp和不同文本文件的不同值。支票将如上所述进行。(1个标记)
在最后一种情况下,我们将在两个方向上引起数据包丢失。发件人将被实例化为如下(接收器将如上所述被实例化):
python3 sender.py 59606 56007 test1.xt 1000 rto flp rlp我们将用不同的文本文件测试rto、flp、rlp的不同值。支票将如上所述进行。(2分)
测试3-可靠通道上的滑动窗口:4分
当作为滑动窗口协议执行时,以及当
底层信道是可靠的(flp=rlp=0)。
我们展示了两个程序的实例化,假设实现是用Python实现的。这个C和Java的参数将类似。
python3 receiver.py 56007 59606 FileToReceive.txt max_winpython3 sender.py 59606 56007 test1.txt max_win rto 0我们将测试不同的max_win值(总是1000的倍数,具有相同的值提供给两个程序)、rto和不同的文本文件。我们将比较收到的文件使用发送的文件,检查发送方和接收方日志,以及其他检查,以确保STP协议在两个端点都得到了正确的实现。
19
测试4-在不可靠的通道上滑动车窗:6分
接下来,我们将在作为滑动窗口协议执行时测试您的STP实现,但在底层通道是不可靠的。
在第一种情况下,我们将仅在前向方向(rlp=0)上引起分组丢失。发件人将被如下实例化(接收器将被如上实例化):
python3 sender.py 59606 56007 test1.txt max_win rto flp 0我们将使用不同的文本文件测试max_win、rto、flp的不同值。支票将如上文所述进行。(2分)
在第二种情况下,我们将只在相反的方向(flp=0)上引起分组丢失。发件人将被如下实例化(接收器将被如上实例化):
python3 sender.py 59606 56007 test1.txt max_win rto 0 rlp我们将用不同的文本文件测试max_win、rto、rlp的不同值。支票将如上文所述进行。(2个标记)
在最后一种情况下,我们将在两个方向上引起数据包丢失。发件人将被实例化为如下(接收器将如上所述被实例化):
python3 sender.py 59606 56007 test1.txt max_win rto flp rlp我们将测试不同的max_win、rto、flp、rlp值以及不同的文本文件。将如上所述进行检查。(2分)
测试5-在不可靠通道上滑动车窗与测试装置:2分
接下来,我们将在作为
滑动窗口协议以及底层信道不可靠的情况。
在第一种情况下,我们将根据我们的发送者测试您的接收者。这两个项目将实例化如下:
python3 receiver.py 56007 59606 FileToReceive.txt max_win3331发送器59606 56007 test1.text max_win rto flp rlp我们将测试不同的max_win、rto、flp、rlp值以及不同的文本文件。将如上所述进行检查。(1个标记)
在第二种情况下,我们将根据我们的接收方测试您的发送方。这两个项目将实例化如下:
3331接收器56007 59606 FileToReceive.txt max_winpython3 sender.py 59606 56007 test1.txt max_win rto flp rlp我们将测试不同的max_win、rto、flp、rlp值以及不同的文本文件。将如上所述进行检查。(1个标记)
测试6——报告:1分
报告不得超过2页。提供您使用过的语言的详细信息
(例如Python)和代码的组织(例如Makefiles、目录(如果有的话)等)。您的报告必须包含关于如何实现STP协议的简短讨论。这应该
包括整体程序设计、数据结构设计以及操作的简要说明
发送者和接收者。同时讨论所考虑和做出的任何设计权衡。如果您的程序在任何情况下都不起作用,请在此处报告。还指示任何代码段你从网上或其他地方借的书。我们将核实您报告中的描述与程序中的实际实现进行了验证。
20
测试7——正确记录和注释代码:1分
我们推荐以下著名的风格指南,例如:
Java语言https://google.github.io/styleguide/javaguide.html蟒蛇https://peps.python.org/pep-0008/重要提示:如果发件人和收件人未按照中所示生成日志文件规格,您将只获得总分的25%的分数(即75%的罚款评估)。