【发布时间】:2021-06-17 10:58:42
【问题描述】:
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
【问题讨论】:
-
“多个接口(来自同一个客户端实例的多个 IP)可以使用同一个临时端口来创建出站 TCP 连接?”是的,只要它们都不为 0.0.0.0。
-
@user207421 对。但是为什么 curl 命令(不仅仅是 curl 命令任何 HTTP 客户端)需要 --interface 才能在这种情况下工作。为什么它不使用主接口来发送请求。
标签: linux sockets networking tcp