【问题标题】:Java Socket specify a certain network interface for outgoing connectionsJava Socket 为传出连接指定某个网络接口
【发布时间】:2014-12-15 08:22:01
【问题描述】:

好的。我知道以前有人问过类似的问题,但这次不同。

我从对类似问题的回答中注意到,我可以使用Socket.bind 为传出连接指定某个网络接口。 This page 是官方的说明。

现在,我的机器有两个网卡eth0eth1,系统路由表将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发送出去的!

谁能帮助解释它为什么会有这种行为?是预期的吗?非常感谢!

【问题讨论】:

    标签: java sockets


    【解决方案1】:

    这是“弱端系统模型”的结果。此处描述过于宽泛,但在 RFC 1122 中进行了讨论。

    【讨论】:

    • 非常感谢您提供的信息。考虑到弱端系统模型的规范“主机不得限制自己仅通过与数据报的 IP 源地址对应的物理接口发送(非源路由)IP 数据报”,我想没有办法然后用 Java 做,对吧?
    • 主机“绝对不能”这样做。与 Java 无关。
    猜你喜欢
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多