TCP:最大连接数(客户端和服务器)


2

在维基百科的TCP描述中,有人说

服务器端的会话数仅受内存限制,并且可以随着新连接的到达而增长,但客户端必须在将第一个SYN发送到服务器之前分配随机端口。

第一部分似乎是合乎逻辑的:服务器只是使用客户端连接的端口作为源端口,因此仅受(客户端IP数量)*(临时客户端端口数量)的限制 - 这是一个很大的数字。

但为什么客户基本上不能做同样的事情呢?如果套接字A使用临时端口12345连接到server1(例如客户端:12345 - > server1:80),为什么套接字B不能通过重用相同的源端口连接到服务器2(客户端:12345 - > server2:80) ?这将允许来自单个主机的多个(端口数)传出TCP连接。

TCP规范中是否存在禁止这种端口重用的限制,或仅限于常见TCP实现的实际结果?如果是这样,第一种情况是否真的以与第二种情况不同的方式处理,或者单个服务器端口上的传入TCP连接数实际上也限制为65535?

为了澄清,我正在寻找理论(根据规范)和实际(实现;特别是Linux)限制:

  • 从单个客户端到ANY服务器/端口的传出连接。 (client:* -> *:*)
  • 从单个客户端到SAME服务器和端口的连接 (client:* -> server:port) - 这显然不会超过65535。
  • 从任何客户端到单个服务器端口的传入连接 (*:* -> server:port) - 我怀疑根据引用的段落和上述原因,这大于65535。

Answers:


5

tcp会话由地址的所有四个部分定义,并且只有组合的所有四个部分都必须是唯一的。

所以

client ip : source port  -> server ip : destination port

如果它们与下一个会话不同,则下一个会话有效,即使它使用相同的源端口和客户端IP。

实际上这是否可能取决于OS的网络堆栈和正在使用的TCP库的实现。

显然,对于传入连接,传入计数可能远远大于65535 - 繁忙的网站可以轻松地拥有比65000个连接更多的并发性。


+1但是,操作系统必须存储有关每个连接的信息,这通常需要大约1KB。虽然IP:端口元组给出了理论上最多数十亿个连接,但是简单地跟踪这些连接的实际RAM限制将首先限制。
Chris S

我已经怀疑实际限制不是由规范强加的,而是由实现 - 但我想学习那些:)
lxgr

好的,我已经运行了一些测试,似乎Linux默认情况下不允许源端口重用。设置SO_REUSEADDR时,可以重用端口!当然,即使这样连接到同一主机时connect()也会失败。
lxgr

0

客户端受OS的网络堆栈限制。任何操作系统都不太可能允许多个进程在套接字连接中使用相同的源端口。理论上,即使在现有客户端操作系统上也可以使用针对已知协议(如HTTP)的中间服务进行无限连接,类似于HTTP.SYS如何在Windows上的端口80上为多个HTTP服务器(在不同进程中工作!)工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.