![我可以强制 IP 数据包通过同一台机器上的“环回”连接传输吗?](https://linux22.com/image/1534153/%E6%88%91%E5%8F%AF%E4%BB%A5%E5%BC%BA%E5%88%B6%20IP%20%E6%95%B0%E6%8D%AE%E5%8C%85%E9%80%9A%E8%BF%87%E5%90%8C%E4%B8%80%E5%8F%B0%E6%9C%BA%E5%99%A8%E4%B8%8A%E7%9A%84%E2%80%9C%E7%8E%AF%E5%9B%9E%E2%80%9D%E8%BF%9E%E6%8E%A5%E4%BC%A0%E8%BE%93%E5%90%97%EF%BC%9F.png)
我的以下问题是初级水平,我可能缺乏重要的关于网络基础知识的知识。虽然这个问题在某种程度上与服务器/客户端概念有关,但背后的主要问题肯定不是编程。所以我在这里尝试,希望不要完全偏离主题。我不知道这个问题放在哪里会更好……请不要在没有给出错误提示的情况下关闭问题。
给定一台机器(在我的情况下是一台 PC),它可以安装多个网卡,提供两个物理接口A
。B
根据以前的问题是这两个接口(第 1 层)是否可以分配给两个不同的 IP 地址(第 3 层):
向接口的第 2 层模块注册的第 3 层模块将被分配该接口的第 3 层地址。
例如,IP(A)
= 192.168.1.10 和IP(B)
= 192.168.2.10;均由特定接口卡的 TCP/IP 属性分配。
问题:
假设有一个服务器进程正在运行在同一台机器上启动时,它会将自己注册到 IP(B) 和某个端口,然后开始侦听传入连接。因此,它会侦听通过接口 B 到达的任何传入请求。
现在我有一个 TCP 客户端在同一台机器上,我想打开与 IP(B) 上的服务器的 TCP 连接。因此,我天真地使用外部环回电缆连接 A 和 B,并期望在请求连接到 B 时,流量会通过该电缆传输。但是没有办法告诉客户端,X
它应该使用哪个接口...它会使用A
还是B
?我甚至猜测,它会使用B
,因为A
和B
根据所选的子网掩码是不同的网络,因此B
将通过接口 发出对中的最终地址的请求B
?附带一个问题:现在的数据包方式是什么,因为不需要电缆。有内部环回吗?
但如果我想力量环回电缆上的流量(无论出于何种原因)?这有可能吗?我如何才能实现客户端在寻址时使用 A 作为传出接口IP(B)
。最后:我只是想确保客户端和服务器之间发送的所有数据包都通过电缆传输。
当服务器和客户端位于不同的机器上,且每台机器都具有单个网络接口时,我就可以毫无困难地理解。但是在这里呢A
?B
我为什么需要这个?
实际上,下一步我想用一个实验装置替换A
和之间的电缆B
,通过故意添加某些类型的噪声和统计误差来模拟/仿真非常糟糕的信道,可以改变误码率。我可以将每一侧放在不同的机器上,但更希望将两边放在同一台机器上。
答案1
大多数操作系统的网络堆栈都会看到您发送的目标地址是本地计算机本身拥有的地址,并且会使用内部软件环回机制,这样流量就不会产生离开主机甚至到达以太网硬件的成本。事实上,大多数时候,网络人员谈论环回,他们谈论的是完全在网络软件堆栈内部的这些环回机制。“环回”几乎从不意思是“从一个 NIC 出去,穿过网络电缆的外部环路,再回到另一个 NIC”。
强制流量从一个 NIC 流出并返回到另一个 NIC 的方法可能因操作系统而异。例如,BSD 系列 Unix 的某些成员(如 FreeBSD 和 macOS)有一个名为 的 sysctl net.link.ether.inet.useloopback
,默认设置为 1(启用),但可以将其清除为 0(禁用),以强制流量流出 NIC,即使其目的地是同一台计算机上的另一个 IP 地址。
答案2
我认为我们需要您的操作系统或设备标记来提供更详细的解决方案,但您可以通过为网络设置默认路由来实现这一点。
这意味着您将定义来自网络 192.168.1.0/24 的所有流量都将从 xxxx ip 地址或某个特定端口发出。
您必须有一个路由表,其中定义了通过该端口/地址传输流量的路由。