服务器套接字的工作原理是什么?当我创建一个java服务器套接字并在端口1234接受连接时。服务器是否实际使用端口1234用于所有客户端?我已经读过,当您编写网络服务器时,套接字实际上会在接受连接后打开另一个端口。
这是真的吗?如果是这样,为什么我没有在netstat中看到它?我看到很多像这样的连接
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:97.37.134.95:39236 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:89.204.153.101:26117 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:195.240.16.70:26193 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:80.187.98.116:15012 ESTABLISHED
tcp 0 0 ::ffff:MY_IP:1234 ::ffff:218.78.248.190:30794 ESTABLISHED
他们真的都在1234连接到我的服务器吗?如果是这样,这是否意味着服务器将能够接受无限数量的连接?
答案 0 :(得分:3)
所以他们真的都和我有关 服务器在1234?
是
如果是这样,那不就意味着你了 服务器将能够接受无限 连接数?
您可以拥有2 ^ 32-2-1(IP4)地址(一个可以在同一网络上拥有另一台主机),以及2 ^ 16个远程套接字端口。这很多,但不是无限的。无论如何,你之前会耗尽内存。
答案 1 :(得分:3)
TCP / IP套接字由元组唯一标识(本地地址,本地端口,远程地址,远程端口)。
这将提供非常多的套接字,但不是无限的。
答案 2 :(得分:2)
是的,你基本上是对的。
服务器正在侦听某个端口(您设置的端口),但是当您接受连接时,它将归属一个新连接的套接字号。
如果您没有使用netstat看到连接的套接字,可能是因为您没有使用正确的选项调用它。您应该在服务器端口上有一个LISTEN连接,并且每个活动远程连接都有一个ESTABLISHED连接和一个分配的本地端口。您还可以使用TIME WAIT状态保留一些终止连接(端接不良)。
以下是我系统当前状态的一些摘录(在Linux上使用netstat -anlp
获得)
tcp 0 0 0.0.0.0:3389 0.0.0.0:* LISTEN 27002/rdpproxy
tcp 0 0 10.10.4.185:3389 10.10.4.13:36725 ESTABLISHED 27233/rdpproxy
服务器是10.10.4.185,正在侦听端口3389.允许任何远程IP和远程端口连接。
第二行显示已连接的会话。远程地址是10.10.4.13,并为此地址保留端口36725。因此,您可以从10.10.4.185(成千上万)开始大量连接,还可以从其他系统开放更多连接。
并且,不,这并不意味着您的服务器将能够接受无限数量的连接,您的系统可能会退出资源,并且无法在该限制之前打开新连接。
答案 3 :(得分:1)
是的,服务器可以接受单个端口上的任意数量的连接。这是服务器和客户端套接字之间的区别,客户端套接字每个端口只能有一个连接。
答案 4 :(得分:0)
这不是无限的。有一个限制。在基于Unix的操作系统上,ulimit
命令将告诉您进程可以拥有的“打开文件”的最大数量,并且还允许您更改它。如果超出此限制,您将开始看到与“打开的文件太多”相关的IOExceptions。