我正在研究可靠UDP的实现(即发送ACK数据包并重新发送未收到ACK的数据包)。
在网上找到的两种主要模式如下:
客户端为每个接收到的数据包发送一个带有该数据包序列号的ACK。服务器假定除非收到ACK,否则数据包未被传送。
客户端发送一个带有它认为丢失的数据包序列号的ACK数据包。服务器假定数据包已传递,除非从客户端收到一个说它缺少一个序列号的ACK,然后重新发送请求的(缺失的)数据包。
简而言之,在1中,客户端发送接收到的数据包序列号,而在2中,客户端发送缺失的数据包序列号。
想知道每种方法的优缺点是什么,哪一种更为主流(我认为是1,但2似乎是一种非常聪明的方法,因为大多数数据包都到达了,只有很少的数据包通常会丢失)。
编辑: 以下是这两种方法的简短示例:
Method 1: Server sends: 1,2,3,4,5
Client received: 1,3,5,4
Client sends back: ACK 1, ACK 3, ACK 5, ACK 4
Server resends: 2.. maybe more if ACK packets were lost
Method 2:
Server sends 1,2,3,4,5,6,7,8
Client receives: 1,3,2,5,7
Client Sends :ACK (lowest continuous 3,highest received 7, seem to be missing 4,6)
Server resends: 4,6,8