服务器如何以及为什么使用随机端口号?
How and why do servers use random port numbers?
众所周知的服务通常在服务器端使用预定义的端口号。
然而,我意识到情况并非总是如此。例如,某些服务和游戏似乎会从预定义的范围内随机选择一个端口。
当你连接到一个预先定义的端口号时,你先发送一个请求,所以客户端的端口是可以确定的,但是如果服务的端口不是预先确定的,客户端怎么知道发送到哪个端口要求?另外,总是使用不同端口的原因是什么?这是如何发生的?
if the service's port is not predetermined, how does the client know to which port to send the request?
端口必须提前知道,由用户输入,或者在客户端可以找到的地方公布。
what is the reason for always using a different port
很多原因:安全、network/firewall限制等
how does the client know to which port to send the request?
这取决于具体的协议。例如,对于 SIP、H.323 或 FTP 等协议,信令通道有预定义的端口号。实际的数据传输是通过动态端口上的新连接完成的。这些端口在信令通道中公布。
在其他情况下,预定义的端口号上没有这样的信令通道。对于没有 IANA 分配的端口号的服务器来说通常就是这种情况。当服务器的多个实例(具有不同的配置)应该 运行 在同一个系统上并且这些实例不能使用相同的端口号时,也会发生这种情况。在这种情况下,相关的 IP 和端口可能会通过 DNS SRV 记录来公布。当然也可能有其他方式,比如在某些网站或类似网站上发布信息。
Also, what is the reason for always using a different port ...
同样取决于具体的协议。例如,对于 SIP、H.323 或 FTP,数据连接是特定于客户端的,它将简单地使用系统上空闲的端口。并且可以同时存在来自相同或来自不同客户端的多个连接,这些连接都使用不同的端口。任何关于端口范围的限制通常只是为了更好地与防火墙一起工作,因此这些不需要打开很大的端口范围,但可以允许更小的端口范围,从而降低攻击面。
... and how does this happen?
不给出特定值,让系统随机选择一个端口即可。或者,如果应该在某个范围内使用某个端口,那么它将通过尝试绑定到该端口来简单地确定哪个端口可用,如果绑定失败则继续下一个端口。
众所周知的服务通常在服务器端使用预定义的端口号。
然而,我意识到情况并非总是如此。例如,某些服务和游戏似乎会从预定义的范围内随机选择一个端口。
当你连接到一个预先定义的端口号时,你先发送一个请求,所以客户端的端口是可以确定的,但是如果服务的端口不是预先确定的,客户端怎么知道发送到哪个端口要求?另外,总是使用不同端口的原因是什么?这是如何发生的?
if the service's port is not predetermined, how does the client know to which port to send the request?
端口必须提前知道,由用户输入,或者在客户端可以找到的地方公布。
what is the reason for always using a different port
很多原因:安全、network/firewall限制等
how does the client know to which port to send the request?
这取决于具体的协议。例如,对于 SIP、H.323 或 FTP 等协议,信令通道有预定义的端口号。实际的数据传输是通过动态端口上的新连接完成的。这些端口在信令通道中公布。
在其他情况下,预定义的端口号上没有这样的信令通道。对于没有 IANA 分配的端口号的服务器来说通常就是这种情况。当服务器的多个实例(具有不同的配置)应该 运行 在同一个系统上并且这些实例不能使用相同的端口号时,也会发生这种情况。在这种情况下,相关的 IP 和端口可能会通过 DNS SRV 记录来公布。当然也可能有其他方式,比如在某些网站或类似网站上发布信息。
Also, what is the reason for always using a different port ...
同样取决于具体的协议。例如,对于 SIP、H.323 或 FTP,数据连接是特定于客户端的,它将简单地使用系统上空闲的端口。并且可以同时存在来自相同或来自不同客户端的多个连接,这些连接都使用不同的端口。任何关于端口范围的限制通常只是为了更好地与防火墙一起工作,因此这些不需要打开很大的端口范围,但可以允许更小的端口范围,从而降低攻击面。
... and how does this happen?
不给出特定值,让系统随机选择一个端口即可。或者,如果应该在某个范围内使用某个端口,那么它将通过尝试绑定到该端口来简单地确定哪个端口可用,如果绑定失败则继续下一个端口。