Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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
C# 如何在多个客户端的TCP服务器端保留消息发送顺序_C#_.net_Sockets_Tcp_F# - Fatal编程技术网

C# 如何在多个客户端的TCP服务器端保留消息发送顺序

C# 如何在多个客户端的TCP服务器端保留消息发送顺序,c#,.net,sockets,tcp,f#,C#,.net,Sockets,Tcp,F#,我有两台电脑通过1Gbps链路通过直接以太网电缆连接。其中一个充当TCP服务器,另一个充当TCP客户端。现在我想在这两者之间实现最大可能的网络吞吐量 我尝试过的选项: 在PC-1上创建多个具有不同端口号的客户端,连接到TCP服务器。创建多个客户端的原因是为了增加网络吞吐量,但这里我有一个问题 我有一个要发送到服务器的事件缓冲队列。将有多条具有相同事件编号的消息。服务器必须获取所有消息,然后根据事件编号对消息进行排序。现在,每个客户机将消息从并发队列中取出并发送到服务器。发送后,客户端再次重复相

我有两台电脑通过1Gbps链路通过直接以太网电缆连接。其中一个充当TCP服务器,另一个充当TCP客户端。现在我想在这两者之间实现最大可能的网络吞吐量

我尝试过的选项: 在PC-1上创建多个具有不同端口号的客户端,连接到TCP服务器。创建多个客户端的原因是为了增加网络吞吐量,但这里我有一个问题

我有一个要发送到服务器的事件缓冲队列。将有多条具有相同事件编号的消息。服务器必须获取所有消息,然后根据事件编号对消息进行排序。现在,每个客户机将消息从并发队列中取出并发送到服务器。发送后,客户端再次重复相同的操作。我在客户端设置了一个约束,即在发送所有标有Event-1的消息之前,不会发送Event-2。因此,我认为发送的事件顺序是正确的。TCP服务器连续接收来自所有客户端的数据

现在让我们来看问题: 服务器以随机的方式接收数据,如图所示。经过一段时间的采集,两个连续事件之间的随机性越来越差。我可以认为这种随机行为是由于执行并行工作线程以进行IO完成回调

使用的技术:F#Socket与SocketEventTargets异步

我尝试过的解决方案:我没有允许从服务器端的所有客户机接收数据,而是尝试用挂起的数据轮询下一个可用的客户机,然后它确保了正确的顺序,但它的性能根本无法与以前的方法相比


我希望接收的顺序与从客户端发送的顺序相同/几乎相同(但不是不确定的随机性)。有什么方法可以保持订单,同时保持更好的吞吐量?在两台PC上实现近100%网络吞吐量的最佳方法是什么?

正如其他人在评论中指出的那样,如果您想使用TCP,单个TCP连接可能会为您提供最高吞吐量

通过UDP,您可能会获得稍高的吞吐量(实际上是稍微高一点),但是您需要重新创建TCP免费提供给您的所有好处

如果您想要双向高容量高速吞吐量(相对于高容量,一次只能单向),那么每个方向的一个连接可能更容易处理,但我没有太多的经验

设计技巧

你应该保持连接畅通。如果没有其他沟通,客户需要定期询问“你还在吗?”。(经过再三考虑,我意识到这样做的唯一目的是允许快速响应以及服务器启动消息事务的可能性。因此,我将其修改为:至少为完整事务保持连接打开。)

此外,您还应该拆分较大的消息—超过一定大小的消息。将每个块中发送的字节数保持为最大十六进制整数,在本地网络上通常为8K、16K、32K或64K。用尺寸做实验。至少从Windows 3开始,建议的最大尺寸是最佳的。您需要某种协议,其中chunck包含一个固定的头(通常是用于检查和重新同步的幻数,也用于检查和分析的块数,以及数据包的总长度),然后是数据

您可以通过压缩(通常是低速压缩)进一步提高吞吐量—这在很大程度上取决于数据,以及您是在高速网络上还是在慢速网络上


然后是一个人通常会遇到的麻烦-纳格尔算法的问题-我不再记得足够的细节了。我相信我过去常常通过发送一个确认来克服这一点,我认为这样做可以满足设计要求,从而避免等待最后的字节进入。但是谷歌可以这样做。

TCP是一种在IP之上分层的网络协议。TCP的目的是保证收到发送的包。如果数据包丢失(即使在最佳条件下也会发生),则会重新发送。这意味着,您不能保证发送包的顺序得到保留。您需要在TCP之上使用另一个协议(这将降低您的吞吐量);我不明白这有什么用。一个进程发送的数据肯定和三个进程发送的数据一样多?这样,排序问题就会少很多。也许某种流媒体协议在这种情况下更有用?@RomanoZumbéTCP已经在单个连接上保证了顺序。这里的问题似乎是使用了多个TCP连接。我同意其他的评论,即为什么您认为这种设计会从一开始就以任何方式提高吞吐量。如果您处理的是单个网络连接,那么添加客户端只会增加争用,可能会使争用变得更慢,而不是更快。如果您有多个网络连接,您可以使用“多路径”实现,但是,是的……这将非常复杂,需要客户端将数据解复用到多个路径中,然后服务器在接收时重新整合数据。数据将需要包括实现这一点的序列。“在两台PC上实现近100%网络吞吐量的最佳方法是什么?”编写专门用于此目的的软件。CPU和内存比网络连接更快。如果您的应用程序没有达到饱和状态,那么这就是您的应用程序的问题,如果您需要按顺序交付数据,最合适的解决方案是不运行多个实例,这只会产生更多的问题。修复根本原因,即您的失误