接觸了一段時間的網遊封包設計,有了一些初步的思路,想借這篇文章總結一下,同時也作個記錄,以利於以後更新自己的思路。
網路遊戲的技術研發,分為三個主要的方面:伺服器設計,客戶端設計,資料庫設計。而在伺服器和客戶端之間實現遊戲邏輯的中介則是遊戲資料報,伺服器和客戶端通過交換遊戲資料報並根據分析得到的資料報來驅動遊戲邏輯。網路遊戲的實質是互動,而互動的控制則由伺服器和客戶端協同完成,協同就必然要依靠資料來完成。
當前網路遊戲中的封包,其定義形式是各種各樣的,但歸納起來,一般都具有如下要素:封包長度,封包型別,封包引數,校驗碼等。
封包長度用於確定當前遊戲資料報的長度,之所以提供這個資料,是因為在底層的
tcp網路傳輸中,出於傳輸效率的考慮,傳輸有時會把若干個小的資料報合併成乙個大的資料報傳送出去,而在合併的過程中,並不是把每乙個邏輯上完整的資料報全部合併到一起,有時可能因為這種合併而將乙個在邏輯上具有完整意義的遊戲資料報分在了兩次傳送過程中進行傳送,這樣,當前一次的資料傳送到接受方之後,其尾部的資料報必然造成了「斷尾
」現象,為了判定這種斷尾的情況及斷尾的具體內容,遊戲資料報在設計時一般都會提供封包長度這個資訊,根據這個資訊接受方就知道收到的包是否有斷尾,如果有斷尾,則把斷尾的資料報和下次發過來的資料報進行拼接生成原本在邏輯意義上完整的資料報。
封包型別用於標識當前封包是何種型別的封包,表示的是什麼含義。
封包引數則是對封包型別更具體的描述,他裡面指定了這種型別封包說明裡所必須的引數。比如說話封包,他的封包型別,能用乙個數值進行表示,而具體的說話內容和發言的人則作為封包引數。
校驗碼的作用是對前述封包內容進行校驗,以確保封包在傳遞過程中內容不致被改動,同時根據校驗碼也能確定這個封包在格式上是不是個合法的封包。以校驗碼作為提高封包安全性的方法,已是目前網遊普遍採用的方式。
封包設計,一般是先確定封包的總體結構,然後再來具體細分有哪些封包,每個封包中應該含有哪些內容,最後再周詳寫出封包中各部分內容具體占有的位元組數及含義。
資料報的具體設計,一般來說是根據遊戲功能進行劃分和圈定的。比如遊戲中有聊天功能,那麼就得設計客戶端和伺服器的聊天資料報,客戶端要有乙個描述發言內容和發言人資訊的資料報,而在伺服器端要有乙個包含使用者發言內容及發言人資訊的廣播資料報,通過他,伺服器端能向其他附近玩家廣播傳送當前玩家的發言內容。再比如遊戲中要有交易功能,那麼和這個功能相對應的就可能會有以下資料報:申請交易包,申請交易的資訊包,允許或拒絕交易包,允許或拒絕交易的資訊包,提交交易物品包,提交交易物品的資訊包,確認交易包,取消交易包,取消交易的資訊包,交易成功或失敗的資訊包。需要注意的是,在這些封包中,有的是一方使用而另一方不使用的,而有的則是雙方都使用的包。比如申請交易包,只可能是一方使用,而另一方會得到乙個申請交易的資訊包;而確認交易包和提交交易物品這樣的資料報,都是雙方在確定要進行交易時要同時使用的。
封包的設計也遵從由上到下的設計原則,即先確定有哪些功能的封包,再確定封包中應該含有的資訊,最後確定這些資訊應該占有的位置及長度。一層層的分析和定義,最終形成乙個完善的封包定義方案。
在實際的封包設計過程中,回溯的情況是經常出現的。由於初期設計時的考慮不周或其他原因,可能造成封包設計方案的修改或增刪,這時候乙個重要的問題是要記得及時更新你的設計檔案。
在我的封包設計中,我採用的是以下的封包描述**進行描述:
封包編號 功能描述 對應的類或結構體名 型別命令字 命令引數結構體及含義
根據遊戲的功能,我們能大致圈定封包的大致結構及所含的大致內容。不過,封包設計還包含有其他更多的內容,怎麼在確保封包邏輯簡潔的前提下縮短封包的設計長度提高封包的傳輸速度和遊戲的執行速度,這也是我們應該考慮的乙個重要問題。
一般情況下,設計封包時,應該盡量避免產生一百位元組以上的封包,多數封包的定義控制在
100位元組以內,甚至20-
50位元組以內。
在我所定義的封包中,多數在
20位元組以內,對於諸如傳遞伺服器列表和使用者列表這樣的封包可能會大一點。總之一句話,應該用盡可能短的內容盡可能簡潔清晰地描述封包功能和含義。
在封包結構設計方面,我有另一種可擴充套件的思路:對封包中各元素的位置進行動態定義。這樣,當換成其他遊戲或想更換當前遊戲的封包結構時,只要改動這些元素的動態定義即可,而不必完全重新設計封包結構。比如我們對封包編號,封包型別,封包引數,校驗碼這些資訊的開始位置和長度進行定義,這樣就能形成乙個動態定義的封包結構,對以後的封包移植將會有非常大幫助,乙個可能動態改動封包結構的遊戲資料報,在相當程度上增加了外掛程式分析封包結構的難度。
在進行封包設計時,最好根據封包客戶端和伺服器端的不同來分類進行設計。比如大廳和遊戲伺服器的封包及遊戲伺服器和遊戲客戶端的封包分開來進行設計,在包的編號上表示出他們的不同(以不同的開頭單詞表示),這樣在封包的總體結構上就會更清晰。
網路遊戲中的資料報設計與定義(初論)
接觸了一段時間的網遊封包設計,有了一些初步的思路,想借這篇文章總結一下,同時也作個記錄,以利於以後更新自己的思路。網路遊戲的技術研發,分為三個主要的方面 伺服器設計,客戶端設計,資料庫設計。而在伺服器和客戶端之間實現遊戲邏輯的中介則是遊戲資料報,伺服器和客戶端通過交換遊戲資料報並根據分析得到的資料報...
網路遊戲中的資料報設計與定義(初論)
接觸了一段時間的網遊封包設計,有了一些初步的思路,想借這篇文章總結一下,同時也作個記錄,以利於以後更新自己的思路。網路遊戲的技術研發,分為三個主要的方面 伺服器設計,客戶端設計,資料庫設計。而在伺服器和客戶端之間實現遊戲邏輯的中介則是遊戲資料報,伺服器和客戶端通過交換遊戲資料報並根據分析得到的資料報...
網路遊戲中的資料報設計與定義(初論)
接觸了一段時間的網遊封包設計,有了一些初步的思路,想借這篇文章總結一下,同時也作個記錄,以利於以後更新自己的思路。網路遊戲的技術研發,分為三個主要的方面 伺服器設計,客戶端設計,資料庫設計。而在伺服器和客戶端之間實現遊戲邏輯的中介則是遊戲資料報,伺服器和客戶端通過交換遊戲資料報並根據分析得到的資料報...