Nodejs TCP连接客户端端口分配

4

我使用Node.js (net 模块) 创建了客户端与服务器之间的tcp连接。服务器正在预定义的端口上监听,客户端正在连接该端口。

据我所知,Node.js 会动态地为客户端分配端口,这是正确的吗?

  1. Node.js 使用什么样的算法来为客户端分配“随机”端口?它是由 Node.js 还是操作系统决定的?
  2. 是否可以定义静态端口供客户端使用?是否可以定义一系列供客户端使用的端口?

注意:我曾经在 stackoverflow 上找到过一个类似的讨论/问题,但现在无法找到了。如果您能分享任何可靠的关于这个主题的资源,我将不胜感激。

2个回答

2
源端口号通常对你的编程来说并不重要,除非你有一个路由器或防火墙在这方面有所限制。它仅仅是用于底层TCP基础设施来跟踪不同的TCP连接。
根据这篇文章,一个TCP/IP连接由四个元素组成:{源IP、源端口、目标IP、目标端口}。建立TCP/IP连接只需要目标IP和端口号,操作系统会自动选择源IP和端口。
上述文章介绍了Linux如何选择源端口号。
至于你的特定问题:
节点使用什么样的算法为客户端分配“随机”端口?这是如何工作的,是由node还是由操作系统决定的?
这是由操作系统决定的。该源端口号是在TCP级别上由发起主机在连接到node.js之前选择的。
一些其他参考文章: TCP源端口是否必须在每个主机上唯一? 应用程序如何在不与浏览器冲突的情况下使用端口80/HTTP? 注意:我所知道的防火墙限制源端口号或阻止某些源端口号没有安全原因。它们仅仅是TCP簿记号,与安全或正在使用的服务类型毫不相关。请注意,这与通常直接与正在使用的服务类型相关联的目标端口不同(例如,80是HTTP,25是SMTP,143是IMAP等)。当您建立TCP连接到另一台主机时,您指定主机地址和目标端口号。您不指定源端口号。

在我的情况中,源端口也很重要,因为有限制性的防火墙规则(不是我定义的,这意味着我无法更改那些规则)。所以根据您分享的文章,在我的情况下,“cat /proc/sys/net/ipv4/ip_local_port_range”(Linux)需要允许防火墙通过此端口范围,以便客户端能够正常工作。我是正确的吗? - cool
2
@cool - 你确定源端口被防火墙限制了吗?目标端口受限是很常见的,但限制源端口则不太常见(因为源端口与安全无关,是由主机操作系统随机选择的值)。事实上,如果限制源端口,会导致许多东西无法正常工作,包括互联网浏览器,因为阻止常规分配给出站TCP连接的源端口号。 - jfriend00
说实话,我99%确定,因为一切都依赖于内部网络(除了上面提到的TCP服务器)。防火墙规则不在客户端所在的机器(Linux)的级别上,它们有某种其他(对我来说未知的)系统来处理单个虚拟机以上级别的安全性(可能处理该内部网络中的几个虚拟机,请注意我是猜测,因为我不是处理这个问题的人),非常严格。因此,从我的角度来看,我想要提供端口范围,我知道nodejs将使用该范围 :) - cool
顺便说一下,你分享的那篇文章真的很有帮助。 - cool
3
如果您的网络管理员定义了源端口规则,他应该将其删除。这些规则在安全方面几乎没有提供任何帮助,只会增加应用程序的成本、风险和延迟。这种情况不应该被容忍一刻钟。 - user207421
显示剩余2条评论

0
所选答案提供了很多信息,但没有解决根本问题。Node似乎不允许https.request为客户端指定端口。存在localAddress和localPort选项,但它们似乎有问题。
我已经针对此问题开了一个新的问题。希望有人能回答除了“不要那样做”之外的其他内容。 有没有办法为node js https请求设置源端口?

我认为我们谈论的不是同一个话题。依我之见,@jfriend00的回答已经涵盖了一切。我的问题主要与原始的TCP连接有关,这与“https”模块完全不同,并且在TCP层之前使用它。 - cool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接