从控制器向 OpenFlow 交换机发送非流消息

send non-flow message from controller to OpenFlow switch

我正在为我的项目使用真实机器(hp procurve),我需要发送其他协议格式的消息,例如 OSPF,而不是流,通过套接字从控制器端发送到 OpenFlow 交换机(通过指定 ip OF交换机的地址和端口)。

但每次我尝试这样做时,我都会收到 "Connection refused" 错误消息,我猜可能是我正在向其发送消息的 OpenFlow 交换机上的端口没有在监听,所以我想我可能需要使用与 OpenFlow 交换机用于与控制器通信的相同端口进行发送,例如日志信息中的端口 51067 :

  • Switch:192.168.1.11:51067 is connected to the Controller

我的问题是,我如何检索控制器端的端口信息,因为它在我每次重启时都会改变?我找不到此信息。

还是我走错了方向,我需要另辟蹊径而不是使用套接字发送消息?

非常感谢,如有任何建议,我们将不胜感激。

约瑟夫

我认为您误解了 networking ports, protocol numbers, and protocols such as OSPF 的性质。让我清理一下:

端口号: 通常,只有一个应用程序在一个端口上侦听:操作 system/networking 堆栈检查特定类型(例如 TCP 或 UDP)的每个数据包) 获取端口号,然后将数据包传递给为该特定端口注册自身的应用程序。如果应用程序无法处理接收到的数据包,那么通常它会忽略它或记录错误。

Aside:只有在两个应用程序之前放置某种多路复用应用程序,两个应用程序才有可能在同一端口上通信(通常是 reverse proxy, possibly a TCPMUX application)。此多路复用应用程序将接收传入的数据包,确定它是什么类型的数据包,然后将其传递给正确的应用程序。

协议编号:协议编号是 IP 数据包中的一个字段,它告诉网络堆栈其中包含什么类型的数据。比如TCP是协议6,ICMP是1,OSPF是89.

OF 交换机: 现在,逻辑上 OF 交换机由两个组件组成:1) 交换结构(包括物理端口和 OF 流表),以及 2) a单独的物理端口用于带外控制,后面有几个应用程序 运行。这些应用程序之一是 OpenFlow 应用程序,在您的情况下,它恰好在端口 51067 上侦听。但在实际交换机中,其他应用程序也可能 运行 在不同的端口上,例如端口 80 上的 Web 界面 运行 用于维护等

OSPF:如果您现在想与服务于 Web 界面的应用程序对话,您需要从控制器向交换机发送目标端口为 80 的 TCP 数据包。同样,如果您想安装一个新流,您需要发送一个端口为 51067 的 TCP 数据包。 OSPF则不同,它直接使用IP包,不使用端口号。要处理 OSPF 数据包,应用程序需要使用 raw socket to process the incoming IP packets that have protocol number 89, and skip all others. See also the raw manpage here。这已经内置到您的 OF 开关中。

因此,如果您想将 OSPF 数据包发送到 OF 交换机(并且您的 OF 交换机在单独的物理端口上支持 OSPF!),您只需将 OSPF IP 数据包发送到交换机的IP地址(192.168.1.11),不需要端口!

请注意,单独的物理端口可能不支持 OF 交换机上其他端口的所有功能,因为它们的用途不同。