行。我之前也知道类似的问题,但这是不同的。
我注意到对类似问题的回答,我可以使用Socket.bind
为传出连接指定某个网络接口。 This页面是对此的正式指示。
现在,我的计算机有两个网卡eth0
和eth1
,系统路由表将eth0
设置为用于连接服务器S
的传出接口。
然后我尝试了以下内容:
Socket so = new Socket();
so.bind(new InetSocketAddress("ip.address.of.eth1", 0));
so.connect(new InetSocketAddress("ip.address.of.S", 80));
我使用WireShark捕获数据包,并注意到"源地址" IP标头的字段确实是ip.address.of.eth1
。但是通过检查以太网头,我注意到源MAC地址实际上是eth0
的MAC地址,也就是说,数据包实际上仍然是通过eth0
发送的!
任何人都可以帮忙解释为什么会出现这种行为吗?这是预期的吗?非常感谢!