Peers

為什麼比特幣不使用 UDP 進行 Blockpropagation?

  • September 25, 2018

比特幣使用 TCP 進行 P2P,但為什麼不使用 UDP?現代網際網路的丟包率相對較低,因此 UDP 是可靠的。即使某些數據包被丟棄,對等方也始終可以請求塊。使用 TCP,網路是相當靜態構造的,而 UDP 您可以在每次將塊作為無連接傳播時構造一個隨機圖。

NANO 使用 UDP,我認為這是一個很好的方法。我只是好奇我是否遺漏了什麼。自舉顯然可以使用 TCP 來完成

比特幣系統不只有一個網路協議:任何獲取區塊的方式都是同樣有效的——通過自由網、衛星廣播、P2P 網路的區塊,所有這些都可以正常工作並在實踐中使用。通過光纖協議,UDP 也與比特幣一起使用。

就常見的比特幣 P2P 協議而言,UDP 並不是特別適合它執行的大多數操作。比特幣需要可靠地發送比 IP 數據包大得多的消息,例如交易和區塊。儘管網際網路是“可靠的”,但 1-3% 的丟包率很常見。這意味著任何需要與 UDP 通信大消息的應用程序都必須實現打包、重傳、重新排序等——與 TCP 已經為我們實現的東西相同。許多在使用者空間中“推出了自己的 TCP”的應用程序最終都存在可利用的錯誤,因此這不是應該在沒有正當理由的情況下進行的事情。

UDP 還存在 NAT 穿越問題:使用 UDP 通過 NAT 進行雙向通信並不是一件簡單的事情。跨越比完整的錐形 nat 更複雜的任何東西都需要大量的特殊程式碼,但如果沒有它,將會有許多主機無法使用 UDP 與其他對等方通信。

您提到無連接允許您中繼到網路中的隨機主機,但在比特幣 P2P 中,我們利用節點之間的一致關係來使網路更加可靠和高效。節點知道他們的同伴已經知道什麼,並且可以避免向他們發送冗餘數據。節點還知道哪些節點過去向它們發送塊的速度最快,並專門處理它們。同樣,即使協議是無連接的,通過優先處理來自現有對等方的消息來處理來自對等方的消息也是有成本的,比特幣減少了某些類型的 DOS 攻擊的影響。處理大於一個數據包的消息、重傳等也意味著即使使用無連接傳輸,仍然需要某種持久狀態。

但是如果實現確實想要隨機連接以發送消息,則需要額外的費用是握手的幾次往返。甚至不是這樣:P2P 網路中只有大約 10,000 個可訪問節點,如果保留的所有狀態都只是 TCP,那麼保持與每個節點的大部分空閒 TCP 連接不會有太大挑戰狀態。因此,就這一點而言,UDP 的使用充其量只是對已經完成但尚未完成的事情的優化。我認為在擔心優化之前先證明擁有所有這些連接的有用性會更有趣。

那麼為什麼 UDP 傳輸對比特幣 P2P 協議有用呢?

  • 為了獲得盡可能低的延遲塊傳輸,即使面對排除 TCP 的封包遺失,也必須沒有往返,這就是 Fiber 使用 UDP 的原因。但是為了不發生往返,協議必須能夠在不重新傳輸的情況下處理失去,並且為了獲得低延遲,一個塊必須是可解碼的,並且接收到的數據量最少。這需要非常複雜的糾錯技術,這是一個不斷發展的領域,尚未成熟到足以考慮將其納入主流。只要有少量主機使用光纖,它的延遲優勢也存在,因為它承擔了在全球範圍內獲取塊的繁重工作。往返不會對低延遲連結造成太大傷害。而且這種延遲問題僅適用於塊中繼。
  • 與 TCP 不同,UDP 需要一些 NAT 遍歷處理才能簡單地進行雙向通信。但結合完整的 nat 遍歷處理,UDP 通常能夠在不同 NAT 後面的主機之間建立通信。這可能對比特幣 P2P 網路有所幫助,因為大多數主機在 nat 之後都無法訪問。因此,具有諷刺意味的是,UDP 的挑戰之一也是它的用途之一。但是,要連接都位於網路後面的主機,需要第三方非 nat 主機的幫助以及更多的 NAT 遍歷程式碼。考慮到遍歷的複雜性,改進比特幣對 TCP 埠映射的支持(例如實現 NAT-PMP)可能是目前更好的投資回報。
  • 使用 UDP 將允許“最壞而不是盡力而為”的流量處理。對於像同步區塊鏈這樣的低優先級“批量流量”,如果流量小心地塑造自己以避免干擾網路上的其他流量,那就太好了。LEDBAT等替代擁塞控制算法可以以最小的影響傳輸低優先級數據。但是由於 TCP 堆棧通常還不支持這些擁塞控制方法,因此需要它們的應用程序目前需要實現自己的傳輸。對於比特幣,如果我們可以只翻轉一個套接字選項並在現有連接上打開和關閉 LEDBAT(例如,當對等方請求歷史塊時,或者將來節點使用諸如 Fiber 之類的東西來中繼新塊時,那將是理想的) 但那不是

[這最後兩個原因是Bittorrent通常使用UDP的原因]

引用自:https://bitcoin.stackexchange.com/questions/79167