c# - TCP 连接是资源密集型的吗?

标签 c# tcp

我有一个 TCP 服务器,它从一个(且只有一个)客户端获取数据。当此客户端发送数据时,它会连接到我的服务器,发送一条(逻辑)消息,然后不再在该连接上发送任何消息。

然后它将建立另一个连接以发送下一条消息。

我有一位同事说,从资源的角度来看,这非常糟糕。他说建立连接是资源密集型的,需要一段时间。他说我需要让这个客户端建立连接,然后只要我们需要通信(或直到出现错误)就一直使用它。

使用单独连接的一个好处是,我可能可以对它们进行多线程处理,并在线上获得更高的吞吐量。我向我的同事提到了这一点,他告诉我打开很多套接字会杀死服务器。

这是真的吗?或者我可以只允许它为需要发送的每个逻辑消息建立单独的连接。 (请注意,逻辑消息是指长度可变的 xml 文件。)

最佳答案

这完全取决于您打算打开和关闭的连接数以及您打算打开它们的速率。

除非您通过中止连接而不是优雅地关闭它们来避免 TIME_WAIT 状态,否则您将在客户端或客户端上累积处于 TIME_WAIT 状态的套接字服务器。对于单个客户,这些问题在何处累积并不重要,因为问题是相同的。如果您使用连接的速率快于您的 TIME_WAIT 连接关闭的速率,那么您最终将到达无法打开任何新连接的地步,因为您没有留下任何临时端口所有这些都与处于 TIME_WAIT 中的套接字一起使用。

我在这里写得更详细:http://www.serverframework.com/asynchronousevents/2011/01/time-wait-and-its-design-implications-for-protocols-and-scalable-servers.html

一般来说,我建议您保留一个连接,如果它被重置,只需重新打开它。逻辑可能看起来有点复杂,但系统的扩展性会更好;您现在可能只有一个客户端,并且连接速率可能使您不希望遇到 TIME_WAIT 问题,但这些事实在您的系统生命周期内可能不会保持不变...

关于c# - TCP 连接是资源密集型的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7844122/

相关文章:

c# - 如何让 AutoMapper 不缓存映射对象?

C# 的滚动条装饰?

TCP,如何从服务器和客户端模拟 FIN?

tcp - Microchip TCP/IP 堆栈 PIC18F 无效数据包序列号/确认号

spring-boot - Spring-Integration:异常时未发送 Tcp 服务器响应

networking - tcpdump 将 tcp 流量过滤到 csv 文件中

c# - 如何监控特定应用程序的网络带宽使用情况?

c# - Entity Framework 未获取事务范围

c# - asp文本框没有按键事件

c# - 何时使用 TcpClient.ReceiveTimeout 与 NetworkStream.ReadTimeout?