網路遊戲 採用的是tcp協議還是udp協議?

網路多人對戰遊戲,如魔獸世界採用的是tcp協議還是udp協議?
如果是udp協議,那麼發生丟包的話,怎麼檢測?


最近在搞這方面,分享點心得,不對請指正。
實時戰鬥遊戲的話還是要用UDP了,因為TCP的特性,一旦丟包就會重發,阻塞住後續的數據包,因而可能會產生一個較大的瞬時延遲。

魔獸世界據說是用TCP。可能因為魔獸世界的遊戲設計能很好的隱藏延遲,TCP用起來更簡單些。

關於丟包檢查,可以採用一個近似TCP的ack機制,可以給每個數據包都添加一個sequence ID,然後發送端就依次發送數據包,接收端收到數據包後就可以根據sequence ID來判斷是否有丟包了。

接下來是重點,接收端需要發該sequenceID的ack給發送端,發送端才會知道這個包是否已經送達。但這是一筆不小的開銷,而且,ack本身也有可能丟包。

可以這樣,發送一個sequence ID的ack時,附加一個32bit的位序列,表示當前sequence ID之前的32個連續順位的數據包是否已經送達,其實就是冗餘的發送連續32個包的送達狀態,如果bit為0說明這個包還沒到,如果為1,說明已經收到了。這樣一來,除非連續丟包30多次,ack是一定會送到的,這種幾率已經非常小了。

相應的,在發送端設置一個超時機制,這個時間差不多比連續發30個ack的時間長一點,如果發送一個包後開始計時,達到超時還沒有收到ack,這個包就丟失了。

但即使丟包了也不一定需要重發!是否需要重發,如何重發可以和遊戲的邏輯結合起來,沒有必要實現類似TCP那樣的完全可靠的機制,畢竟戰鬥中的同步速率很高,丟一個一般也沒啥事情。

語言組織能力欠佳,多包涵。


看你要做什麼遊戲

可以容忍延遲並且有很好的屏蔽延遲的設計,如紙牌類和MMO,用TCP

不能容忍延遲,如DOTA類和動作類,用UDP


做一個檢測和備份機制。

就是在交互協議裡面先設計好,例如我交互,先發一個整體列表,告訴伺服器,我要發包了,這次有100個包,序號按1-100.

然後發一個包,包頭包體包尾,

在包頭裡面寫我的包序號 sequence ID ,伺服器收到包後進行檢測,

這個序列是1-100,OK沒問題。

如果發現,第56條數據沒有,那麼發信息給客戶端,讓他重發第56條數據。

具體的可能更複雜,我這只是對這一種情況的解決方案


推薦閱讀:

大學期間不玩LOL,是否會被孤立?
為什麼現在許多與二戰海戰有關的遊戲都要和諧日本艦船的名字?
韓國採用的「限制氪金」相關規定對我們有無借鑒意義?
網路遊戲中發生過那些催淚感人的事?
廈門吉比特遊戲公司怎麼樣?

TAG:網路遊戲 | UDP | TCP |