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