當一個節點連接到另一個節點時,連接節點如何知道它連接的實際上是一個種子(並且包含所有的節點)?他們之間是否有消息發送?對等體如何知道另一個對等體是種子?
在像uTorrent這樣的客戶端中,對等方似乎也意識到它所連接的每個對等方的下載進度。 它是如何知道這一切的?如果進度爲100%,或者實際上是否存在特定的消息,對等體是否推導出另一個對等體是種子?協議的哪些部分處理所有這些?
當一個節點連接到另一個節點時,連接節點如何知道它連接的實際上是一個種子(並且包含所有的節點)?他們之間是否有消息發送?對等體如何知道另一個對等體是種子?
在像uTorrent這樣的客戶端中,對等方似乎也意識到它所連接的每個對等方的下載進度。 它是如何知道這一切的?如果進度爲100%,或者實際上是否存在特定的消息,對等體是否推導出另一個對等體是種子?協議的哪些部分處理所有這些?
對等知道,如果另一對等端是種子如果其它對等任一:
發送一個完全完成bitfield
表明它擁有所有在湍急的碎片。 - BEP3
發送一個不完整的bitfield
,然後所有的have
消息爲它從一開始就沒有的其餘部分。 (這可以是它不斷下載並完成torrent 或,它發送lazy bitfield
。) - BEP3
根據Extension for Partial Seeds - BEP21
偏種子發送upload only=1
發送have all
消息意味着對等體已經下載了僅洪流的部分和不希望下載更多,並播種它有什麼。
對方通過不斷髮送have
消息報告其進展。
這部分協議被稱爲對等線協議。
根據bittorent protocol specification:
對等協議指的是通過索引文件的片斷在元信息文件描述 ,起始於零。當同伴完成 下載一個片段並檢查該哈希匹配時,它宣佈 它已將該片段發送給其所有同伴。
然後,是的,消息由同伴交換,所以他們可能知道什麼是可供下載。處理這個問題的協議「部分」是對等協議。
正如您在the spec中看到的那樣,客戶應該交換bitfield
消息來告訴其他他們當前擁有哪些部分。當對方接收到更多片段時,常規的have
消息稍後會更新此消息(無論如何,這是直接的描述,現實更加複雜,稍後更多)。
這是通過廣泛支持的Fast Extension修改的,其中對等體可以將完全完全和全空的位域消息壓縮到have all
和have none
。
它也被Superseeding修改,其中種子是關於它們的部分,以便更有效地播種初始羣。一般情況下,同伴總是可以說謊,尤其是他們可以假裝沒有他們真正做的東西,而且你永遠不會知道。
這讓我回到了更加混亂的現實。如果你告訴他們你有x
,同事可以選擇不發送have x
,因爲它是否會向你請求x
(你不會,因爲你已經擁有了)。另一方面,這對於一些優化是不利的,例如優先考慮稀有片段的上傳,並且特別是取代超過。