跳转至主要内容

在STCP下,当你有多个进程监听同一个端口号时,只有第一个绑定到端口号的进程在请求连接时才会被通知。绕过这个限制的一个常见方法是在连接完成时关闭监听套接字,然后创建一个新的套接字,再进行绑定和监听。这样就把监听套接字放在了监听套接字链的最后。

从17.1开始,如果不改变默认的STCP参数值,这个过程将不再有效。

在17.1之前,STCP误解了套接字选项SO_REUSEADDR的意图。这个选项的目的是允许监听端口X的进程在其被终止且系统仍有绑定到端口X的套接字处于TIME_WAIT状态时立即重新启动。然而,STCP之前的版本允许一个进程监听端口X,而不考虑绑定到端口X的套接字的状态,当然前提是SO_REUSEADDR套接字选项被设置。这种行为允许两个不同的应用程序监听同一个端口号。如果第一个应用程序使用监听端口回收过程,或者进程被终止并重新启动,第二个应用程序将有效地劫持该端口。

从17.1版开始,绑定函数将返回错误EADDRINUSE,除非在请求端口上绑定的所有套接字都处于TIME_WAIT状态;或者第二个进程与第一个进程具有相同的会话ID。所有从同一个父进程启动的进程都有相同的会话 ID,因此一个进程可以分叉多个子进程,而所有这些子进程都可以监听端口 X。

在17.1版本中增加了两个STCP参数,可以用来改变STCP的行为回到17.1之前的行为,它们是tcp_reuseaddr_action和udp_reuseaddr_action。每个参数都有"安全"(默认)和"不安全"两个值。之所以使用"不安全"这个词是因为这个设置会允许上述的端口劫持行为。

你可以使用 analyze_system request list_stcp_params 来显示这两个参数的当前设置(图 1),并使用 request set_stcp_param 来改变设置(图 2)。像所有的STCP参数一样,改变只在系统重启前有效,所以为了使改变成为永久性的,必须在module_start.cm文件或start_stcp.cm文件中设置参数为不安全。

analyze_system -request_line 'list_stcp_params tcp_reuseaddr_action' -quit
OpenVOS 17.1.0ab版,analyze_system 17.1.0ab版。
当前进程为481,第89B6B740步,Noah_Davids.CAC。

TCP SO_REUSEADDR action [safe/unsafe] (tcp_reuseaddr_action) safe

准备好了 17: 10: 29

analyze_system -request_line 'list_stcp_params udp_reuseaddr_action' -quit
OpenVOS 17.1.0ab版,analyze_system 17.1.0ab版。
当前进程为481,第89B6B740步,Noah_Davids.CAC。

UDP SO_REUSEADDR action [safe/unsafe] (udp_reuseaddr_action) safe

准备好了 17:11:16
图1--两个reuseaddr动作参数的显示。

 

 

analyze_system -request_line 'set_stcp_param tcp_reuseaddr_action unsafe' -quit
OpenVOS 17.1.0ab版,analyze_system 17.1.0ab版。
当前进程为481,第89B6B740步,Noah_Davids.CAC。

更改TCP SO_REUSEADDR动作 (tcp_reuseaddr_action)
从安全到不安全
准备好了 07: 30: 38
图2命令将tcp_reuseaddr_action改为不安全。

 

© 2020 Stratus Technologies.