COMS3200 The RUSH protocol
Part C (50 marks)
The RUSH protocol (Reliable UDP Substitute for HTTP) is a HTTP-like stop-and-wait protocol that uses UDP
in conjunction with the RDT rules. You have recently been hired by the multinational tech giant COMS3200 Inc,
who have identified your deep knowledge in the field of transport-layer protocols. The CEO of COMS3200 Inc, Dan
Kim, has asked you to develop a network server capable of sending RUSH messages to a client. It is expected that
the RUSH protocol is able to handle packet corruption and loss according to the RDT rules. Your server program
must be written in Python, Java, C, or C++.
ASIDE: The RUSH protocol is not a real networking protocol and has been created purely for this assignment
Program Invocation
Your program should be able to be invoked from a UNIX command line as follows. It is expected that any Python
programs can run with version 3.6, and any Java programs can run with version 8.
Python
python3 assign2.py
C/C++
make
./assign2
Java
make
java Assign2
RUSH Packet Structure
A RUSH packet can be expressed as the following structure (|| is concatenation):
IP-header || UDP-header || RUSH-header || payload
代做COMS3200作业、代写Python, Java, C/C++程序作业、HTTP-like留学生作业代写
The data segment of the packet is a string of ASCII plaintext. Single RUSH packets must be no longer than 1500
bytes, including the IP and UDP headers (i.e. the maximum length of the data section is 1466 bytes). Packets that
are smaller than 1500 bytes should be padded with 0 bits up to that size. The following table describes the header
structure of an RUSH packet:
Bit 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 Sequence Number
16 Acknowledgement Number
32 Flags Reserved (should be 0)
The following sections describe each header in this packet further.
3
Sequence and Acknowledgement Numbers
Sequence numbers are independently maintained by the client and server. The first packet sent by either endpoint
should have a sequence number of 1, and subsequent packets should have a sequence number of 1 higher than the
previous packet (note that unlike TCP, RUSH sequence numbers are based on the number of packets as opposed
to the number of bytes). When the ACK flag is set, the acknowledgement number should contain the sequence
number of the packet that is being acknowledged. When a packet is retransmitted, it should use the original
sequence number of the packet being retransmitted. Any packet that isn’t a retransmission (including NAKs)
should increment the sequence number.
Flags
The Flags section of the header is broken down into the following:
Bit 0 1 2 3 4
0 ACK NAK GET DAT FIN
The purpose of these flags is described in the example below.
RUSH Example
The following situation describes a simple RUSH communication session. Square brackets denote the flags that are
set in each step (for example [FIN/ACK] denotes the FIN and ACK flags having the value 1 and the rest having
the value 0). Note that RUSH, unlike TCP, is not connection-oriented. There is no handshake to initialise the
connection, but there is one to close the connection.
1. The client sends a request packet to the server [GET]
The sequence number of this packet will always be 1
The data section of this packet will contain the name of a resource (eg. file.txt)
2. The server transmits the requested resource to the client over (possibly) multiple packets [DAT]
The first packet should have a sequence number of 1
3. The client acknowledges having received each data packet [DAT/ACK]
The acknowledgement number of this packet should be the sequence number of the packet being acknowledged
4. After receiving the last acknowledgement, the server signals the end of the connection [FIN]
5. The client acknowledges the connection termination [FIN/ACK]
6. The server acknowledges the client’s acknowledgement and terminates the connection [FIN/ACK]
4
Your Task
Basic Server Functionality (10 marks)
To receive marks in this section you need to have a program that is able to:
Listen on an unused port for a client’s message
Successfully close the connection
When invoked, your program should let the OS choose an unused localhost port and your program should listen
on that port. It should output that port as a raw base-10 integer to stdout. For example, if Python was used and
port 54321 was selected, your program invocation would look like this:
python3 assign2.py
54321
Any lines in stdout after the port number can be used for debugging. For this section, your program does not
need to respond to the GET request. Upon hearing from a client, your program can immediately signal the end of
the connection (as described in the example). Once the FIN handshake has been completed, your program should
terminate.
You may always assume that only one client will connect to the server at a time. For this section and the next you
may also assume that no packets are corrupted or lost during transmission.
File Transmission (10 marks)
To receive marks in this section you need to have a program that is able to:
Perform all features outlined in the above section
Successfully transmit a requested file over one or more packets
Receive (but not handle) ACKs from the client during transmission
When your server receives a GET packet, it should locate the file being requested and return the file’s contents
over one or more DAT packets. When complete, the server should close the connection (as in the above section).
You may assume that the file being requested always exists (it is expected that this file is stored in your program’s
working directory).
Retransmission (15 marks)
To receive marks in this section you need to have a program that is able to:
Perform all features outlined in the above sections
Retransmit any packet on receiving a NAK for that packet
Retransmit any packet that has not been acknowledged within 3 seconds of being sent
A client will send a DAT/NAK packet should it receive a corrupted packet or a packet with a sequence number it
wasn’t expecting (the NAK packet’s acknowledgement number will contain the sequence number it was expecting).
In this case your program should retransmit the packet with that sequence number.
If a DAT, FIN, or ACK packet gets lost during transmission your program should retransmit it after 3 seconds
without acknowledgement. If a NAK is received the timer should reset. How you choose to handle timeouts is up
to you, however it must work on a UNIX machine (moss). Achieving this through multithreading, multiprocessing,
or signals is fine provided you only use standard libraries.
5
Packet Corruption (15 marks)
To receive marks in this section you need to have a program that is able to:
Perform all features outlined in the above sections
Gracefully ignore corrupt, invalid, or unexpected packets
When a corrupt, invalid, or unexpected packet is received, your program should ignore it and continue to run
without error. Any retransmission timer should also not stop or reset. Part of this task is determining what would
constitute as an invalid or unexpected packet. You can assume that the only legal flag combinations are GET,
DAT, DAT/ACK, DAT/NAK, FIN, and FIN/ACK. You don’t have to worry about checking the UDP checksum -
only the contents of the RUSH header and data.
Tips for Success
Revisit the lectures and labs on reliable data transfer and TCP, ensuring you are familiar with the fundamentals
Frequently test your code on moss
Ensure your base functionality is working before attempting the more difficult tasks
Start early - there will be limited help during the midsemester break so any questions will need to be asked
in labs beforehand
Library Restrictions
The only communication libraries you may use are standard socket libraries which open UDP sockets
You can’t use any libraries that aren’t considered standard for your languagei.e. if you have to download a
library to use it it would be considered as non-standard)
If you are unsure about whether you may use a certain library, please ask the course staff on Piazza
Submission
Submit all files necessary to run your program. At a minimum, you should submit a file named assign2.py,
assign2.c, assign2.cpp or Assign2.java. If you submit a C/C++ or Java program, you should also submit a
makefile to compile your code into a binary named assign2 or a .class file named Assign2.class.
IMPORTANT: If you do not adhere to this (eg. submitting a C/C++/Java program without a Makefile, or a
.class file instead of a .java file), you will receive 0 for this part of the assignment.
Marking
Your code will be automatically marked on a UNIX machine, so it is essential that your program’s behaviour is
exactly as specified above. Your program should complete all tasks within a reasonable time frame (for example a
single packet should not take more than one second to construct and send) - there will be timeouts on all tests and
it is your responsibility to make sure your code is not overly inefficient. It is expected that you will receive a small
sample of tests and a basic RUSH client program before the submission deadline.
There are no marks for coding style.
因为专业,所以值得信赖。如有需要,请加QQ:99515681 或邮箱:99515681@qq.com
微信:codinghelp
COMS3200 The RUSH protocol的更多相关文章
- 学习笔记:URL Protocol在浏览器中打开本地应用程序
看到阿里的网站上可以通过点击卖家的旺旺图标从而调用本地的阿里旺旺程序,而且还可以传递当前浏览者需要咨询的商品.这是怎么实现的呢?是通过URLProtocol来完成. 原理还没有太清楚,即在系统里注册一 ...
- Protocol Buffer搭建及示例
本文来源:http://www.tanhao.me/code/150911.html/ Protocol Buffer(简称Protobuf或PB)是由Google推出的一种数据交换格式,与传统的XM ...
- 从零开始山寨Caffe·伍:Protocol Buffer简易指南
你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是 ...
- oracle plsql 无法连接 报 ORA-12560: TNS:protocol adapter error
ORA-12560: TNS:protocol adapter error 添加一个环境变量,名为TNS_ADMIN,值为 tnsnames.ora 文件所在路径.比如我的本机为:D:/instant ...
- 窥探Swift之协议(Protocol)和委托代理(Delegate)回调的使用
协议与委托代理回调在之前的博客中也是经常提到和用到的在<Objective-C中的委托(代理)模式>和<iOS开发之窥探UICollectionViewController(四) - ...
- ORA-12516:TNS:listener could not find available handler with matching protocol stack
应用程序连接测试数据库时报ORA-12516:TNS:listener could not find available handler with matching protocol stack 检查 ...
- Serial Communication Protocol Design Hints And Reference
前面转载的几篇文章详细介绍了UART.RS-232和RS-485的相关内容,可以知道,串口通信的双方在硬件层面需要约定如波特率.数据位.校验位和停止位等属性,才可以正常收发数据.实际项目中使用串口通信 ...
- [原创翻译]Protocol Buffer Basics: C#
Protocol Buffer 基础知识:c# 原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial ...
- 让Web API支持Protocol Buffers
简介 现在我们Web API项目基本上都是使用的Json作为通信的格式,随着移动互联网的兴起,Web API不仅其他系统可以使用,手机端也可以使用,但是手机端也有相对特殊的地方,网络通信除了wifi, ...
随机推荐
- Dynamics 365 解决方案导出报错
之前导出解决方案异常,按照CRM社区的方法解决成功,但是没有了解原因,今天看到有朋友解答了原因,也分享给大家 先来看看异常 我那时导出的是default解决方案,这是模拟 导出异常 “业务流程错误”- ...
- Js中Map对象的使用
Js中Map对象的使用 1.定义 键/值对的集合. 2.语法 mapObj = new Map() 3.备注 集合中的键和值可以是任何类型.如果使用现有密钥向集合添加值,则新值会替换旧值. 4.属性 ...
- LeetCode 169 Majority Element 解题报告
题目要求 Given an array of size n, find the majority element. The majority element is the element that a ...
- Node.js、npm、vue-cli 的安装配置环境变量
我安装node.js是为了学习vue,需要用到npm,所以就把node.js安装了,安装node.js会带有npm的安装. 在安装node.js之前,我们需要了解以下三个内容. npm: Nodejs ...
- 【转】Java遍历Map对象的四种方式
关于java中遍历map具体哪四种方式,请看下文详解吧. 方式一 这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用. Map<Integer, Integer> ma ...
- abap test seam 和 TEST-INJECTION
TEST-SEAM 和 TEST-INJECTION 一块儿使用 可以模拟出调用方法的return,exporting,chaning值. 例如: 1: 假设有一个类zcl_demo_input,该 ...
- MATLAB绘制函数图
序言 Matlab可以根据用户给出的数据绘制相应的函数图.对于单个2D函数图,需要给出一个行向量x作为函数图上离散点集的横坐标,以及一个与x列数一样的横坐标y作为函数图上点集的纵坐标. 向量x和y的取 ...
- jQuery动画方法
下面介绍一些使用jQuery实现动画的方法: html中有如下代码: <button id="btn-box1">show</button> <but ...
- ubuntu 16.04 安装wechat, chrome等
安装wechat 按照https://www.jb51.net/article/131179.htm,结果发现不行. 用apt-get install electronic-wechat的方式呢,也不 ...
- OO第一次博客
过去的三周里我们完成了表达式求导的程序设计与构造.表达式求导程序,大致思路是实现一个表达式类,支持表达式的输入.求导运算和输出功能.可能的话,还可以增加表达式的化简方法,从而得到更高质量的输出结果.总 ...