在这个编程作业中,你将使用 Python 编写一个客户端 ping 程序。该客户端将发送一个简单的 ping 报文,接收一个从服务器返回的对应的 pong 报文,并确认从该客户端发送 ping 报文到接收到 pong 报文为止的时延。该时延称为往返时延(RTT)。由该客户端和服务器提供的功能类似于现代操作系统中可用的标准 ping 程序。然而,标准的 ping 使用互联网控制报文协议(ICMP)(我们将在第 5 章中学习 ICMP)。此时我们将创建一个非标准(但简单)的基于 UDP 的 ping 程序。
你的 ping 程序经 UDP 向目标服务器发送 10 个 ping 报文。对于每个报文,当对应的 pong 报文返回时,你的客户端要确定和打印 RTT。因为 UDP 是一个不可靠的协议,由客户端发送的分组可能丢失。为此,客户端不能无限期地等待对 ping 报文的回答。客户端等待服务器回答的时间至多为 1 秒;如果没有收到回答,客户端假定该分组丢失并相应地打印一条信息。在每个报文中,你需要填入你的学号,服务器会检查你的学号并做出响应,如果学号正确则会返回你的名字,错误则提示学号错误。
后文中会给出服务器代码,其与实际的服务器代码十分相似。你的任务是编写客户端代码,你可以通过学习服务器代码改造和编写你的客户端代码。实验使用的服务器 IP 地址为 152.136.19.235,响应请求的端口为 10000。
以下是一个示例客户端打印的最终效果,客户端向服务器发送的数据为 "2022000000"(其中2022000000是测试学号,在你的客户端中需要使用你自己的学号)。客户端打印的信息包含服务器返回的信息(来自...的Ping)和 RTT 的测量结果,你可以参考这种格式编写自己的客户端代码。
以下是服务器代码,与实验中实际使用的代码十分相似,你可以先在本地运行以下代码来调试自己的客户端程序,在客户端中使用 127.0.0.1 地址即可。