兩行代碼,教你輕松屏蔽B站直播網(wǎng)頁P(yáng)2P上傳
很早之前,筆者使用瀏覽器觀看各平臺(tái)直播時(shí),無意中發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象:有時(shí)候,某些網(wǎng)站的直播頁面在占用下行帶寬的同時(shí),還會(huì)持續(xù)占用大量上傳帶寬,且上傳速率和下載速率相近。我們知道,觀看直播時(shí)需要不斷從服務(wù)器獲取視頻流和彈幕,持續(xù)占用下載帶寬是正?,F(xiàn)象,且下載帶寬的占用量往往和畫質(zhì)、幀率等成正比;而作為觀看直播的普通用戶,網(wǎng)頁對上傳帶寬的占用應(yīng)該是微乎其微。長時(shí)間占用如此多的上行帶寬顯然有悖于常理。
但這個(gè)現(xiàn)象的出現(xiàn)似乎并非必然,而且上傳帶寬的占用情況也并不總是一成不變,因而沒有太過在意。咨詢網(wǎng)站客服,得到的解釋是:“親,這是觀看直播時(shí)的正?,F(xiàn)象呢?~~~///(^v^)\\\~~~”,遂放任不管之...
隨著時(shí)間推移,這個(gè)現(xiàn)象越來越明顯,往往前腳剛打開直播房間頁面,沒過十幾秒,上傳帶寬馬上就占用起來,而在上傳帶寬巨額占用現(xiàn)象發(fā)生的十幾秒之前,直播觀看完全正常,并沒有出現(xiàn)畫面中斷。也就是說,這個(gè)上傳占用并不是觀看直播所必需的。沒有這個(gè)夸張的上傳行為,我們應(yīng)該依然可以正常觀看直播。由此懷疑,這可能是某種P2P行為。
什么是P2P?我們在使用迅雷等軟件下載文件的時(shí)候,經(jīng)常會(huì)遇到這個(gè)詞匯。Peer To(2) Peer,顧名思義,是點(diǎn)對點(diǎn)、個(gè)人對個(gè)人的意思。P2P下載技術(shù),就正是一種用戶到用戶的下載方式。P2P下載文件之所以往往比普通下載速度快,除開軟件本身的性能和VIP等因素影響之外,最重要的是:把普通用戶的電腦(終端)當(dāng)作了其他用戶的服務(wù)器。
“當(dāng)作其他用戶的服務(wù)器”是什么意思?舉個(gè)例子:
A用戶使用支持P2P功能的下載器,從某個(gè)加載速度十分緩慢的網(wǎng)站上費(fèi)了九牛二虎之力下載了一份文件,但下載完成后,該用戶并沒有關(guān)閉下載器,而是將其放在了后臺(tái)運(yùn)行。
不久,B用戶打開了同款下載器,準(zhǔn)備從相同的網(wǎng)站下載相同的文件。正常思路下,下載器應(yīng)該會(huì)從網(wǎng)站的服務(wù)器上下載這個(gè)文件。但如果A用戶和B用戶同時(shí)開啟了P2P文件傳輸功能,那么這個(gè)下載器就可能會(huì)把A用戶的電腦當(dāng)作服務(wù)器,從A用戶電腦上下載這個(gè)文件。
于是,B用戶很可能會(huì)發(fā)現(xiàn):相比于不開啟P2P功能的情況下,文件的下載速度飛速提升,往常需要幾分鐘的下載,現(xiàn)在只需要不到一分鐘甚至十幾秒就可以完成下載。B用戶對此下載器的表現(xiàn)感到十分滿意,給出了五星好評。欣喜之余,B用戶把這款軟件推薦給了自己的N位小伙伴。
在B用戶的大力推薦下,其他小伙伴紛紛開始使用這款下載器,在打開了P2P下載功能后,開始陸續(xù)下載文件。
緊接著A用戶發(fā)現(xiàn),自己的電腦風(fēng)扇往往無緣無故地狂轉(zhuǎn),CPU和網(wǎng)絡(luò)(上傳)帶寬占用率被頻頻大量占用,顯著影響到了A用戶的日常使用體驗(yàn)。經(jīng)過一番排查,A用戶把源頭定在了下載器軟件本身上,憤怒之余給出了一星差評,并發(fā)誓再也不用此款軟件。
上述例子就能很大程度上概括出P2P網(wǎng)絡(luò)傳輸?shù)奶攸c(diǎn):用戶既可以是受益者,也可以是無償奉獻(xiàn)者。作為下載數(shù)據(jù)的受益者,用戶的下載速度、網(wǎng)絡(luò)延遲等可以得到很大改善;而作為提供數(shù)據(jù)、充當(dāng)服務(wù)器的奉獻(xiàn)者,用戶的計(jì)算機(jī)CPU、內(nèi)存、網(wǎng)絡(luò)等資源也往往會(huì)被大量占用。這對于計(jì)算機(jī)性能本身較差、網(wǎng)絡(luò)帶寬較小的用戶來說,無疑會(huì)造成顯著的負(fù)面影響。
而B站直播頁面使用的P2P與此思路基本一致:直播網(wǎng)站出于節(jié)省自己服務(wù)器資源和網(wǎng)絡(luò)帶寬、降低運(yùn)營成本等考慮,使用這類技術(shù)來把直播觀眾的手機(jī)電腦等當(dāng)成一個(gè)個(gè)小型服務(wù)器,讓其他觀眾連到這些小型服務(wù)器上去(而不是直接連到直播網(wǎng)站的服務(wù)器上),從而利用觀眾的硬件和網(wǎng)絡(luò)資源分擔(dān)了自己的運(yùn)營負(fù)擔(dān)。

話已至此,想必各位已經(jīng)對此類P2P技術(shù)有了初步的認(rèn)知。那么問題自然擺在眼前:既然B站明面否認(rèn)使用了此類技術(shù),也就代表著用戶無法通過常規(guī)設(shè)置關(guān)閉P2P功能。既然如此,如何才能徹底關(guān)閉P2P功能呢?
首先筆者想到的是按照網(wǎng)絡(luò)傳輸?shù)膮f(xié)議類型進(jìn)行識(shí)別+攔截。打開Wireshark軟件進(jìn)行網(wǎng)絡(luò)抓包,一段時(shí)間后果然發(fā)現(xiàn)了異常的流量。網(wǎng)上查詢相關(guān)信息發(fā)現(xiàn),這些使用名為STUN協(xié)議的數(shù)據(jù),正是P2P功能占用上傳帶寬傳輸?shù)臄?shù)據(jù)。

那么使用某種方式,按照協(xié)議類型進(jìn)行攔截是否可取?理論上可行,但這往往需要借助其他第三方軟件進(jìn)行攔截。如果使用的設(shè)備不止一臺(tái),則需要在每臺(tái)設(shè)備上都安裝相應(yīng)的攔截軟件,費(fèi)時(shí)費(fèi)力,并不討好。而且這樣操作的靈活性較差,如果無腦攔截所有STUN流量,可能還會(huì)誤傷其他軟件的功能。至于能實(shí)現(xiàn)這種攔截操作的軟件...如果有推薦,歡迎在評論區(qū)留言。
轉(zhuǎn)換思路。筆者想到,自己平日以PC端網(wǎng)頁版使用較多,應(yīng)該可以通過分析網(wǎng)頁的內(nèi)容,攔截相應(yīng)的腳本或破壞相應(yīng)的代碼。但B站的JS腳本絕大多數(shù)都經(jīng)過壓縮,并沒有辦法直接對源代碼進(jìn)行操作。深入研究P2P功能的實(shí)現(xiàn)代碼發(fā)現(xiàn),B站的P2P功能需要用到某些特定的函數(shù),因而可以通過在Tampermonkey中掛載用戶自定義腳本,在網(wǎng)頁加載完畢后自動(dòng)刪除相應(yīng)的函數(shù),從而破壞P2P功能。下圖摘自其他網(wǎng)站的論壇,代碼內(nèi)容不再贅述。

那么這種方法是否可行?答案自然是肯定的,但缺點(diǎn)也比較顯著。用戶仍然需要在每臺(tái)設(shè)備上安裝Tampermonkey插件,手動(dòng)添加相應(yīng)的腳本,工作量較大。而且這種方法只適用于網(wǎng)頁端,對于App端和不能安裝油猴插件的瀏覽器則無能為力。
分析到這里,難道就沒有更好的思路的嗎?答案當(dāng)然也是否定的。我們調(diào)轉(zhuǎn)方向,轉(zhuǎn)而研究STUN協(xié)議本身的實(shí)現(xiàn)方式。通過網(wǎng)上資料的查詢得知,該協(xié)議的實(shí)現(xiàn)往往需要一臺(tái)“中介”服務(wù)器:兩臺(tái)客戶端要想成功建立P2P連接,常常需要各自向服務(wù)器建立連接、提供自己的網(wǎng)絡(luò)和設(shè)備信息,然后再由服務(wù)器進(jìn)行“拉線搭橋”,讓雙方彼此連接配對。如果能阻止客戶端聯(lián)系“中介”服務(wù)器,不就可以從根源上阻止P2P功能了嘛!再次打開Wireshark進(jìn)行抓包,對相關(guān)數(shù)據(jù)進(jìn)行仔細(xì)分析后,成功找到了相應(yīng)的數(shù)據(jù)包:

按理說成功找到了目標(biāo),自然應(yīng)該是皆大歡喜。但喜悅之余不免發(fā)現(xiàn),中介服務(wù)器的域名不止一個(gè),而且往往含有不同的字母拼寫和數(shù)字編號(hào),將其一一加入hosts黑名單或者Adblock屏蔽列表顯然會(huì)成為一項(xiàng)艱巨的工作,而且隨時(shí)間推移,這些域名可能還會(huì)繼續(xù)增加,從而產(chǎn)生更多的“漏網(wǎng)之魚”。

機(jī)智的觀眾此時(shí)也許會(huì)立即搶答:上圖中的域名都有相同的部分(.chat.bilibili.com),直接用正則匹配過濾掉不就可以了嗎?對,但并不完全對。不管怎么說,先試一試。以網(wǎng)頁端為例,打開Adblock-選項(xiàng)-高級,在“我的過濾列表”中添加相應(yīng)的過濾規(guī)則。

如果此時(shí)興沖沖地刷新直播房間的網(wǎng)頁,你會(huì)欣喜地看到:任務(wù)管理器里的網(wǎng)絡(luò)占用已經(jīng)回到正常水平。

于是你認(rèn)為,問題已經(jīng)得到了圓滿的解決。但持續(xù)觀看直播一段時(shí)間后,你會(huì)同樣成功地發(fā)現(xiàn):彈幕不見了!打開F12開發(fā)人員工具,看到大量紅色報(bào)錯(cuò)。仔細(xì)觀察篩選,發(fā)現(xiàn)用于獲取彈幕信息的WSS連接出現(xiàn)了問題,而WSS的連接域名與P2P中介服務(wù)器的域名恰好相同。

再仔細(xì)觀察,發(fā)現(xiàn)彈幕的請求URL地址稍有不同,域名后多了一個(gè)/sub目錄。借此想到,如果可以在Adblock中添加一條更為詳細(xì)的白名單規(guī)則,就可以放行彈幕流量。查詢官方文檔后,添加了如下一條規(guī)則,成為下圖所示。

再次打開直播頁面測試,發(fā)現(xiàn)控制臺(tái)不再有彈幕報(bào)錯(cuò),彈幕恢復(fù)正常,同時(shí)P2P流量消失,至此任務(wù)達(dá)成。按照此思路,若能將相應(yīng)的屏蔽規(guī)則直接寫進(jìn)路由器的攔截列表中,從而達(dá)到一次配置、全網(wǎng)通用的簡并目的,豈不美哉!