好。我知道之前曾问过类似的问题,但这是不同的。
从对类似问题的回答中,我注意到可以用来Socket.bind为传出连接指定某个网络接口。此页面是对此的官方说明。
现在,我的机器有两个NIC 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));
Run Code Online (Sandbox Code Playgroud)
我使用WireShark捕获数据包,并注意到IP标头的“源地址”字段的确是ip.address.of.eth1。但是通过检查以太网报头,我注意到源MAC地址实际上是的MAC地址eth0,也就是说,数据包实际上仍然是通过eth0!发送的!
谁能帮助解释为什么它有这种行为?是预期的吗?非常感谢!