網路遊戲中的資料包設計與定義初論(轉)

post0發表於2007-08-12
網路遊戲中的資料包設計與定義初論(轉)[@more@]

  接觸了一段時間的網遊封包設計,有了一些初步的思路,想借這篇文章總結一下,同時也作個記錄,以利於以後更新自己的思路。  

  

  網路遊戲的技術研發,分為三個主要的方面:伺服器設計,客戶端設計,資料庫設計。而在伺服器和客戶端之間實現遊戲邏輯的中介則是遊戲資料包,伺服器和客戶端透過交換遊戲資料包並根據分析得到的資料包來驅動遊戲邏輯。網路遊戲的實質是互動,而互動的控制則由伺服器和客戶端協同完成,協同就必然要依靠資料來完成。

  

  當前網路遊戲中的封包,其定義形式是各種各樣的,但歸納起來,一般都具有如下要素:封包長度,封包型別,封包引數,校驗碼等。  

  

  封包長度用於確定當前遊戲資料包的長度,之所以提供這個資料,是因為在底層的TCP網路傳輸中,出於傳輸效率的考慮,傳輸有時會把若干個小的資料包合併成一個大的資料包傳送出去,而在合併的過程中,並不是把每一個邏輯上完整的資料包全部合併到一起,有時可能因為這種合併而將一個在邏輯上具有完整意義的遊戲資料包分在了兩次傳送過程中進行傳送,這樣,當前一次的資料傳送到接受方之後,其尾部的資料包必然造成了“斷尾”現象,為了判定這種斷尾的情況以及斷尾的具體內容,遊戲資料包在設計時一般都會提供封包長度這個資訊,根據這個資訊接受方就知道收到的包是否有斷尾,如果有斷尾,則把斷尾的資料包與下次發過來的資料包進行拼接生成原本在邏輯意義上完整的資料包。  

  

  封包型別用於標識當前封包是何種型別的封包,表示的是什麼含義。  

  

  封包引數則是對封包型別更具體的描述,它裡面指定了這種型別封包說明裡所必須的引數。比如說話封包,它的封包型別,可以用一個數值進行表示,而具體的說話內容和發言的人則作為封包引數。  

  

  校驗碼的作用是對前述封包內容進行校驗,以確保封包在傳遞過程中內容不致被改變,同時根據校驗碼也可以確定這個封包在格式上是不是一個合法的封包。以校驗碼作為提高封包安全性的方法,已經是目前網遊普遍採用的方式。封包設計,一般是先確定封包的總體結構,然後再來具體細分有哪些封包,每個封包中應該含有哪些內容,最後再詳細寫出封包中各部分內容具體佔有的位元組數及含義。  

  

  資料包的具體設計,一般來說是根據遊戲功能進行劃分和圈定的。比如遊戲中有聊天功能,那麼就得設計客戶端與伺服器的聊天資料包,客戶端要有一個描述發言內容與發言人資訊的資料包,而在伺服器端要有一個包含使用者發言內容及發言人資訊的廣播資料包,透過它,伺服器端可以向其他附近玩家廣播傳送當前玩家的發言內容。再比如遊戲中要有交易功能,那麼與這個功能相對應的就可能會有以下資料包:申請交易包,申請交易的資訊包,允許或拒絕交易包,允許或拒絕交易的資訊包,提交交易物品包,提交交易物品的資訊包,確認交易包,取消交易包,取消交易的資訊包,交易成功或失敗的資訊包。需要注意的是,在這些封包中,有的是一方使用而另一方不使用的,而有的則是雙方都使用的包。比如申請交易包,只可能是一方使用,而另一方會得到一個申請交易的資訊包;而確認交易包和提交交易物品這樣的資料包,都是雙方在確定要進行交易時要同時使用的。封包的設計也遵從由上到下的設計原則,即先確定有哪些功能的封包,再確定封包中應該含有的資訊,最後確定這些資訊應該佔有的位置及長度。一層層的分析與定義,最終形成一個完善的封包定義方案。在實際的封包設計過程中,回溯的情況是經常出現的。由於初期設計時的考慮不周或其它原因,可能造成封包設計方案的修改或增刪,這時候一個重要的問題是要記得及時更新你的設計文件。在我的封包設計中,我採用的是以下的封包描述表格進行描述:  

  

  封包編號

     

  功能描述  

  

  對應的類或結構體名  

  

  型別命令字  

  

  命令引數結構體及含義   

  

  根據遊戲的功能,我們可以大致圈定封包的大致結構及所含的大致內容。但是,封包設計還包含有其它更多的內容,如何在保證封包邏輯簡潔的前提下縮短封包的設計長度提高封包的傳輸速度和遊戲的執行速度,這也是我們應該考慮的一個重要問題。一般情況下,設計封包時,應該儘量避免產生一百位元組以上的封包,多數封包的定義控制在100位元組以內,甚至20-50位元組以內。在我所定義的封包中,多數在20位元組以內,對於諸如傳遞伺服器列表和使用者列表這樣的封包可能會大一點。總之一句話,應該用盡可能短的內容儘可能簡潔清晰地描述封包功能和含義。  

  

  在封包結構設計方面,我有另一種可擴充套件的思路:對封包中各元素的位置進行動態定義。這樣,當換成其它遊戲或想更換當前遊戲的封包結構時,只要改變這些元素的動態定義即可,而不需要完全重新設計封包結構。比如我們對封包編號,封包型別,封包引數,校驗碼這些資訊的開始位置和長度進行定義,這樣就可以形成一個動態定義的封包結構,對以後的封包移植將會有很大幫助,一個可能動態改變封包結構的遊戲資料包,在相當程度上增加了外掛分析封包結構的難度。  

  

  在進行封包設計時,最好根據封包客戶端和伺服器端的不同來分類進行設計。比如大廳與遊戲伺服器的封包及遊戲伺服器與遊戲客戶端的封包分開來進行設計,在包的編號上表示出他們的不同(以不同的開頭單詞表示),這樣在封包的總體結構上就會更清晰。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-951979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章