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