【发布时间】:2014-12-15 08:22:01
【问题描述】:
好的。我知道以前有人问过类似的问题,但这次不同。
我从对类似问题的回答中注意到,我可以使用Socket.bind 为传出连接指定某个网络接口。 This page 是官方的说明。
现在,我的机器有两个网卡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头的“Source Address”字段确实是ip.address.of.eth1。但是通过查看以太网报头,我发现源MAC地址实际上是eth0的MAC地址,也就是说,数据包实际上仍然是通过eth0发送出去的!
谁能帮助解释它为什么会有这种行为?是预期的吗?非常感谢!
【问题讨论】: