【问题标题】:Setting source address when sending UDP multicast messages发送UDP组播报文时设置源地址
【发布时间】:2019-09-01 08:26:25
【问题描述】:

如何将 UDP 组播包的源 IP 地址设置为接口 IP 以外的其他地址?

我正在尝试编写一个小型路由器,它可以选择性地将 UDP SSDP 包从一个网络路由到另一个网络。计划是用 python 来做,虽然我对此很灵活。

路由 SSDP NOTIFY 消息似乎相当容易:我在一个接口上接收它们并决定在哪个接口上重新广播它们。但是,M-SEARCH 消息的协议要求将源 IP 设置为消息的原始源,因为任何选择响应的服务都将以单播消息响应源 IP 和端口。

示例(高度简化):

  • 网络 A:192.168.10.0/24
  • 网络 B:192.168.11.0/24
  • 我的路由器应用程序在 192.168.10.2 和 192.168.11.2 上的多宿主计算机上运行。

网络 A 上 IP 为 192.168.10.10 的客户端发送 M-SEARCH 消息:

  • 源 IP/端口:192.168.10.10 端口 40000
  • 目标 IP/端口:239.255.255.250 端口 1900

我在 192.168.10.2 上的“路由器应用程序”接收到数据包并想在网络 B 上重新广播它。但是我在套接字 API 中找不到任何允许我设置源 IP 地址的方法。只选择源接口。

因此,重新广播的数据包现在看起来像这样:

  • 源 IP/端口:192.168.11.2 端口 xxxxx
  • 目标 IP/端口:239.255.255.250 端口 1900

现在接收服务无法单播回客户端,因为原始 IP 和端口已丢失。

【问题讨论】:

    标签: python sockets multicast


    【解决方案1】:

    如何将 UDP 组播包的源 IP 地址设置为接口 IP 以外的其他地址?

    我知道的唯一方法是使用 RAW 套接字并手动构建 IP 标头。请注意,在大多数平台上,RAW 套接字的使用通常仅限于管理员用户。

    但是,我在套接字 API 中找不到任何允许我设置源 IP 地址的方法。

    因为没有。

    现在接收服务无法单播回客户端,因为原始 IP 和端口已丢失。

    难道你不能让你的路由器在收到 M-SEARCH 请求时记住原始来源,并在收到单播回复时将其转发给原始请求者吗?这就是大多数路由器通常的工作方式。

    【讨论】:

      猜你喜欢
      • 2011-08-10
      • 2017-12-13
      • 1970-01-01
      • 2012-10-14
      • 2017-10-19
      • 1970-01-01
      • 2013-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多