您的位置:首页 > 理论基础 > 计算机网络

计算机网络的受攻击能力分析

2014-09-14 21:02 316 查看
计算机网路可以看作无向图,我以其中最大的连接体的大小来衡量网络的能力。实际上,攻击网络,也就是把网络分割成一个一个的小连接体。

源代码:https://github.com/gt11799/computer_network_analyse

首先是广度优先搜索网络(BFS):

def bfs_visited(ugraph, start_node):
visited = set([start_node])
tovisit = deque([start_node])
while tovisit:
node = tovisit.popleft()
for item in ugraph[node]:
if item not in visited:
visited.add(item)
tovisit.append(item)
return visited
然后是找出其中的连接体(Connected Component):

def cc_visited(ugraph):
remain_node = ugraph.keys()
cc_set = []
while remain_node:
node = remain_node.pop()
visited = bfs_visited(ugraph, node)
cc_set.append(visited)
remain_node = [item for item in remain_node if item not in visited]
return cc_set
然后就是衡量网络能力的最大连接体大小了。

def largest_cc_size(ugraph):
cc_set = cc_visited(ugraph)
try:
return max([len(item) for item in cc_set])
except(ValueError):
return 0
实际上我只用一行代码就可以找出最大值。:D

怎么攻击一个网络呢?我输入一个列表,依次删除其中的node,看看每删除一个node,网络的能力是多少。注意这里的攻击是累加的。

def compute_resilience(ugraph, attack_order):
result = [largest_cc_size(ugraph)]
ugraph_attack = dict(ugraph)
for item in attack_order:
ugraph_attack.pop(item)
for node in ugraph_attack:
try:
ugraph_attack[node].remove(item)
except(KeyError):
pass
result.append(largest_cc_size(ugraph_attack))
return result
怎么决定攻击的顺序呢?我们找出其中的两种方式,一种是随机攻击,另一种是从最重要的node开始攻击。node的重要性以degree的大小去衡量。

随机攻击:

def random_order(ugraph):
    nodes = ugraph.keys()
    random.shuffle(nodes)
    return nodes
从最重要的node开始攻击:

<pre name="code" class="python">def targeted_order(ugraph):
new_graph = copy_graph(ugraph)
order = []
while len(new_graph) > 0:
max_degree = -1
for node in new_graph:
if len(new_graph[node]) > max_degree:
max_degree = len(new_graph[node])
max_degree_node = node

delete_node(new_graph, max_degree_node)
order.append(max_degree_node)
return order



这样我们就可以准备攻击一个网络了。在源代码中,有一个compute_network.txt文件,里面存放着一个字典,实际上就是一个计算机网络。为了体现计算机网络的能力,我们还拉来了两个陪客:ER_ugraph, UPA_ugraph。

ER是用固定的概率去判定Edge的存在,因此符合正态分布,从整个网络看来,整个网络的重要性是均匀的。

UPA是给定一个比nodes数小的M,然后第M+1个node从M中抽取M个,第M+2个node从M+1抽取M个,依此类推。由于Edge是双向的,所以整个网络主要集中在前面那些node上。

具体实现看源代码,这里就不贴了。

随机攻击:



从最重要的node开始攻击:



可以得出这样几个结论:

1.攻击网络中重要的节点是更有效的攻击方式

2.均匀网络(正态分布)的受攻击性(适应能力)更强

3.让网络集中在某些大节点上不是一种明智的做法。

但是,是不是网络的分布要尽可能的均匀呢?

在凯文凯利的书中是这样描述网络的:当一个节点断开,数据会自动选择别的路径,使整个网络不受影响。而由于不停的有新的节点加入进来,或者一些旧有的节点之间产生了新的连接,网络看起来就像是自我修复了一样。

这样看起来,网络最好还是均匀分布,也就是说,网络的连接是个体与个体之间的自由连接。这样当网络受到攻击时,基本不会遭受大的影响,甚至可以说,这样的网络无法击垮。(听起来像天网)

但是以上是基于理想的状态下的,就目前而言,互联网并不是那么的发达,可以让一个个体(小集体中心亦是)产生如此多的连接。

其次,均匀分布的网络使得个体访问一个节点的路径赠长。如果网络不够发达(比如现在),网络的相应就会很慢。

反向看来,网络如果集中在某些大节点上,只要保护好这些大节点,网络的稳定性就不会受太大影响。在个体看来,就是只要我上的去谷歌、百度,网络对我而言就没有瘫痪。

不过,去中心化的趋势会一直在。网络会从目前的几百个大节点变成几百万个大节点,把每个小网络看作一个节点,节点之间的连接将四通八达。比如中国与美国这两个大网络之间的连接将不再是可以数得清的海底光缆,而是无数的链路,是计算不出来的拓扑,到时候墙恐怕就做不起来了。

————————————

github主页:https://github.com/gt11799

E-mail:gting405@163.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: