0x00 目录

0x01 前言

网络运行情况需要通过链路丢包率、时延、吞吐量等网络性能指标来体现。本文总结了SDN中,利用OpenFlow消息去测量网络拓扑、链路丢包率和时延、以及交换机端口吞吐量的方法。

0x02 基于OpenFlow的Port-Stats消息测量丢包率和吞吐量

OpenFlow交换机中维护了多种计数器,会对每张流表、每条流表项、每个物理端口、每条队列等进行信息统计。通过OpenFlow统计消息,SDN控制器可以周期性的查询并获取OpenFlow交换机的计数器统计信息,这些信息可用于测量丢包率和吞吐量,这种通过查询的测量方法属于被动测量。

OpenFlow统计消息包含Port-Stats消息、Flow-Stats消息、Aggregate-Stats消息、Queue-Stats消息、Group-Stats消息、Meter-Stats消息和Table-Stats消息,这些消息可用于获取OpenFlow交换机中指定计数器的统计信息,如Port-Stats消息可以用于获取指定OpenFlow交换机物理端口的统计信息,Flow-Stats消息用于获取指定流表项的统计信息。

Port-Stats消息

测量链路丢包率和端口吞吐量需要用到Port-Stats消息。

Port-Stats消息具体有两种,一种是Port-Stats-Request消息,用于SDN控制器请求交换机端口统计信息,另一种是Port-Stats-Reply消息,交换机用它来应答SDN控制器,具体过程是交换机读取指定端口的计数器,获得端口的统计信息并将其封装在该消息中,然后将消息发送给SDN控制器。在OpenFlow 1.3中,Port-Stats-Request和Port-Stats-Reply消息格式如图1和图2所示,SDN控制器可以从Port-Stats-Reply消息中获取到交换机端口的接收/发送数据包个数(rx_packets/tx_packets),接收/发送字节数(rx_bytes/tx_bytes),丢弃数据包个数(rx_dropped/tx_dropped),冲突次数(collisions),端口生存时间(duration_sec和duration_nsec)等统计信息,这些信息将用于计算链路丢包率、端口吞吐量。

图1 OpenFlow1.3中的Port-Stats-Request消息格式

图2 OpenFlow1.3中的Port-Stats-Reply消息格式

测量丢包率

丢包率是指一段时间内,数据包丢失数与总发送数的比值。

如图3所示,测量S1到S2方向的链路丢包率时,SDN控制器需定期向交换机S1和S2发送Port-Stats-Request消息,来获取S1的1端口发送数据包个数tx_packetss1以及S2的2端口接收数据包个数rx_packetss2。通过每隔一段时间进行轮询,利用公式(1)可以计算得到S1到S2方向的链路在第i-1次和第i次查询时间段内的丢包率。

图3 基于OpenFlow统计消息测量链路丢包率原理图

测量吞吐量

吞吐量是指单位时间内传输无差错数据总量。

测量交换机端口吞吐量时,依然按图3所示,SDN控制器将周期性发送Port-Stats-Request消息到指定交换机,并从交换机的Port-Stats-Reply消息中获取接收/发送字节数(rx_bytes/tx_bytes)和端口生存时间(duration_sec和duration_nsec),利用公式(2)和(3)可以计算第i-1次和第i次查询时间段内的吞吐量大小。

注:交换机的一个物理端口实际上是由一个TX端口和一个RX端口组成,分别用于发送和接收数据,因此端口吞吐量实际指的是TX端口的发送吞吐量,以及RX端口的接收吞吐量。例如,计算发送吞吐量,则公式2中的分子为tx_bytes(i) - tx_bytes(i-1)。

0x03 基于OpenFlow的Packet-Out消息和Packet-In消息测量拓扑和时延

根据主动测量的思想,可由SDN控制器生成探测数据包并下发至指定的交换机,当测量过程结束时,被测交换机需要触发相应机制将探测包返回控制器,由控制器分析并计算得到测量结果。由于SDN网络中交换机处理数据包的规则,即流表项,需要由控制器指定,因此实现主动测量的关键在于控制器如何生成和回收探测数据包,以及如何制定探测包的转发规则。

Packet-Out消息

OpenFlow协议规定了控制器和交换机相互发送数据包的消息类型。由控制器发起的Controller-to-Switch消息类型中,包含一类Packet-Out消息,其格式如图4所示。控制器能够自定义该消息中携带的数据包内容,以及交换机收到Packet-Out消息后的行为。控制器通过在Packet-Out消息中封装探测数据包并下发至指定交换机,就能够发起主动测量任务。

图4 OpenFlow1.3中Packet-Out消息格式

Packet-In消息

在由交换机发起的Asynchronous消息类型中,包含Packet-In消息,其格式如图5所示,该消息与Packet-Out类似,可以封装交换机上的指定数据包并发送至控制器做进一步处理。当交换机中的流表项无法匹配某个数据包时,会默认触发Packet-In消息。由于探测数据包通常与网络中的正常流量有所不同,因此基于OpenFlow的SDN主动测量可以利用Packet-In消息机制实现探测包的回收。

图5 OpenFlow1.3中Packet-In消息格式

测量拓扑

拓扑测量负责对网络中各个设备之间的链路关系进行定期的检测,并维护完整的网络拓扑,是控制器和上层应用实现对整个网络资源进行统一调度和管理的基础。在传统IP网络中,拓扑测量采用链路发现协议(LLDP)。LLDP报文格式如图6所示,其中包含了Chassis ID TLV(设备标示符),Port ID TLV(端口标示符)等字段,每个网络节点将自己和相邻设备的链路信息发送给其他节点,最终实现在各个网络设备上分散地测量链路信息。

图6 LLDP报文格式

目前,OpenFlow的拓扑发现协议(OFDP)依然沿用了LLDP协议,基于OpenFlow的Packet-Out和Packet-In消息测量拓扑,其采用了主动测量方式,原理如图7所示,基本思想如下:

(1)控制器构造包含LLDP数据包的Packet-Out消息下发至交换机S1,并指定从某端口转发至交换机S2,其中LLDP数据包中的Chassis ID TLV字段设置为交换机S1的Datapath ID,Port ID TLV字段设置为交换机目标转发端口。

(2)S2接收到LLDP数据包,触发Packet-In消息,将LLDP数据包发回控制器。

(3)控制器通过分析LLDP数据包,可以得到LLDP数据包在交换机S1上的发出端口和在交换机S2上的接收端口存在链接关系,从而获得一条链路信息。通过这种方式,控制器可以实现对整个网络的拓扑测量,发送的Packet-Out信息数量与网络中所有交换机活动端口的数量有关。

图7 基于Packet-Out和Packet-In消息测量拓扑原理图

测量时延

交换机之间传输时延是表明链路运行状态的重要参数。由于OpenFlow交换机不具备在正常传输的报文中打时间戳的功能,无法采用传统IP网络中的被动测量方式。因此,需要利用主动测量思想,在交换机之间生成并发送探测包。如图8所示,控制器的测量目标是交换机S1到交换机S2的时延,则控制器将探测包发送至S1,并下发规则指定S1将探测包发送至S2。S2接收到探测包后,由于没有对应的转发规则,会将探测包返回控制器,控制器则会计算出探测包在路径中传输的总时间。由于控制器和交换机之间的通信也存在时延,因此控制器还需要发送通信消息,获得控制器和各个交换机之间的消息往返时间,通过计算差值,获得最终的链路时延结果。

图8 基于Packet-Out和Packet-In消息测量时延原理图

因此,测量时延的详细步骤如下:

(1)获得探测包传输时间Ttravel:控制器生成探测数据包,其中包含交换机S1的目标转发端口和生成探测数据包时的时间戳,用来记录探测包的转发路径和发送探测包的时间。然后,控制器通过Packet-Out消息封装探测数据包,并下发至交换机S1,并从指定端口将探测包转发至S2。S2接收到数据包后,由于没有匹配的流表项,会触发Packet-In消息,将探测包封装并返回控制器。控制器通过对探测包的字段进行分析,可以得到探测包在“控制器一S1—S2一控制器”路径上的传输时间Ttravel。

(2)获得控制器和交换机的往返时间RTT:得到Ttravel后,还需要知道数据包控制器和交换机往返传输时间,从而计算得到控制器下发探测包以及交换机返回探测包的时延。根据OpenFlow协议,控制器生成Echo Request消息分别下发交换机S1和S2,并记录收到Echo Reply消息的时间,得到控制器和交换机的往返传输时间RTT

(3)计算交换机链路时延:根据上述测量结果,通过公式(4)计算得到交换机S1和S2之间的时延Tdelay。

0x04 参考



SDN     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!