分佈式理論 - 服務中可能出現的網絡異常

   網絡異常 

     分佈式服務節點間通過不可靠的網絡進行通信,可能出現以下幾種異常。

  • 消息丟失 

消息丟失是最常見的網絡異常。對於常見的 IP 網絡來說,網絡層不保證數據報文(IP fragment)的可靠傳遞,在發生網絡擁塞、路由變動、設備異常等情況時,都可能發生發送的數據丟失。由於網絡數據丟失的異常存在,直接決定了分佈式系統的協議必須能處理網絡數據丟失的情況。 依據網絡質量的不同,網絡消息丟失的概率也不同,甚至可能出現在一段時間內某些節點之間的網絡消息完全丟失的情況。如果某些節點的直接的網絡通信正常或丟包率在合理範圍內,而某些節點之間始終無法正常通信,則稱這種特殊的網絡異常爲“網絡分化”(network partition)。網絡分化是一類常見的網絡異常,尤其當分佈式系統部署在多個機房之間時。兩片節點之間彼此完全無法通信,即出現了“網絡分化”。 

  • 消息亂序 

消息亂序是指節點發送的網絡消息有一定的概率不是按照發送時的順序依次到達目的節點。通常由於 IP 網絡的存儲轉發機制、路由不確定性等問題,網絡報文亂序也是一種常見的網絡異常。這就要求設計分佈式協議時,考慮使用序列號等機制處理網絡消息的亂序問題,使得無效的、過期的網絡消息不影響系統的正確性。 

  • 數據錯誤 

網絡上傳輸的數據有可能發生比特錯誤,從而造成數據錯誤。通常使用一定的校驗碼機制可以
較爲簡單的檢查出網絡數據的錯誤,從而丟棄錯誤的數據。 

  • 不可靠的 TCP 

TCP協議爲應用層提供了可靠的、面向連接的傳輸服務。TCP協議是最優秀的傳輸層協議之一,其設計初衷就是在不可靠的網絡之上建立可靠的傳輸服務。TCP 協議通過爲傳輸的每一個字節設置順序遞增的序列號,由接收方在收到數據後按序列號重組數據併發送確認信息,當發現數據包丟失時,TCP 協議重傳丟失的數據包,從而 TCP 協議解決了網絡數據包丟失的問題和數據包亂序問題。TCP 協議爲每個 TCP 數據段(以太網上通常最大爲 1460 字節)使用 32 位的校驗和從而檢查數據錯誤問題。TCP 協議通過設置接收和發送窗口的機制極大的提高了傳輸性能,解決了網絡傳輸的時延與吞吐問題。TCP 協議最爲複雜而巧妙的是其幾十年來不斷改進的擁塞控制算法,使得 TCP 可以動態感知底層鏈路的帶寬加以合理使用並與其他 TCP 鏈接分享帶寬(TCP friendly)。 上述種種使得 TCP 協議成爲一個在通常情況下非常可靠的協議,然而在分佈式系統的協議設計中不能認爲所有網絡通信都基於 TCP 協議則通信就是可靠的。一方面,TCP 協議保證了 TCP 協議棧之間的可靠的傳輸,但無法保證兩個上層應用之間的可靠通信。通常的,當某個應用層程序通過TCP 的系統調用發送一個網絡消息時,即使 TCP 系統調用返回成功,也僅僅只能意味着該消息被本機的 TCP 協議棧接受,一般這個消息是被放入了 TCP 協議棧的緩衝區中。再退一步講,即使目的機器的 TCP 協議棧後續也正常收到了該消息,併發送了確認數據包,也僅僅意味着消息達到了對方機器的協議棧,而不能認爲消息被目標應用程序進程接收到並正確處理了。當發送過程中出現宕機等異常時,TCP 協議棧緩衝區中的消息有可能被丟失從而無法被目標節點正確處理。更有甚者,在網絡中斷前,某數據包已經被目標進程正確處理,之後網絡立刻中斷,由於接收方的 TCP 協議棧發送的確認數據包始終被丟失,發送方的 TCP 協議棧也有可能告知發送進程發送失敗。另一方面,TCP協議只能保證同一個 TCP 鏈接內的網絡消息不亂序,TCP 鏈接之間的網絡消息順序則無法保證。但在分佈式系統中,一個節點向另一個節點發送數據,有可能是先後使用多個 TCP 鏈接發送,也有可能是同時併發多個 TCP 鏈接發送,那麼發送進程不能認爲先調用 TCP 系統調用發送的消息就一定會先於後發送的消息到達對方節點並被處理。                                                                                                       由上述分析,在設計分佈系統的網絡協議時即使使用 TCP 協議,也依舊要考慮網絡異常,不能簡單的認爲使用 TCP 協議後通信就是可靠的。另一方面,如果完全放棄使用 TCP 協議,使用 UDP協議加自定義的傳輸控制機制,則會使得系統設計複雜。尤其是要設計、實現一個像 TCP 那樣優秀的擁塞控制機制是非常困難的

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