65536 +1系统上的连接


35

网络中的每个系统都有65536个端口,每个连接或“发送/接收”将使用其中之一。

我的问题是:如果我们有65536 + 1个连接会发生什么

我知道这不会以正常方式发生,但是我很好奇操作系统会如何处理它。


12
连接将被拒绝。但是,实际上,在65535个开放连接之前,很长一段时间都会出现问题。
ChrisInEdmonton

1
@ChrisInEdmonton否。如果它是出站连接,则会因无法分配本地端口而收到绑定错误。如果是入站连接,则端口限制不适用。
user207421

如果连接是inbout,则将收到连接被拒绝的信息;如果连接是出站,则套接字调用将出错。我不会将此作为答案,因为我不确定。
Jorge Aldo 2015年

Answers:


61

请注意,一个系统可以处理超过65536个并发连接,因为他们并不一定每次使用一个单独的端口。

TCP连接或UDP流由4元组定义:

(source IP address, source port, destination IP address, destination port)

因此,即使您有一台仅具有单个IP地址的Web服务器计算机,以及仅在端口80上侦听的单个HTTP服务器软件包,从理论上讲,它可以处理每个与之连接的客户端IP地址的 65536个连接。因此,来自客户端IP地址1的64Ki连接,加上来自客户端IP地址2的64Ki连接,依此类推。

因此,协议大致上支持到单个IPv4地址上的单个TCP或UDP端口的2 48个连接/流。同时考虑TCP和UDP,以及IPv4的地址空间和IPv6的宇宙/漫画很大的地址空间,您会发现协议本身不可能成为主机并发连接数量限制的源头可以处理。

同样,TCP或UDP协议中也没有任何内容可以阻止客户端计算机使用单个IP地址上的单个源端口来建立与各种服务器地址和端口的多个传出连接。有时,给定OS的网络API可能不容易做到这一点,但是要记住重要的一点,例如,古老的“ [BSD]套接字” API只是TCP和UDP的一个API。TCP和UDP可能具有传统Sockets API未公开的功能。

因此,给定主机可以处理的并发TCP连接或UDP流的数量不受端口号的限制,而受诸如跟踪所有这些连接并为其提供服务的RAM空间和CPU时间之类的系统资源的限制。而且,操作系统特定于实现的详细信息可能会施加人为限制。例如,在Unix中,“一切都是文件”的理念中,每个TCP连接或UDP流可能都有一个文件描述符。如果您的Unix内核对它可以跟踪的文件描述符数量有限制,则该文件描述符限制是您的内核可以处理的并发TCP连接或UDP流数量的人为限制。


2
在这个极好的答案中,可能值得链接到en.wikipedia.org/wiki/C10k_problem
ChrisInEdmonton 2015年

1
我实现了一个TCP服务器,该服务器可以同时容纳来自每个可能IP地址的65,534个连接。它没有做太多事情-只是回声了一些字符替换的输入文本-但它运行在非常小的硬件平台上。我不认为它完全符合RFC,但是尽管它既不知道也不关心大多数端口上打开了多少个TCP连接,但它似乎运行得很好。
超级猫

2
如果确实需要在两台计算机之间连接超过65536个连接,则可以将计算机设置为使用多个IP地址。您添加到两台计算机上的每个IP地址都会最大程度地增加最大连接数(至少从理论上讲,您更有可能首先遇到其他问题)。
Lie Ryan
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.