一、飛鴿協議格式分析
首先把飛鴿協議的報文的格式說明一下。飛鴿協議報文格式如下(注意,以下是乙個完整字串,使用字元冒號進行每部分的分隔):
ver(1):packetno:sendername:senderhost:commandno:additionalsection
整體報文的意思是:版本號(現在是1,飛秋就是針對這部分做了修改):資料報編號:傳送主機:命令:附加資料
各欄位解析:
ver:版本號,標準飛鴿協議為1
packetno:資料報編號,一般是取毫秒數。利用這個資料,可以唯一的區別每個資料報;
sendername指的是傳送者的暱稱,對應windows系統上,取值為pc的當前使用者的登入名
senderhost:傳送主機,對應windows系統上,取值為主機名;
commandno:命令字,指的是協議中定義的一系列命令,程式中使用十六進製制常量資料定義。
additionalsection:附加資料,對應不同的具體命令,附加資料中有不同的資料內容。
這裡對命令字部分進行詳細解析。飛鴿協議中,命令字是由不同的十六進製制資料定義的。我在閱讀了飛鴿的文件和分析後,發現命令字的組成可以分為兩個部分,一部分是基本命令字,另一部分是選項命令字(我自己起的叫法,嘿嘿)。基本命令字,是命令字資料的低8位。對應到十六進製制資料,就是後兩個資料。基本命令包括的有:上線廣播,下線廣播,傳送訊息,訊息開啟通知,檔案傳輸請求,等等。第二部分,就是一些選項了,這些選項的命令字的定義在其餘的位置,也就是不在基本命令字所佔據的低8位上。使用時,只需將選項命令字與基本命令字做位或運算,這樣所傳送的訊息就有了一些選項所附帶的功能。舉個例子說明:
當想要傳送訊息時,就需要用到傳送訊息基本命令字ipmsg_sendmsg,對應十六進製制資料是0x20。將所要傳送的訊息放到附加資料字段,再將其餘個部分都新增上相應內容,這樣乙個飛鴿協議報文就組建好了,如下:
1:100:shirouzu:jupiter:32:hello
注意:協議報文中,命令字是以十進位制表示,其實32轉換為十六進製制就是0x20。將其使用udp傳送到另乙個使用飛鴿的機器上,對應機器就可以收到內容為hello的訊息了。在這個例子中,我們只使用了基本命令字,所以訊息接收端在收到訊息後不對傳送端回送任何資料。我們知道,udp通訊是不可靠的,我們在傳送了資料後,並不知道接收端是否接收到了訊息,若想要接收端在收到訊息後,給我們返回乙個收到訊息的確認,這裡,就要使用到選項命令字ipmsg_sendcheckopt了,這個選項命令字對應十六進製制資料是0x100,定義為傳送驗證。接收端在收到訊息的同時需要檢測是否有傳送驗證這個選項,若有,則需要向訊息傳送端回送乙個包含通報收到訊息基本命令字ipmsg_recvmsg的報文。使用這個選項命令字很簡單,只需要將基本命令字與選項命令字做按位的或操作,得到的命令字對應十六進製制就是0x120,轉換為十進位制就是288。所以這個帶有傳送驗證的飛鴿訊息報文內容就是
1:100:shirouzu:jupiter:288:hello
接收端在收到這個訊息後,就會回送乙個收到訊息的報文了。
飛鴿協議中定義的選項命令字有很多,實現的功能也有不同,具體的可以閱讀下源**。
二、上下線報文分析
在明白了飛鴿協議報文格式之後,上下線就比較簡單了。
飛鴿協議中規定的上線的步驟是:當開啟了飛鴿程式以後,程式會向區域網中廣播一條上線報文,若區域網中有其他飛鴿使用者,則其在收到上線報文以後,向廣播傳送端回送一條收到上線廣播的報文,通過這個機制,則區域網中所有飛鴿使用者都有了相互資訊。
具體的飛鴿報文構造,同上面的一樣,需要注意的就是,在乙個區域網中,廣播位址對應的就是255.255.255.255。
另外有一點說明一下,在上線報文中,附加資訊中可以攜帶上線使用者的使用者名稱和分組名,使用者名稱和分組名之間使用」\0」字元進行分隔。
ICMP網際控制報文協議分析
icmp internet control message protocol 網際控制報文協議。它是tcp ip協議族的乙個子協議,是一種面向無連線的協議,用於傳輸出錯報告控制資訊。用於在ip主機 路由器之間傳遞控制訊息。這些控制訊息雖然並不傳輸使用者資料,但是對於使用者資料的傳遞起著重要的作用。鑑...
SNMP協議 PDU報文格式分析(BER編碼)
簡單網路管理協議 snmp 是目前在計算機網路中用得最廣泛的網路管理協議,它使用asn.1 abstract syntax notation one 來定義snmp報文格式和mib management information base 變數的名稱。asn.1是一種描述資料和資料特徵的正式語言,它和...
HTTP協議請求和響應報文分析
請求行 method 請求方法 get 請求指定的頁面資訊,並返回實體主體。head 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 post 向指定資源提交資料進行處理請求 例如提交表單或者上傳檔案 資料被包含在請求體中。post請求可能會導致新的資源的建立和 或已有資源的修改。...