我了解到 TCP 连接由元组(源 IP、源端口、目标 ip、目标端口)标识。从理论上讲,因此应该可以让一个来自 host1:port1 的客户端连接到 server1:port1,同时另一个客户端(在 host1 上运行)从 host1:port1 连接到 server2:port1。
我已经在 Java 中进行了一些测试,到目前为止似乎是可能的。
但是,我多次阅读到主机地址的源端口必须是唯一的,这基本上意味着最多有 65536 个并发传出 TCP 连接的硬限制。真的吗?
更新:这是我的 Java 代码。这似乎有效,并且 netstat -t 清楚地显示了来自端口 9990(一个到 9997,一个到 9998)的两个活动的传出连接。至少在现代 Linux 上,这似乎是可能的?
Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);
Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);
Run Code Online (Sandbox Code Playgroud)
和 netstat -t 输出(截断):
tcp6 0 0 localhost:9990 …Run Code Online (Sandbox Code Playgroud) 是否可以通过 DHCP 为以太网主机分配仅主机本身的子网掩码,例如 192.168.1.123/32?常见的操作系统是否支持这种配置?
我希望主机将所有流量发送到路由器(而不是直接发送到同一网段上的其他主机),但仍然让它们能够通信(因此没有“客户端隔离”);有效地创建点对点链接,但无需任何客户端配置。
更新:我的目的是配置一个运行 dd-wrt 的家庭路由器,以便所有流量都必须通过路由器上的 IP 堆栈,因此可以通过一些 ipfilter 规则对其进行过滤。我希望有一个通用的解决方案,一种实现点对点以太网连接的标准方法,仍然可以由 DHCP 为所有公共操作系统自动配置。
根据迄今为止的反应,这似乎并不容易。我将阅读有关 VLAN 的更多信息,然后重新考虑我的计划。
有什么方法可以让不支持 IPv6 的应用程序继续在只有 IPv6 连接的主机上工作?
主机的 IPv4 实现可以知道这个问题,只需将 IPv4 地址封装在 IPv6 标头中(如 0::ffff:[ipv4]?),但是这些包在哪里转换为真正的 IPv4 数据包?
当前的操作系统是否已经为仅支持 IPv4 的应用程序提供了这种功能?提供商的 NAT64 或其他网关是否能够提供所需的功能?
如果提供商未使用 NAT64 的标准前缀 (64:FF9B::/96),则如何确定实际前缀?操作系统和网络堆栈会处理所有这些吗?
当应用程序已经知道 IPv6,但仍想与 IPv4 主机通信时,这是如何工作的?前缀在哪里确定,在网络堆栈中,还是应用程序必须处理?
每次客户端发送或接收数据包时,UDP 连接是否通过 NAT 重置超时,或者是否有任何(常见)实现要求客户端主动发送某些内容以保持连接活动?
我正在开发一个 UDP 流应用程序,我想知道如果没有有效负载数据,除了服务器已经发送的心跳之外,我是否还必须让客户端发送一个定期心跳。