Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Network programming 如何确保UDP服务器不会丢失传入数据?_Network Programming_Udp_Tcp - Fatal编程技术网

Network programming 如何确保UDP服务器不会丢失传入数据?

Network programming 如何确保UDP服务器不会丢失传入数据?,network-programming,udp,tcp,Network Programming,Udp,Tcp,有一个数据源服务器通过UDP接收来自不同客户端的数据源,因为客户端的数据传输速度非常快,如果服务器花费时间处理接收到的数据,接收缓冲区很容易被填满,因此 如果feed服务器 只是多播它接收到的所有数据 到LAN上的其他服务器,其中 数据源服务器有第二个 NIC连接到?彼此 服务器只会从中获取数据 要处理和离开的问题 将其他数据传输到其他服务器 如果传入的数据仍然到达 太快了,有什么策略可以避免吗 确保不丢失任何数据 谢谢。您需要编写自己的“确认”方法。客户端重新发送数据块,直到从服务器收到已接收

有一个数据源服务器通过UDP接收来自不同客户端的数据源,因为客户端的数据传输速度非常快,如果服务器花费时间处理接收到的数据,接收缓冲区很容易被填满,因此

  • 如果feed服务器 只是多播它接收到的所有数据 到LAN上的其他服务器,其中 数据源服务器有第二个 NIC连接到?彼此 服务器只会从中获取数据 要处理和离开的问题 将其他数据传输到其他服务器
  • 如果传入的数据仍然到达 太快了,有什么策略可以避免吗 确保不丢失任何数据

  • 谢谢。

    您需要编写自己的“确认”方法。客户端重新发送数据块,直到从服务器收到已接收的数据块确认为止。

    一些尝试策略包括

    • 确保接收进程在接收线程中很少执行操作,只需读取数据并将其发送到内部队列,以便在另一个线程上进行处理—这将减少接收缓冲区填充的可能性
    • 在消息中包含序列号。如果接收者注意到丢失的消息,可以向发布者重新请求。这种重新请求将非常昂贵,但会使一般情况变得非常迅速。这假设发布者要么在内存中保留合理数量的已发布消息(以允许重新请求),要么将它们保存在某个位置以应对重播
  • 如果我理解你的要求,那么就不需要了,因为你将接收数据,然后再发送出去,有效地将你使用的带宽增加一倍,所以这可能不会有帮助

  • 确保数据不丢失的最佳策略是通过UDP使用TCP。但是,如果必须使用UDP,则可以编写一些代码,对发送的每个数据包进行编号(以便确保它们按顺序到达),并添加更多功能,允许服务器请求丢失的数据包,例如:发送方发送1、2、3、4,但接收方仅接收1、2、4,然后再次请求3


  • UDP可以被认为是“不可靠数据报协议”的代表。因此,这可以立即解释您的问题:您需要可靠性,这是基础协议不提供的服务。可能您也需要拥塞控制,因为缺少网络缓冲区和缺少带宽一样也是拥塞的根源

    解决方案是使用UDP以外的东西,或者在UDP之上增加可靠性和拥塞控制;基本上是确认和速率限制


    UDP的可能替代品包括TCP和SCTP。SCTP会很好,因为它有一个数据报模式,所以您不必将协议转换为处理流。请参见此处:

    如果您需要UDP的可靠性,则必须在其上构建自己的。正如其他人所说,您需要某种方法将ACK从一个对等方发送到另一个对等方,以告知另一个对等方数据已安全到达。然后,另一个对等方可以有选择地重新发送数据报,直到它们被确认为止


    我在这里有一个问题:它正在收集各种选项来增加基于UDP的传输的可靠性

    感谢您的评论。但是,如果客户端(传入数据)和其他服务器位于两个独立的网络中(数据源服务器有两个NIC,一个用于接收传入数据,另一个用于转发数据),带宽将不会成为问题?不会吗?很快,您将拥有一个损坏的TCP版本。使用TCP或接受UDP限制。