Multitracker Metadata Extension(多 Tracker 元数据擴展)是一種用於 BitTorrent 協議的元數據擴展,旨在提高多個 BitTorrent Tracker 之間協同工作的效率。該擴展允許 Torrent 文件包含來自多個 Tracker 的地址列表,並且客戶端可以使用這些地址來連接到任何可用的 Tracker 。這樣,如果一個 Tracker 處於離線狀態,客戶端仍然可以通過其他 Tracker 下載或分享文件。
與標準 BitTorrent 協議不同,Multitracker Metadata Extension 中包含了 Tracker 地址的列表,因此客戶端可以更快地找到活動的 Tracker 。這使得 Torrent 文件能夠更快速地開始下載,同時還能減輕單個 Tracker 的負載壓力。
元數據擴展#
BitTorrent 元數據文件中包括兩個鍵(key):一個是標準的 “announce” 鍵,另一個是新的 “announce-list” 鍵。這兩個鍵都用於指定可供客戶端使用的 BitTorrent tracker 伺服器的 URL 地址列表。
與 “announce” 鍵不同的是,”announce-list” 鍵引用的是一個嵌套列表(list of lists),其中每個內部列表都代表了一個 Tracker 伺服器的優先級別。這意味著客戶端會首先向第一個內部列表中的所有伺服器發送請求,如果它們都不可用或無響應,則依次嘗試下一個內部列表中的伺服器,直到找到可用的 Tracker 伺服器為止。
如果客戶端支持多 Tracker 規範,且元數據文件中同時存在 “announce” 和 “announce-list” 鍵,那麼客戶端將只使用 “announce-list” 中的 URL 地址列表,而忽略 “announce” 鍵中的地址。這樣做可以提高下載效率和可靠性,因為使用多個 Tracker 伺服器可以使下載任務更容易地找到其它對等節點並提高下載速度。
執行順序#
“announce-list” 鍵中的 URL 地址列表會按照優先級別(tiers)逐個處理,客戶端會按照優先級別逐個處理列表中的 URL 地址,而不是同時處理所有地址。在每個優先級別中,URL 地址會以隨機順序進行處理,這樣可以避免因為某些地址排在前面而導致下載速度過慢或失敗的情況。另外,如果客戶端與某個 Tracker 伺服器的連接成功,那麼該伺服器所在的優先級別會被移到列表的最前面,這樣可以提高與該伺服器通信的概率,並加快下載速度。
例:
d['announce-list'] = [ [tracker1], [backup1], [backup2] ]
當發生 “announce” 事件時,建議首先嘗試連接到 “tracker1” 。如果連接失敗(可能是因為 tracker 不可用),則應嘗試連接到 “backup1”,如果還是失敗,則嘗試 “backup2” 。下一次發布公告時,應重複相同的嘗試順序 — 首先嘗試 “tracker1”,然後是 “backup1”,最後是 “backup2”,如有必要。採用這種方法的原因似乎與不同跟踪器無法彼此共享信息有關。通過每次按照相同的順序嘗試連接到每個跟踪器,系統可以確保始終首選嘗試連接到最優先的跟踪器,同時仍然具備備選選項,以防該跟踪器不可用。
d['announce-list'] = [[ tracker1, tracker2, tracker3 ]]
首先,假設一個 tracker 列表已經被打亂。當客戶端需要連接到 tracker 時,會按照以下順序嘗試連接:
- 首先嘗試連接 “tracker1” 。
- 如果無法連接 “tracker1”,則嘗試連接 “tracker2” 。
- 如果能夠連接 “tracker2”,則將追蹤器列表重新排列為 “tracker2,tracker1,tracker3”,並以此順序進行後續連接嘗試。
- 如果無法連接 “tracker2” 或 “tracker1”,但是能夠連接 “tracker3”,則將追蹤器列表重新排列為 “tracker3,tracker2,tracker1”,並以此順序進行後續嘗試。
Tracker 之間的負載均衡策略。這種方法可以讓客戶端和 tracker 之間相互交換信息,從而實現負載均衡,避免某個 tracker 過載而導致整個系統性能下降。
d['announce-list'] = [ [ tracker1, tracker2 ], [backup1] ]
過程中系統分為三個層級:tracker1 、 tracker2 和 backup1 。第一層包括 tracker1 和 tracker2,它們的順序可能是隨機的。當發生 “announce” 事件時,系統會按照某種順序(每次事件可能的順序不同)嘗試連接到 tracker1 和 tracker2,然後才會嘗試使用 backup1 。換句話說,在嘗試使用 backup1 之前,系統會先嘗試連接 tracker1 和 tracker2 。