使用多个接口创建到单个 IP 和端口(TCP 服务器)的 tcp 出站连接

时间:2021-06-17 10:58:42

标签: linux sockets networking tcp

TCP 连接由 5 元组决定:[本地 IP、本地端口、远程 IP、远程端口、协议]。我无法更改远程 IP、远程端口、协议。现在,当客户端的临时端口恒定(1024–65535)时,如何从同一客户端创建超过 65K(计划创建超过 2L)的并发 TCP 连接(保存记录器时间的连接) ?

问题

多个接口(来自同一个客户端实例的多个 IP)可以使用同一个临时端口来创建出站 TCP 连接吗?

编写了一个 TCP 客户端,它使用 eth1(10) 和 eth2(5) 接口创建 15 个 TCP 并发连接(保持记录器时间),并仅启用 10 个临时端口(49001 - 49010 ip_local_port_range 文件)。并且 eth0 默认接口不使用 49001 - 49010 除 49001 之外的任何端口。

现在当我尝试发送 curl 命令时出现错误 卷曲 http://google.com -v

* Rebuilt URL to: http://google.com/
*   Trying XXX.XXXX.XXXX.46...
* TCP_NODELAY set
* Immediate connect fail for XXX.XXX.XXX.46: Cannot assign requested address
*   Trying XXXX:XXXX:XXXX:XXXX::XXXX...
* TCP_NODELAY set
* Immediate connect fail for XXXX:XXXX:XXXX:XXXX::XXXX: Network is unreachable
* Closing connection 0
curl: (7) Couldn't connect to server

tcp        0      0 xxx.xxx.xxx.245:49001       xxx.xxx.xxx.xxx:443         ESTABLISHED XXXX         
tcp        0      0 xxx.xxx.xxx.116:49010       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.116:49006       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49002       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.116:49008       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49010       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49009       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49006       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.116:49004       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49001       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49008       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49005       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.116:49002       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49003       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49004       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client        
tcp        0      0 xxx.xxx.xxx.248:49007       xxx.xxx.xxx.41:9999         ESTABLISHED 21805/client 

1 个答案:

答案 0 :(得分:-1)

在 Linux 中,如果您使用 setsockopt 在您的套接字上设置 SO_REUSEPORT,您可以拥有多个使用相同源地址和源端口的套接字。但是,您需要控制套接字创建代码才能使其工作。

正如您所指出的,您仍然受到限制,因为系统上的所有 TCP 套接字的 5 元组必须是唯一的。