哎呀!如何解决 POX SDN 控制器上的循环问题?

Oops! How to solve looping issue on POX SDN controller?

我正在尝试计算每个源地址给出从 PACKET_IN 消息派生的特定目标 IP 的概率。为此,我首先使用 DataFrame 重新组合这些地址,然后使用嵌套循环来处理不同的出现概率。该代码确实适用于 IDE,但是,它在控制器上提供了不同的输出。我的代码中的循环语句似乎有问题,你能帮帮我吗?

您可以使用 pandas 的 split-apply-combine 功能消除循环。

首先,让我们通过创建一个整数 src/dst.

的数据框来抽象掉问题的 "pox" 部分
import pandas as pd
import numpy as np
src = np.trunc(np.random.uniform(0, 5, size=1000))
dst = np.trunc(np.random.uniform(0, 3, size=1000)) + src
df = pd.DataFrame({'dst': x, 'src': y})

所以在这个例子中,src 和 dst 是相关的。要获得频率计数,可以使用单行

df.groupby('dst').src.value_counts()

产生如下内容。

dst  src
0.0  0.0    71
     2.0    68
     1.0    45
1.0  3.0    80
     2.0    76
     1.0    60
2.0  4.0    84
     3.0    61
     2.0    56
3.0  3.0    90
     4.0    58
     5.0    50
4.0  4.0    71
     6.0    67
     5.0    63

这会为您提供每个 src/dst 对的原始计数。您可以通过两次使用 groupby 对象将其转换为给定单个 dst 时每个 src 出现的时间分数:一次像上面那样计算每个 src/dst 的频率,一次计算每个 dst 的频率。

g = df.groupby('dst')
g.src.value_counts() / g.size()

这会产生类似

的结果
dst  src
0.0  0.0    0.385870
     1.0    0.244565
     2.0    0.369565
...
4.0  4.0    0.353234
     5.0    0.313433
     6.0    0.333333

如果您不将 DataFrame 用于其他用途,则可以使用 itertools.groupby by converting the string ip addresses to ipaddress objects 以便对它们进行排序。

import ipaddress, itertools

ipList_Dst = ['10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2',
              '10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2',
              '10.0.0.2', '10.0.0.2', '10.0.0.2', '10.0.0.2']
ipList_Src = ['70.240.175.230', '243.41.191.23', '18.191.71.228',
              '62.95.69.19', '167.31.217.139', '30.63.153.99',
              '74.88.164.220', '135.131.110.167', '59.237.249.54',
              '34.24.183.147', '21.201.47.164', '167.31.217.139']

dst = map(ipaddress.ip_address,ipList_Dst)
src = map(ipaddress.ip_address,ipList_Src)
pairs = sorted(zip(dst, src))

for key,group in itertools.groupby(pairs):
    print([str(addr) for addr in key])

groupby 对象的每个 key 将是一个独特的 (dst,src) 组合。