在當前網路環境下(2016年),手游使用長連接(TCP)好還是短連接(HTTP)好?
或者很難有統一的界定, 根據遊戲類型的不同去選擇。
那遊戲類型該如何劃分呢。
本人剛好從事手游服務端開發,怒答一發。
先簡單的介紹一下計算網路的一些基礎知識
首先說一下 tcp:tcp的好處就是「可靠」,會將體積大的數據包進行分片,保證不會讓ip協議進行分片。會檢測數據包是否丟包,丟包重傳,有序地發送數據包等等,壞處就是數據包頭比較臃腫,至少有20+的位元組(不要小看這20+位元組),在丟包重傳時,會阻塞後面的數據包,而且tcp需要保持連接狀態才能進行通訊,在連接數較多時,伺服器光在handle這些連接狀態上就要消耗不少的性能。題主所說的「長連接」應該指的是tcp socket,tcp socket是操作系統為tcp協議的實現(說白了就是操作系統為tcp提供的api)http: http處於應用層,是基於tcp的實現。它繼承了tcp的所有優點。跟tcp有些不同,http不會一直的保持連接狀態,在早期的http 1.0時期,http請求在得到響應後會立即斷開連接,這樣就導致了每次的http請求都必須去進行tcp握手(在數據報文很小時,握手時間甚至會超過數據傳送時間),在1.1版本後使用同一個連接進行多次的http請求,在一段時間內沒有再次進行http請求時,會自動斷開,這樣就減輕了伺服器維護大量鏈接所產生的開銷問題,但是http是應用層,它會產生新的數據報頭,在數據包的容量上會更大。
在說一下題主這裡沒有提到的udp: udp 是「不可靠」的:不會丟包重傳,會導致ip分片從而丟包,數據包不會按序送達,只保證到達的包數據是完整的,它的好處就是,不會產生tcp丟包時的隊列阻塞,數據報頭較小,只有8個位元組,是一個無連接協議。手游用什麼協議?有啥優缺點?
tcp:優點就是tcp的功能太強大了,基本上沒有tcp做不了的事,而且基於tcp的第三方庫也非常多而且穩定,開發起來比較順心。但tcp的缺點也很多,數據報頭有20+位元組,在一些動作類遊戲中,需要非常頻繁地與伺服器進行交互,而且通常一個操作指令會很小(基本上都小於20個位元組 :P),這就代表一半的帶寬開銷被用在了數據報頭上。其次就是tcp需要保持連接狀態,這個在pc上可能不是問題,在手機上問題就大了。手機信號不穩定,ios操作系統會將後台非特殊進程掛起,導致遊戲斷線需要斷線重連,也就是重新登陸一次,做過網遊的同學都知道,遊戲登陸操作對伺服器的開銷往往是最大的。再一個就是tcp丟包重傳的特性引起的,每次發送數據包需要check是否包已到達,隊列後的數據包需要等待前一個數據包成功發送後才能進行發送,這樣會導致嚴重的lag,在手機信號不好時尤為明顯。由於大量的tcp連接會帶來開銷,基於tcp的遊戲通常在線人數會有limit,當然,使用分散式架構或者遊戲滾服會解決掉這個問題(tcp分散式架構人人都會做,做的好不好,這個得看功力)。http:因為http不需要持續地保持連接,是一個無狀態的連接,不會產生tcp所產生的斷線重連的問題,伺服器也不需要維護過多的連接。缺點就是需要經常的進行tcp握手操作(不會影響玩家體驗),而且由於http的無狀態性,通常遊戲數據需要實時保存,不過現在的內存資料庫 nosql的興起和計算機性能的提升,這塊劣勢已經不存在,而且越來越多的遊戲都採用實時數據保存,防止遊戲伺服器宕機數據回檔的風險。再一個就是伺服器無法主動向客戶端推送數據,導致在某些功能上會無法實現。由於http的無狀態性,需要做心跳處理,基於http的遊戲伺服器可以橫向擴展(每一個遊戲伺服器進程就是一個單純的邏輯計算器),資料庫架構設計的好的話,一個遊戲服很容易實現1億+的玩家同服的情況。
udp:優點就是「快」和「小」,udp不會產生tcp的數據包隊列阻塞的問題,而且報頭數據量很小,在某些對速度和網路io量有較大要求的玩法時,這2個優點顯得尤為重要,而且udp是無連接的,不會產生斷線問題,也可以橫向擴展。缺點就是udp的不可靠性,一些實現可靠的udp協議的第三方庫很少,而且往往滿足不了自己項目的需求,所以要實現可靠的udp要自己動手造一遍輪子,需要一定的網路基礎知識和敢於踩坑的精神
我的推薦 方案1 :完全使用udp,幾個項目下來,我覺得使用udp做手游服務端真的是perfect match。沒有斷線問題,流量小,響應速度快。無奈手游環境開發商們心態比較浮躁,都以穩定來追求利益最大化,市面上完全使用udp的遊戲非常少。 方案2 :http+udp,這種相對保守一些,邏輯相關的使用http協議,保證遊戲邏輯不會出通訊上的問題,推送類的使用udp,比如聊天,世界公告等等,這些就算你的udp協議寫的爛,也不會產生嚴重問題。如果實時性要求非常高的戰鬥功能,請使用udp。根據需要,如果是動作遊戲,甚至有玩家實時PVP的話,肯定是強連接,而且用TCP,用來保證不丟包。不過這樣做對伺服器的壓力很大,一般是精英怪是伺服器驗證的,炮灰就是本地的,這樣會好很多。
卡牌什麼的,弱連接就可以了,反正戰鬥都是播放式的,伺服器算好個結果發過來,客戶端表演一番。這種連心跳包都不用。不過為了安全還是用TCP。
UDP一般是本地或者P2P時用,沒什麼安全性。「tcp還是http」是什麼鬼?TCP和HTTP不是一個層級的東西。TCP是傳輸層,而HTTP是應用層。HTTP也是基於TCP的。拿HTTP和TCP做比較是一個不存在的問題。
這個選擇是要看遊戲需求決定的呀。像《智龍迷城》這種遊戲,用長連接有什麼用處呢。而像《虛榮》這種競技遊戲,用短連接又怎麼可能呢?換個話說,其實一切的短連接都可以用長連接來替代,這個就要看你對資源的利用是否需要考慮了。
這個肯定沒有統一的界定,要根據具體情況具體分析。在分析之前,你要搞清楚HTTP, TCP, UDP 3種協議的優缺點,才能合理的根據具體情況來使用。HTTP vs TCP, 基本上HTTP協議是建立在TCP之上的協議層(HTTP只是一種協議,理論上下層可以是任何數據通訊協議,不過應該絕大多數都是基於TCP的),但是在使用上還是不太一樣的。HTTP就是一個簡單的Request/Response (這裡我們不說HTTP/2 or XMPP, 直說最簡單的HTTP/1.1),非常方便簡單。TCP要保持一個長連接,更高效,但是在移動的不穩定的網路環境中,這個連接會經常斷掉,需要自己維護,會比較麻煩。如果你的遊戲只是偶爾保存一下狀態,看看有沒有item的update的話,我覺得HTTP就挺好,但是如果是那種比較Heavy的網路對戰遊戲的話,最好保持一個TCP長連接。TCP vs UDP, TCP需要3次握手協議,如果你再加上TLS的話,需要Client Hello+Server Hello, Key Exchange, 這個耗費是很大的,再加上Congest Windows/Slow Start,建立連接是非常複雜和耗時的。相對而言UDP就沒這麼多麻煩事,但是也無法保證包的可靠性。據說當初BlackBerry的郵件系統就是build在UDP上的,所以911的時候,別的手機郵件系統都出問題了,只有BlackBerry服務很穩定,名聲一炮打響。但是如果選擇用UDP, 編程要處理各種情況,開發效率太低。
你是想說tcp和udp嗎,手游肯定是TCP啊,如果你的遊戲內有實時視頻或者雙方有實時通話功能,就用udp做這類功能,http是瀏覽器用到的,手游是一個APP。
我也做了幾年遊戲了基本 上都是用的TCP長連接,只有一些休閒遊戲或者弱交互(和伺服器)的卡牌遊戲用的http短連接
建議用長連接我猜題主是做cocos2dx吧,內置短連接有http和websocket,這兩個我都用過,對於戰鬥在客戶端處理的遊戲,確實有很多好處,特別輕量簡單。但最致命的是服務端無法主動通知客戶端,雖然可以利用推送或呼吸來解決,但對於遊戲高交互,會帶來很多不便。還是選擇長連接吧,http很坑的
手游開發中網路通信使用長連接還是短連接比較好? - 手機遊戲
都讓開, 我來答
我猜你的意思是 "長連接" 和 "短連接", 或者 TCP 和 UDPHTTP是TCP的一種.至於是要長連接還是短連接, 看遊戲性質啊
如果像一些卡片類, 只有戰鬥結束才通訊一次的話, 那肯定不要長連接, 這不是浪費伺服器資源嘛, 又不交換數據
如果像一些MMO, MOBA, 那肯定要實時, 那妥妥是長連接, 還要做各種異常處理題煮講的 這個很難界定吧!i Agree!大大的同意。看需而定~!
推薦閱讀:
※Unity3D開發中 使用C# 很多文檔都有提到這個「避免使用構造函數 不要在構造函數中初始化任何變數」為什麼?
※Unity3D開發中如何用好單例模式?
※開發遊戲的時候 UI是由哪些人來拼的 ?
※為什麼用Unity3D開發遊戲是用C#,JS開發而不是用C++?U3D的設計者是怎樣考慮的?
※像缺氧、環世界那些小人自動分工機制是怎麼做到的?