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