服务器可以处理的不同端口上有多少个tcp连接?

时间:2014-04-08 10:55:26

标签: c# sockets network-programming

我正在用C#设计服务器客户端应用程序。 客户端连接并与服务器通信扔掉了tcp套接字。

在服务器端我使用socket.accept()方法来处理来自客户端的新连接。当客户端连接时,服务器使用随机端口与客户端通信。

所以我的问题是..服务器可以以这种形式接收多少客户端? 我应该使用另一种形式来处理大量客户吗?

3 个答案:

答案 0 :(得分:3)

这实际上受操作系统的限制。你必须测试这个。在Windows上,您必须使用此规模的完全异步套接字IO。您可能会受到内存使用的限制。

在TCP级别上没有实际限制。 (server port, server ip, client port, client ip)的每个组合可以有一个连接。因此,只需一个服务器端口和一个服务器ip,即使每个客户端的连接数少于65k,也可以为无限量的客户端提供服务。

您无需在服务器上选择随机端口。这是一种常见的误解。

答案 1 :(得分:1)

  

在服务器端我使用socket.accept()方法来处理来自客户端的新连接。当客户端连接时,服务器使用随机端口与客户端通信。

除非你打开从服务器到客户端的另一个无意义的连接,否则你不会因防火墙原因而这样做。接受的套接字使用与侦听套接字相同的本地端口号。与此处的几个答案和评论相反。

因此,您的问题建立在误解之上。无论你用完什么,它可能是内存,线程句柄,套接字句柄,套接字缓冲区空间,CPU,CPU电源,虚拟内存,磁盘空间......,它不会是TCP端口。

编辑新随机端口理论的支持者需要解释以下netstat输出:

TCP    127.0.0.4:8009         0.0.0.0:0              LISTENING
TCP    127.0.0.4:8009         127.0.0.1:53777        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53793        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53794        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53795        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53796        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53798        ESTABLISHED
TCP    127.0.0.4:8009         127.0.0.1:53935        ESTABLISHED

并显示RFC 793中有关将新端口分配给已接受套接字的内容,以及TCP连接握手交换中传送新端口号的位置。

答案 2 :(得分:-1)

您可能希望以类似的方式看到我提出的这个问题:https://softwareengineering.stackexchange.com/questions/234672/is-there-are-problem-holding-large-numbers-of-open-socket-connections-for-length,特别是一些评论。

答案似乎是没有实际限制。接收端口和发送端口的组合必须是唯一的,并且每个端口都可以具有64K值。组合总数非常大。确实存在具有极大数量的开放连接的服务器,但要实现这一目标,您必须解决许多其他有趣的问题。上面的问题包含一篇关于一百万个连接服务器的文章的链接。另见How to retain one million simultaneous TCP connections?。并在网上搜索C10K问题。

您可能无法做的是使用同步端口和线程,因为您遇到了线程限制,而不是端口限制。您必须使用异步端口和线程池。你必须写一个扔掉,只是为了找出如何去做。