我有一个关于实现负载均衡器或TCP/IP服务器程序执行TCP/IP的具体问题。
由于端口号是16位,在任何给定的时间,一个Linux盒上的最大端口只有65536个。而TCP/IP需要一个端口号才能与外界对话。1)当客户端建立连接时,将选择一个临时端口号。2)当监听套接字的服务器接受连接时,将分配端口号。
因此,根据我的理解,在任何给定的时间,在给定的机器上最多只能存在65536 TCP/IP连接。
那么,一些或大多数负载平衡器如何声称拥有200,000或更多并发连接?
谁能解释一下吗?
同样关于负载平衡器,一旦负载平衡器将请求转发到其背后的服务器之一,负载均衡器能否以某种方式将一些信息传递给它,这将帮助服务器直接响应于原始客户端,以避免通过负载平衡器发送回响应的延迟?
谢谢大家的帮助。汤姆比
发布于 2015-07-27 23:02:11
由于端口号是16位,在任何给定的时间,一个Linux盒上的最大端口只有65536个。
65535实际上,因为你不能使用端口0。
当监听套接字的服务器接受连接时,将分配端口号。
不,不是。传入连接使用与其连接的相同端口。没有在accept()上分配新端口。
因此,根据我的理解,在任何给定的时间,在给定的机器上最多只能存在65536 TCP/IP连接。
不,看上面。实际限制由内核和进程资源决定:打开FDs、线程堆栈内存、内核缓冲区空间、不是16位端口号。
发布于 2015-07-28 08:58:04
这个问题一直很混乱,所以我试着用例子来解释。
首先,关于端口的几个词:每个人都知道它们在物理上是不存在的,它们只是连接的额外标识信息,也是允许多个服务器监听同一个地址的方法(如果没有端口的概念,那么只有一个服务器可以监听一个地址,或者其他一些机制必须到位)。另外,端口是unsigned short,所以它可以有与65535 (64k)之间的值。
现在,对端口的限制:当bind ing: a ( server )套接字(我们称之为SS)可以绑定到一个地址和端口时,端口在服务器端:(除非在第一次绑定之前设置了SO_REUSEADDR,否则)只有一个套接字可以一次侦听特定地址和端口,所以如果有人已经在端口上侦听,您也不能监听。有一些著名的端口(例如: sshd - 22,httpd - 80,RDP - 3389,.在创建SS时应该避免这种情况,一般的指导方针是不要使用端口号< 1k。有关“保留”端口的完整列表,请访问www.iana.org。
正如链接我张贴在评论中中所述,有一个5项元组(2对+1附加元素)标识连接(LocalIP: LocalPort、RemoteIP: RemotePort、Protocol) (最后一个成员只是为了达到成熟,此时我们并不关心它)。现在,对于侦听IP:端口的特定SS,连接到它的所有客户端(客户端套接字: CS)中的一对将是相同的,这取决于从以下位置查看连接:
现在,我将在2台机器(Centos(192.168.149.43) -服务器和Windows(192.168.137.10) -客户端)上举例说明。我用Python创建了一个虚拟的TCP服务器(注意代码不是结构化的,没有异常处理,只有IPv4支持,目的不是要有Python类,而是要看到一些套接字行为):
import sys
import select
import socket
HOST = "192.168.149.43"
PORT = 4461
WAIT_TIME = 0.5
if __name__ == "__main__":
conns = list()
nconns = 0
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, PORT))
srv.listen(0xFF)
print "Entering loop, press a key to exit..."
while sys.stdin not in select.select([sys.stdin], [], [], 0)[0]:
if select.select([srv], [], [], WAIT_TIME)[0]:
conn = srv.accept()
print "Accepted connection from: (%s, %d)" % conn[1]
conns.append(conn)
nconns += 1
print "Active connections:", nconns
for item in conns:
item[0].close()
srv.close()
print "Exiting."以下是服务器机器上的netstat输出(在运行服务器应用程序之前)。我选择了端口4461进行通信:
[cfati@xobved-itaf:~]> netstat -an | grep 4461
[cfati@xobved-itaf:~]>所以和这个港口没有任何关系。现在,在启动服务器之后(我必须修剪一些空格,以便输出适合这里):
[cfati@xobved-itaf:~]> netstat -anp | grep 4461
tcp 0 0 192.168.149.43:4461 0.0.0.0:* LISTEN如您所见,端口4461上有一个监听连接的套接字。
现在在客户端机器上启动Python解释器,在控制台中运行以下代码:
>>> import sys
>>> import socket
>>> HOST = "192.168.149.43"
>>> PORT = 4461
>>>
>>> def create(no=1):
... ret = []
... for i in xrange(no):
... s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
... s.connect((HOST, PORT))
... ret.append(s)
... return ret
...
>>> sockets=[]
>>> sockets.extend(create())在服务器机器上键入最后一行之后,我们将查看服务器输出:
接受连接:(192.168.137.10,64218) 活动连接:1
以及相应的netstat输出:
[cfati@xobved-itaf:~]> netstat -an | grep 4461
tcp 0 0 192.168.149.43:4461 0.0.0.0:* LISTEN
tcp 0 0 192.168.149.43:4461 192.168.137.10:64218 ESTABLISHED您可以看到ESTABLISHED连接(这是接受的套接字- AS):连接从端口64218的192.168.137.10启动到端口4461的192.168.149.43。
下面是客户机上相应的netstat输出(在创建连接之后):
e:\Work\Dev>netstat -an | findstr 4461
TCP 192.168.137.10:64218 192.168.149.43:4461 ESTABLISHED如您所见,(IP/Port)对(与服务器机器上的输出相比)被反转(就像前面提到的镜像)。如果我再次在解释器中的客户端机器上运行并重新运行最后一行(创建一个新连接):
>>> sockets.extend(create())服务器应用程序的输出将显示另一个条目:
接受连接:(192.168.137.10,64268) 活动连接:2
而服务器上的netstat输出:
[cfati@xobved-itaf:~]> netstat -an | grep 4461
tcp 0 0 192.168.149.43:4461 0.0.0.0:* LISTEN
tcp 0 0 192.168.149.43:4461 192.168.137.10:64268 ESTABLISHED
tcp 0 0 192.168.149.43:4461 192.168.137.10:64218 ESTABLISHED我不会在客户端机器上发布netstat将输出的内容,因为这是显而易见的。
现在,让我们看看两个对应于活动连接的两对: 192.168.137.1064268,192.168.137.1064218.这两个端口由accept函数(在SS上调用Ux或赢 )返回。
两个端口(64268和64218)由连接()使用,但这并不意味着它们不能再被使用。其他套接字服务器可以监听它们(我在这里是在服务器机器上下文中),或者它们可以作为已使用的端口出现在来自其他地址的连接中。下面是一个假设的netstat输出:
tcp 0 0 192.168.149.43:4461 192.168.137.45:64218 ESTABLISHED因此,端口64218也可以出现在来自192.168.137.__45的连接中(注意,我更改了最后一个IP字节)。
的结论是,您在某种程度上是正确的,:不能超过65535 (不包括在其他解决方案中指定的0)来自同一个IP地址的同步连接。这是一个巨大的数字,我不知道在现实世界中它是否可以满足,但即使是这样,也有一些“技巧”可以绕过它(一个例子是让2+ SSs监听2+不同的端口,并配置客户机,如果连接到服务器的一个端口不能使用另一个端口,那么来自同一地址的最大同时连接数可以增加一个与我们监听的服务器端口数相等的因素)。
负载平衡器处理来自多个地址的连接,因此它们的数量可以轻松地增长到几十万。
https://stackoverflow.com/questions/31664078
复制相似问题