计算机网络报告-week11
实验目的
- 深入掌握RPC编程
- 深入理解运输层协议
实验任务
- 利用gRPC实现跨语言调用
- 完成课本195页编程作业:实现一个可靠传输协议
任务1:利用gRPC实现跨语言调用
利用gRPC框架,采用两种不同语言(比如C++和Java或Go和Java)实现客户端和服务端。
服务端提供getStuNo()函数,该函数以自己的姓名为参数,返回自己的学号。客户端以自己的姓名为参数远程调用该函数,返回拿到自己的学号。
将实现思路和关键代码以及实验截图写到实验报告中。
这里,我使用Java和Python 两种语言来实现 grpc 的客户端与服务端。既可以是 Java client + Python server也可以是Java server + Python client
Java客户端+python服务端:
Java客户端
这次Java实现grpc,我是在week10的task2的基础上修改得来的,因此环境的搭建这里按下不表:
1 | package helloworld; |
python服务端:
在讲解python服务端之前,我们首先来搭建python的grpc环境:
首先我们要下载几个包:
安装grpc:pip install grcpio
安装编译工具:pip install grpcio-tools
然后在项目中新建helloworld 文件夹用于存放proto文件:
1 | syntax = "proto3"; |
注意,这里写的package helloworld要和java中的proto文件一致。
接下来我们要在helloworld文件夹中编译proto文件:
1 | python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. ./helloworld.proto |
编译完成后,helloworld文件夹下会出现helloworld_pb2.py
以及helloworld_pb2_grpc.py
两个文件.我们要修改一下helloworld_pb2_grpc.py
中的依赖,否则在运行时会出错:
1 | import grpc |
接下来开始写服务端的代码:
1 | #! /usr/bin/env python |
运行结果如下图所示:
Java 服务端和 python客户端
python客户端
1 | import grpc |
Java服务端
1 | package helloworld; |
结果如下图所示,虽然python客户端收到了来自java服务端的反馈信息,但是服务端却报错退出了。还没有找到原因。
任务2:实现一个可靠传输协议
在这个编程作业实验中,你将要编写发送和接收运输层的代码,以实现一个简单的可靠数据运输协议。这个实验有两个版本,即比特交替协议版本和GBN版本。
任务:基于比特交替协议以及GBN实现模拟实现客户端和服务端的可靠的数据传输协议。
实现要求
- 应用层消息(message)数据结构:
1 | struct msg { |
- 传输层消息(packet)数据结构:
1 | struct pkt { |
Hint:传输层消息中的payload字段即为应用层消息中的data字段,传输层消息中的其他字段为辅助字段(用于实现可靠传输,其中checksum部分自己选取合适的算法实现)。
1). 需要实现的部分关键方法:
A_output(message):A处理应用层发送的message,参数是要发送给B的数据。你要实现的协议就是要保证message的可靠传输;
A_input(packet):A处理B发送过来的传输层packet;
A_timeinterrupt():A的定时器,用于超时重传;
A_init():用于A的一些初始化工作;
B_input(packet):B处理A发送过来的传输层packet;
B_init():用于B的一些初始化工作。
2). 部分需要实现的软件接口:
starttimer(calling_entity,increment):开始计时,calling_entity代表调用实体,这里为A或B;
stoptimer(calling_entity):停止calling_entity计时;
tolayer3(calling_entity,packet):calling_entity将消息转发到传输层;
tolayer5(calling_entity,message):calling_entity将消息转发到应用层。
3) 模拟的网络环境
- 消息有序接收:有多条message乱序发送,接收端需要保证按序接收;
- 消息丢失:设置消息丢失率,即消息有一定的概率会被丢失,但要保证接收端能够完整接收;
- 应用层平均延时:记录应用层从发出message请求到接收响应的平均延时。
基于Alternating-Bit-Protocol(ABP,rdt3.0)实现
ABP协议具体内容可参照课本P140-P142
图 2 ABP协议流程
基于Go-Back-N实现
图 3 窗口长度为4个分组的GBN协议运行流程
要求:窗口大小固定为8,如果A从应用层接受的包在窗口外面,直接简单的舍弃;不用太过考虑缓冲区溢出的问题
Hint:先实现ABP协议,在ABP协议的基础上实现GBN协议。