【发布时间】:2016-03-08 21:23:49
【问题描述】:
与 HTTP 不同,websocket 从 HTTP 升级后保持长连接。
即使操作系统调整为使用所有端口,总共仍然只有 65536 个端口。 NGINX 有可能超过这个限制吗?
一个潜在的解决方案是SO_REUSEPORT,但它缺少文档——至少我没有找到除了下面这段
NGINX 1.9.1 版引入了一项新功能,可以使用 SO_REUSEPORT 套接字选项,在较新版本的 许多操作系统,包括 DragonFly BSD 和 Linux(内核 版本 3.9 及更高版本)。此套接字选项允许多个套接字 侦听相同的 IP 地址和端口组合。然后内核 负载平衡跨套接字的传入连接。
因此,NGINX 调用 accept 来接受入站连接。
accept() 系统调用与基于连接的套接字类型一起使用 (SOCK_STREAM,SOCK_SEQPACKET)。它提取第一个连接 请求侦听套接字的挂起连接队列, sockfd,创建一个新的连接套接字,并返回一个新文件 引用该套接字的描述符。新创建的套接字不是 处于聆听状态。原始套接字 sockfd 不受 这个电话。
新的套接字会消耗端口吗?如果是,如何超过 65535 连接限制?
【问题讨论】:
-
TCP 连接由四元组
(src_addr, src_port, dst_addr, dst_port)定义。如果客户端使用不同的 IP 地址和/或源端口,您可以将服务器连接到同一端口上的超过 65536 个客户端。示例:服务器 IP 是 0.0.0.1,侦听端口 80。所有 4 元组都可以是(*, *, 0.0.0.1, 80)。只要没有相同的 4 元组,服务器就可以在端口 80 上拥有内存允许的尽可能多的连接。 -
谢谢,我将问题更新得更清楚了。那么
accept创建的新socket不会消耗不同的端口? -
不,它不会切换到使用不同的端口。
-
感谢您的接受,为您的问题 +1;我也可以得到一份答案吗?
标签: sockets nginx websocket getsockopt dragonfly-bsd