我有一个任务,我必须使用UDP通过可靠且不可靠的网络在客户端和服务器之间发送消息。客户端向服务器发送消息,服务器读取该消息,将其存储在本地文件中,然后向客户端发送确认消息。通过可靠的网络,我的代码可以正常运行,并且数据包不会丢失,重复或重新排序。
要建立不可靠的网络,我的教授让我们在终端中运行sudo tc qdisc add dev lo root netem delay 100ms 20ms 25% loss 0.5% duplicate 1% reorder 25% 50%
来创建模拟的不可靠网络。
我简直无法缠住我的头,以防止我的数据包被复制或丢弃。我没有发布任何代码,因为我不希望它看起来像我在寻求答案。我试图了解其背后的方法,因为我对套接字或网络编程不是很熟悉。有什么方法可以防止我的数据包在不可靠的网络上重复或丢失?
答案 0 :(得分:0)
在这种情况下,您应该使用自定义协议,我可以想到这个
首先,我们应该在数据包中有一个数字,以帮助我们跟踪发送和接收的内容,我们将其称为PacketId,
发送方发送具有唯一ID的数据包,并将其存储并启动计时器以等待ACK,如果已收到针对该特定ID的ACK,则将其从队列中删除,然后我们发送下一个数据包,如果未发送且计时器溢出,则发送该数据包再次
关于ID的最后一件事是,每个数据包应将其递增1。
在接收端,您只在等待一个特定的ID,可以说在开始时您正在等待ID 0,忽略接收到的任何其他数据包,直到检测到该特定的ID,然后将期望的ID加1并转到向前。
可能会出现ACK丢失并且服务器发送回先前的数据包的情况,因此即使不希望收到这些数据包,也应该也对这些数据包进行ACK,并确保不要对这些数据包进行两次处理。
这是我想到的一种基本模式,它一次只发送一个数据包,稍作调整便可以适应一次发送多个pakcets并等待ACK