計算機網絡的受攻擊能力分析

計算機網路可以看作無向圖,我以其中最大的連接體的大小來衡量網絡的能力。實際上,攻擊網絡,也就是把網絡分割成一個一個的小連接體。

源代碼: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:[email protected]







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章