[comment]: <> (请在此添加实训简介,简单介绍一下实训的内容.以下是“基于Java语言的链表编程实训(基础篇)”实训的示例文:) 本实训将学习利用 UDP 套接字编程实现网络连通程序Ping。包含如何使用 UDP 套接字发送和接收数据报;如何设置适当的套接字超时; Ping 应用程序通信过程及计算网络统计信息(如丢包率)。 Ping 程序的基本原理:利用客户端发送一个数据包到远程机器,远程机器将收到的数据包返回到客户端(称为回显),客户端根据是否收到发送的消息及计算数据包的往返时间来反映网络是否连通及网络状态。 首先,要实现一个用 Python 编写的简单的 Ping 服务端程序,然后再实现对应的客户端程序。程序功能类似于现代操作系统中可用的标准 Ping 程序功能,不过这里使用简单的 UDP 协议,而不是标准互联网控制消息协议(ICMP)来进行通信的(使用 ICMP 的 Ping 程序将在下一个实训中实现)。 ##### 基于 UDP 协议的 Socket 套接字编程 UDP 协议是非连接的协议,通信双方不用建立连接,而是直接把要发送的数据发送给对方。UDP 协议适用于一次传输数据量很少,对可靠性要求不高的应用场景。但由于UDP 协议没有类似于 TCP 的三次握手、可靠传输机制等,所以通信效率比较高。 UDP 协议的应用也非常广泛,比如知名的应用层协议:SNMP、DNS 都是基于 UDP的。一个常用的 UDP 通信的框架如下图所示: <p> <center> <img style="border: 1px solid #ddd" src="/api/attachments/524834" alt="" height="60%" width="80%" /> <br> </center> </p> <br> 由图可以看出,客户端要发起一次请求,仅仅需要两个步骤(socket 和 sendto),而服务器端也仅仅需要三个步骤即可接收到来自客户端的消息(socket、bind、recvfrom)。和 TCP 通信不同的是,UDP 通信不需要监听(listen)及建立连接(accept)步骤,在创建及套接字后,可以直接使用 `sendto()` 及 `recvform()` 进行数据的发送及接收。 本实验分别用 UDP 通信实现 Ping 程序的服务器程序及客户端程序。