Javasocket为传出连接指定特定的网络接口
好的。我知道以前也有人问过类似的问题,但这是不同的
我从对类似问题的回答中注意到,我可以使用Socket.bind
为传出连接指定特定的网络接口This页是这方面的官方指示
现在,我的机器有两个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));
我使用WireShark捕获数据包,并注意到IP头的“源地址”字段确实是ip.address.of.eth1
。但是通过检查以太网报头,我注意到源MAC地址实际上是eth0
的MAC地址,也就是说,数据包实际上仍然通过eth0
发送出去
有人能解释一下它为什么会有这种行为吗?这是预期的吗?非常感谢
# 1 楼答案
这是“弱端系统模型”的结果。它太宽泛了,无法在这里描述,但在RFC 1122中讨论了它