端口复用概述
多个网络应用程序占用同一开放端口进行通讯
端口复用技术介绍
在网络编程中,端口复用技术的实现主要依靠setsocket函数的参数完成,其函数原型及头函数为
1
2
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