0%

linux端口复用

端口复用概述

多个网络应用程序占用同一开放端口进行通讯

端口复用技术介绍

在网络编程中,端口复用技术的实现主要依靠setsocket函数的参数完成,其函数原型及头函数为

1
2
#include <sys/socket.h>
int setsockopt(int socket, int level, int option_name,const void *option_value, socklen_t option_len);

其参数对应为int option_name,而允许端口复用的参数有SO_REUSEADDR
SO_REUSEPORT
由于各个操作系统的端口复用实现细节大同小异,我这里只以linux为介绍对象。

先来说参数为SO_REUSEADDR时的端口复用。

SO_REUSEADDR

在Linux版本<=3.9时,只有SO_REUSEADDR参数,而无SO_REUSEPORT参数。
对于TCP连接,SO_REUSEADDR参数的使用,允许当上一个socket连接状态处于TIME_WAIT状态,新的socket连接才可以绑定同一个端口使用。
而对于UDP连接,由于它是一个无连接的协议,那么这时无论上一个连接处于什么状态,下一个socket套接字都可绑定这个端口。

SO_REUSEPORT

linux在3.9版本中加入了 SO_REUSEPORT 参数选项。
这个参数的使用允许同一ip和同一端口的重复使用,但是多个socket的进程必须是同一用户所有。
这个参数的使用,使得对于UDP连接,Linux尝试均匀分配数据包,而对于TCP连接,则尝试分发传入的连接请求并且均匀的跨所有共享相同地址和端口组合的套接字。

端口复用用途

最常用的用途应该是防止服务器重启时绑定的端口还未释放或者程序意外退出导致系统没有释放端口,如果这时设立了端口复用,那么重新启动或者新启动的应用进程可以直接绑定端口。

端口复用的危害

  • 木马的隐藏
  • 以低级权限嗅探到高级权限才能查看的数据
  • 中间人攻击

参考

https://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-they-differ-do-they-mean-t
CP套接字端口复用SO_REUSEADDR