如何保留tcp本地端口?

时间:2018-01-02 05:20:41

标签: linux sockets tcp bind

在我的应用程序中,我将套接字绑定到端口38614。

在测试中,我发现有时候该端口被另一个应用程序使用。

所以我没有绑定它并得到错误,“地址已在使用中”。

我做了一些研究,发现我可以设置参数/ proc / sys / net / ipv4 / ip_loca_port_range来为我的应用程序保留端口。

所以我在文件/etc/sysctl.conf中添加了一行“net.ipv4.ip_local_port_range = 50000 60000”。

然后我重新启动系统。

但我仍然发现某个应用程序使用了我设置范围之外的端口34660。

[root@xxxx ~]# netstat -apn | grep fe80::cef1:3
tcp6       0      0 fe80::cef1:12345 fe80::cef1:34660 ESTABLISHED 2401/xxxx

那么我应该怎么做才能为我的申请预留一些端口?

有人能给我一些建议吗?

另一种方法是使用一个小端口,例如1001,任何其他应用程序都不使用它,但我不认为小于1024的端口为well-known ports保留是个好主意。

=============================================== ================

我找到了问题“how do I reserve ports for my application?

的答案

虽然我认为这不是一个好主意,因为很难确保我们的应用程序比任何其他应用程序运行得更早。实际上我的应用程序必须在另一个为我的应用程序做准备的应用程序之后启动。

当需要端口时,linux系统可以将端口池中的任何端口分配给任何应用程序。

=============================================== ================

参数“ip_local_reserved_ports”类似于“ip_local_port_range”,它们位于同一文件夹中,并且测试起来要困难得多。在我的测试中,参数“ip_local_port_range”不能像我们期望的那样工作,所以我不相信“ip_local_reserved_ports”是可以的。

B.R。 前进

2 个答案:

答案 0 :(得分:0)

保留端口的想法是阻止该端口用于传出连接。我的意思是,如果您有一个可能会开放监听8080端口的服务,而您没有保留它,并且端口范围包括该端口,则可能与随机使用8080作为“源端口”的传出连接冲突。

答案 1 :(得分:-1)

我引用了how do I reserve ports for my application?

的答案

您可以尝试:

  

sysctl -w net.ipv4.ip_local_reserved_ports = 49000,49001   将其放在/etc/sysctl.conf中,然后运行sysctl -p。

     

确保内核不会向客户端发出49000和49001,因为您希望将它们用于Linux上的服务器。

     

请注意,这是未经测试的。

然而,这是该问题的公认答案:

  

从技术上讲,没有“保留端口”这样的东西。

     

在TCP / UDP中,“保留”端口的唯一方法是实际绑定()套接字。其他应用程序不会使用绑定端口;未使用的端口是未使用的,因此其他应用程序可以自由使用它。

     

如果您正在编写服务器软件,那么您可以在应用程序代码中尽早将套接字绑定到特定端口。使端口号可配置,或至少在文档中明确说明它们,以便系统管理员可以快速识别冲突并将冲突的应用程序移动到单独的服务器。