可靠的UDP和ACK方法问题

可靠的UDP和ACK方法问题,udp,network-protocols,unreliable-connection,Udp,Network Protocols,Unreliable Connection,我正在阅读有关可靠UDP的实现(即发送ACK数据包并再次重新发送未确认的数据包) 我在网上找到的两种主要模式中: 客户端为每个接收到的数据包发送一个带有该数据包序列的ACK。服务器假定数据包未送达,除非它收到ACK 客户端发送一个ACK数据包,其中包含它认为丢失的数据包序列。服务器假定数据包已交付,除非它从客户端收到一个ACK,表示它缺少一个序列,然后它再次重新发送请求的(缺少的)数据包 简言之,在1。客户端发送接收到的数据包的序列,而在2。客户端发送丢失数据包的序列 只是想知道每种方法的优点/

我正在阅读有关可靠UDP的实现(即发送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
    
    #2也被称为负ACK,又名NAK,它是一种乐观的传输观点。这意味着,当运输功能正常时,可伸缩性更好

    #1是一个悲观的观点,并假设传输经常会失败

    TCP使用ACK是因为基本上依赖于拥塞控制来丢弃数据包以执行流量整形以创建公平网络。可靠的UDP通道通常使用NAK,因为您使用的是可靠的高速中速或低速率流,要求在锁步骤上具有低延迟,这是基本ACK实现的典型特征


    请注意,如果您更高一步,并查看高于可靠UDP通道的订阅管理,则ACK或NAK使用没有明显的赢家。市场数据世界已经证明了这两种技术在高容量网络上的高速使用。对于订阅,ACK的好处是,在网络故障后,您不需要进行复杂的重新同步,但是当每个主机发出重新订阅时,您将看到网络和CPU使用的一致峰值。

    那么,如果在方法2中,表示缺少某些内容的客户端ack数据包从未发送过?据我所知,在方法2中,有一个ack表示“此处没有缺少的数据包(最高接收序列为532)”。。。因此,如果服务器发送1个数据包,但未接收到ACK,则该数据包将重新发送。此外,方法2中的ACK数据包通常会定期发送。。我猜你表现得很像一个平,那么你能再澄清一点区别吗?因此,方法1明确地确认数据包,每当到达一个新的序列号时(因此可能是多个数据包的确认),方法2定期地确认数据包,而不是明确地确认数据包?不,方法1为每个接收到的数据包发送一个确认。没有嵌入其他逻辑。方法2定期发送一个ACK,并嵌入一个逻辑来提供某种传输窗口:在序列40之前,我拥有所有的数据包,而我似乎缺少数据包41、45和47。(或:我有所有数据包到序列56,没有丢失的数据包)