作者:樂昂霖,單位:中國移動智慧家庭運營中心
隨著學(xué)術(shù)交流、即時游戲、移動端實時音頻等高度依賴網(wǎng)絡(luò)使用的場景愈發(fā)豐富,對網(wǎng)絡(luò)在不同場景下的加速需求催生了場景寬帶。從本質(zhì)上來說,場景寬帶就是為普通的網(wǎng)絡(luò)提供了一系列加速服務(wù),本文將淺談網(wǎng)絡(luò)加速服務(wù)需求出現(xiàn)的底層原因。
Part 01●??QoS服務(wù)?●
國內(nèi)的運營商網(wǎng)絡(luò)一般都會提供QoS。QoS指的是網(wǎng)絡(luò)利用各種基礎(chǔ)技術(shù),以提供更好的服務(wù)能力來支持特定的網(wǎng)絡(luò)通信。它是一種網(wǎng)絡(luò)安全機制,旨在解決網(wǎng)絡(luò)延遲和阻塞等問題。簡單來說,當(dāng)網(wǎng)絡(luò)擁堵時,運營商會優(yōu)先處理重要的流量包,而將一些不重要的包丟棄。具體丟棄哪些包則取決于使用場景和運營商的策略。
對于受到QoS限制的用戶而言,可能會出現(xiàn)以下表現(xiàn):網(wǎng)速降低、丟包、ping值不穩(wěn)定。在這種情況下,細分場景用戶往往希望進一步獲取更好的網(wǎng)絡(luò)質(zhì)量以滿足場景使用,例如更高的帶寬、更少的丟包和更低的延遲。
需要注意的是,QoS并不區(qū)分TCP和UDP。對于UDP來說,除了常規(guī)的QoS限制,還可能存在更嚴(yán)格的限制,甚至在某些極端情況下會屏蔽UDP。這主要是因為UDP的無連接、無狀態(tài)、支持廣播和最大努力傳輸?shù)忍匦允沟镁W(wǎng)絡(luò)運營商控制UDP的成本較高。
Part 02●??游戲場景下TCP與UDP的區(qū)別?●
通常情況下,為了確保游戲的實時性,使用UDP進行網(wǎng)絡(luò)傳輸是常見的做法。例如,在射擊游戲中,當(dāng)角色在行走時遇到網(wǎng)絡(luò)卡頓,畫面會卡住,但當(dāng)恢復(fù)后,畫面中的角色已經(jīng)跳到下一個位置,仿佛跳幀了一般。這是UDP的特性,它盡最大努力進行傳輸,允許丟包。
相比之下,如果使用TCP,當(dāng)網(wǎng)絡(luò)卡頓時,你會發(fā)現(xiàn)游戲畫面暫停,角色像卡在幻燈片上一樣逐幀向前移動。這是因為TCP是面向連接的,丟失的包會被重傳,確認后才會繼續(xù)進行。當(dāng)然,游戲中不僅僅使用UDP、TCP,更高層的協(xié)議如HTTP也可能被使用,這完全取決于游戲?qū)ρ舆t的要求。
Part 03●??TCP與UDP的場景選擇?●
那么在不同的使用場景中究竟是使用UDP還是TCP呢?
如果是客戶端間歇性發(fā)起無狀態(tài)查詢,并且偶爾的延遲是可以接受的(例如查詢學(xué)術(shù)論文、參考信息等),那么可以考慮使用HTTP/HTTPS。
如果客戶端和服務(wù)器都可以獨立發(fā)包,但偶爾的延遲是可以容忍的(例如在線紙牌游戲、許多MMO游戲),那么可以考慮使用TCP長連接。
如果客戶端和服務(wù)器都可以獨立發(fā)包,并且無法容忍延遲(例如大多數(shù)多人動作游戲、一些MMO游戲、直播互動等),那么考慮使用UDP。
在訪問一些國外學(xué)術(shù)網(wǎng)站、游戲服務(wù)器時,直接連接效果可能不佳,因此需要使用場景寬帶來實現(xiàn)優(yōu)化效果。以游戲為例,因為游戲通常使用UDP進行傳輸,而普通的運營商網(wǎng)絡(luò)對UDP會產(chǎn)生較大的干擾,所以場景寬帶需要對游戲客戶端與代理服務(wù)器之間的連接進行一些處理。
Part 04●?UDP協(xié)議的QoS問題?●
每次UDP套接字發(fā)送數(shù)據(jù)包時,源端口會隨機變化。如果一個設(shè)備頻繁發(fā)送UDP包,會在短時間內(nèi)產(chǎn)生大量的五元組(源IP地址、源端口、目標(biāo)IP地址、目標(biāo)端口、協(xié)議)。傳統(tǒng)的狀態(tài)防火墻和狀態(tài)NAT會使用一個五元組來跟蹤一個連接。如果連接數(shù)量過多,會給保存狀態(tài)的設(shè)備帶來巨大壓力。
這種壓力主要體現(xiàn)在兩個方面:存儲壓力和處理器壓力。
存儲壓力指的是設(shè)備需要配置大量內(nèi)存來保存大量連接。
處理器壓力指的是設(shè)備在數(shù)據(jù)包到達時需要花費更多時間匹配連接。
由于UDP協(xié)議的無狀態(tài)特性,沒有任何報文指示何時創(chuàng)建或銷毀連接,設(shè)備必須能夠自行老化已創(chuàng)建的UDP連接,并在權(quán)衡中做出決策。如果老化時間過短,會破壞通信頻率較低的UDP連接。如果老化時間過長,將會導(dǎo)致無效的UDP連接消耗大量內(nèi)存,為DDoS攻擊提供攻擊面。攻擊者只需構(gòu)造不同的UDP五元組的報文通過狀態(tài)設(shè)備,由于UDP報文沒有連接創(chuàng)建或銷毀的控制信息,狀態(tài)設(shè)備不得不對待所有新到達的五元組,并為它們創(chuàng)建連接并指定相同的老化時間。
而TCP協(xié)議與此完全不同,由于具有syn、fin、rst等控制信息,狀態(tài)設(shè)備可以為不同狀態(tài)的TCP連接指定不同的老化時間,ESTABLISHED狀態(tài)的連接老化時間明顯更長。這使得使用TCP實施同樣攻擊更加困難。為什么快速構(gòu)造不同的TCP五元組無法達到UDP的效果呢?如果盲目使用不同源端口發(fā)送syn,沒有真正的對端回應(yīng)的情況下,這種連接狀態(tài)將很快老化(在10秒甚至更短的時間內(nèi))。如果構(gòu)造大量使用不同端口的真實TCP連接,那么除了給狀態(tài)設(shè)備帶來傷害外,攻擊者自己也必須付出巨大代價來維持這些連接。你發(fā)起一個TCP連接,為了讓狀態(tài)設(shè)備保存該連接,你也必須保存該連接。除非通過大量的反射主機同時發(fā)起真實連接,否則在單臺或少量主機上,這種攻擊很難成功。對于無狀態(tài)設(shè)備來說,我們不再需要擔(dān)心五元組連接的保持。
但是UDP短時間內(nèi)構(gòu)造大量五元組仍會影響無狀態(tài)設(shè)備的包分類算法的正常運行?;诎诸愃惴ǖ膬?yōu)先級隊列和緩存管理幾乎都是基于五元組計算的,UDP的特性會使無狀態(tài)設(shè)備難以對其進行流量控制。結(jié)果就是,即使UDP流量擠滿各級隊列和緩存,也無法準(zhǔn)確識別出來。即便是BBR(Bottleneck Bandwidth and Round-trip propagation time)遇到UDP流量,也只能降低pacing rate,別無他法。
普通的運營商網(wǎng)絡(luò)對TCP更友好,對UDP不友好,但同樣無法深度檢測TCP連接的真實性。一個簡單的例子是將正常TCP數(shù)據(jù)的協(xié)議字段改為UDP。這樣做會導(dǎo)致通信出現(xiàn)問題,甚至無法進行有效的傳輸:
if (iph->protocol == IPPROTO_TCP) {
iph->protocol = IPPROTO_UDP;
ip_send_check(iph);
udph->check = 0;
} else if (iph->protocol == IPPROTO_UDP) {
iph->protocol = IPPROTO_TCP;
ip_send_check(iph);
}
Part 05●??結(jié)語?●
到這里,已經(jīng)從底層角度基本說明了為什么在學(xué)術(shù)、游戲、實時音頻等場景下會催生進一步的網(wǎng)絡(luò)加速服務(wù)需求了。而加速服務(wù)的主要難在兩點:其一,是如何處理客戶端到加速器服務(wù)器之間的UDP連接;其二,是如何讓游戲客戶端去連接這個加速器(一般游戲客戶端是沒有設(shè)置代理服務(wù)器的功能的)。而場景寬帶也正是旨在解決特定場景下以上所述的這些問題,為特定網(wǎng)絡(luò)應(yīng)用場景提供更流暢、快速的網(wǎng)絡(luò)體驗,在未來構(gòu)筑更多元化、優(yōu)質(zhì)的網(wǎng)絡(luò)服務(wù)。