BitTorrent 的本地服務(wù)發(fā)現(xiàn)機(jī)制

本地服務(wù)發(fā)現(xiàn)機(jī)制 Local Service Discovery (LSD) 提供類(lèi)似于 SSDP 的機(jī)制(通過(guò) UDP 多播的 HTTP 協(xié)議),向本地鄰居宣告其在特定群組中的存在。這樣能夠讓其他本地設(shè)備知道該設(shè)備提供了哪些服務(wù),從而方便彼此之間的通信和數(shù)據(jù)傳輸。這個(gè)機(jī)制可以作為本地傳輸?shù)闹饕獙?duì)等方來(lái)源,也可以用來(lái)補(bǔ)充其他僅在全局單播地址上運(yùn)行的來(lái)源。
協(xié)議
LSD 使用以下多播組:A)?239.192.152.143:6771?(org-local) and?B)?[ff15::efc0:988f]:6771?(site-local) 。
實(shí)施注釋?zhuān)河捎诙嗖ソM比本地局域網(wǎng)更廣泛,因此可能需要將 IP_MULTICAST_TTL 套接字選項(xiàng)設(shè)置為一個(gè)大于默認(rèn)值的值。
LSD 協(xié)議的 announce 消息格式:
? ? ?BT-SEARCH * HTTP/1.1\r\n
? ? ?Host: <host>\r\n
? ? ?Port: <port>\r\n
? ? ?Infohash: <hash>\r\n
? ? ?cookie: <cookie (optional)>\r\n
? ? ?\r\n
? ? ?\r\n
host
Host 需要同時(shí)滿足 RFC 2616 section 14.23 和 RFC 2732 的規(guī)范要求,用于指定 announce 消息發(fā)送到的組播組地址。
RFC 2616 是 HTTP/1.1 的規(guī)范文件,它定義了一系列關(guān)于 HTTP 協(xié)議的信息。其中,section 14.23 描述了 Host 頭部的格式。 Host 頭部用于指定請(qǐng)求的目標(biāo)服務(wù)器的主機(jī)名和端口號(hào)。而 RFC 2732 則是一個(gè) URL 的標(biāo)準(zhǔn),它允許使用 IPv6 地址來(lái)表示 URL 中的主機(jī)名。這意味著在 LSD 協(xié)議的 Host 頭部中,可以使用 IPv6 地址來(lái)表示組播組的地址。
port
這個(gè)字段指定了 bittorrent 客戶端正在監(jiān)聽(tīng)的端口號(hào),以 base-10 ASCII 編碼表示。
hash
這個(gè)字段是一個(gè) 40 位的十六進(jìn)制編碼的 infohash 值,用于唯一標(biāo)識(shí)一個(gè)種子文件。
當(dāng)發(fā)送多個(gè) infohashes 時(shí),需要注意盡量避免數(shù)據(jù)包長(zhǎng)度超過(guò) 1400 字節(jié),以避免?MTU/分片?問(wèn)題。因?yàn)樵诰W(wǎng)絡(luò)傳輸過(guò)程中,如果數(shù)據(jù)包長(zhǎng)度超過(guò) MTU(最大傳輸單元)的大小,就會(huì)發(fā)生 IP 分片,導(dǎo)致網(wǎng)絡(luò)傳輸效率降低和數(shù)據(jù)包丟失的風(fēng)險(xiǎn)增加。
cookie
不透明的值,這個(gè)值對(duì)客戶端來(lái)說(shuō)是完全未知和不可見(jiàn)的,因此它只需要被發(fā)送給客戶端,而不需要進(jìn)一步解釋。該值的作用是允許發(fā)送客戶端在接收到自己發(fā)送的 announce 請(qǐng)求時(shí)進(jìn)行過(guò)濾,以避免重復(fù)處理。
任何客戶端不理解的額外頭部信息都應(yīng)該被忽略,以確保前向兼容性。
實(shí)現(xiàn)
首先,如果一個(gè)客戶端正在參與一個(gè) swarm,那么它應(yīng)該每隔 5 分鐘在每個(gè)接口上發(fā)送一個(gè) LSD announce,以便其他客戶端可以知道它的存在并連接到它。為了避免在大型網(wǎng)絡(luò)中引起組播風(fēng)暴,客戶端每分鐘最多只能發(fā)送一次通告。
其次,如果一個(gè)客戶端正在同時(shí)進(jìn)行 5 個(gè)以上的 torrent 下載或上傳,那么它可以選擇輪流在其中的每個(gè) torrent 上發(fā)送通告,也可以在單個(gè)通告中包含多個(gè) infohashes(區(qū)分不同 torrent 的哈希值)。這樣其他客戶端可以使用這些信息來(lái)建立與客戶端的連接。
當(dāng)一個(gè)客戶端接收到另一個(gè)客戶端的 LSD 通告時(shí),它需要根據(jù) UDP 源地址來(lái)確定如何聯(lián)系遠(yuǎn)程客戶端的 IP 地址。
總結(jié)
在 BitTorrent 協(xié)議中,Local Service Discovery (LSD) 是一種本地服務(wù)發(fā)現(xiàn)機(jī)制,用于發(fā)現(xiàn)局域網(wǎng)內(nèi)的其他 BitTorrent 客戶端。當(dāng)一個(gè) BitTorrent 客戶端啟動(dòng)時(shí),它會(huì)通過(guò) LSD 廣播自己的存在,并接收來(lái)自其他客戶端的廣播信息,從而建立起點(diǎn)對(duì)點(diǎn)的連接。
LSD 通過(guò)使用 UDP 多播方式,在局域網(wǎng)內(nèi)快速地發(fā)現(xiàn)其他客戶端。同時(shí),LSD 還可以與其他本地服務(wù)發(fā)現(xiàn)協(xié)議(如 mDNS)結(jié)合使用,進(jìn)一步提高對(duì)局域網(wǎng)內(nèi)設(shè)備的發(fā)現(xiàn)效率。
LSD 是 BitTorrent 協(xié)議中的一個(gè)重要組成部分,它可以加速 P2P 下載過(guò)程中的節(jié)點(diǎn)發(fā)現(xiàn),提高文件下載的速度和穩(wěn)定性。
參考鏈接
http://www.bittorrent.org/beps/bep_0014.html