给客户端的端口号通常是动态分配的,称为ephemeral port(临时端口)
net.ipv4.ip_local_port_range
在Linux系统上临时端口号的取值范围是通过这个内核参数定义的:net.ipv4.ip_local_port_range (/proc/sys/net/ipv4/ip_local_port_range),默认为32768 - 60999
[root@VM_42 /]# cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 net.ipv4.ip_local_reserved_ports /proc/sys/net/ipv4/ip_local_reserved_ports (net.ipv4.ip_local_reserved_ports)
是应用程序保留的端口号,不会参与内核动态分配.
端口号动态分配时并不是从小到大依次选取的,而是按照特定的算法随机分配的。临时端口号是这样产生的:生成一个随机数,利用随机数在ip_local_port_range范围内取值,如果取到的值在ip_local_reserved_ports范围内 ,那就再依次取下一个值,直到不在ip_local_reserved_ports范围内为止`
服务监听端口在32768 - 60999之间,可能导致端口号用作临时端口,从而导致服务启动失败,解决方式:
修改临时端口范围 ip_local_port_range,因为一个程序的端口问题修改一个机器的临时端口范围,明显减少了临时端口的使用量。代价大。
修改预留端口ip_local_reserved_ports,即使没有发生冲突也可以预先设置,防止后续端口被占用。