<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    樂在其中

    以JEE為主攻,以Flex為點綴,以Eclipse RCP為樂趣
    請訪問http://www.inframesh.org

    首頁 新隨筆 聯系 管理
      43 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

    本文重點在于對飛鴿協議原理及部分網絡知識進行普及性的介紹,盡量避免用專業的術語嚇跑非計算機專業朋友,如果有介紹的不合理的地方,也歡迎高手出來拍磚。
    飛鴿概述
    飛鵒傳書作為免費的開源軟件,在全世界各國享有聲譽,其原作者是H.Shirouzu,其windows平臺的C++源碼下載地址為http://www.azhi.net/IPMsg/ipmsg206src.zip。除windows平臺的實現以外,還存在大量其它平臺的飛鴿實現,如Mac,Linux,甚至還存在平臺無關的Java版本。
    本人開發的飛鴿傳書,實際上是在M8平臺上實現了該協議子集。從而能夠實現局域網內用戶發現,接收PC版飛鴿傳入的消息、文件、文件夾。
    本人實現的飛鴿,可參考如下兩個帖子:
    1 http://bbs.meizu.com/thread-791903-1-1.html
    2 http://bbs.meizu.com/thread-814371-1-1.html
    飛鴿能夠實現這種異構平臺之間的通信,在于它的源碼和協議是開放的,只要遵守相應的傳輸協議,就可以實現通信。
    這里要強調一個概念,網絡傳輸類應用程序,協議是重中之重。那么,協議到底是什么呢?協議可以讓運行于兩個不同平臺的程序之間做到“心有靈犀一點通”,也有點像黑幫內部的切口:A說了天王蓋地虎,B就要說寶塔鎮荷妖。
    有點扯遠了,計算機網絡應用中的協議,是要解決一些很實際的問題,比如,以飛鴿為例,計算機A向計算機B可以發消息,也可以傳文件。都是通過網絡傳遞數據,B如何能知道,這些數據中什么是消息,什么是文件呢?這就需要設計通信協議,通過一些命令字描述當前或即將傳送的數據是什么內容。從而使得接收方,能夠正確理解發送方發出的內容。
    網絡基礎,TCP/IP協議簡介
    TCP/IP是很復雜的,要介紹這個已經遠遠超出我的能力范圍,但我仍然可以對它的上層使用做簡單的介紹。
    前面我們花了大量的篇幅加口水強調協議在網絡應用中的重要性。那所謂的飛鴿協議,與我們平時常常聽到的TCP/IP有什么區別和聯系呢?這個問題問的好(我自己問的)!
    計算機網絡的設計有著非常多的成功的可取之處,其中之一就是分層。按照問題所在的領域,將問層劃分到不同的層中去解決(讀者可自行參考OSI的七層模型以及TCP/IP的五層模型)。TCP/IP協議在傳輸層提供的UDP和TCP傳輸協議,成為了我們構建應用層軟件(如,聊天,下載,郵件,http等等)的基礎。
    TCP傳輸協議規定了通信雙方需要一個“連接-接受”這樣的連接確認過程,既所謂的三次握手過程。一但連接建立成功,雙方可以通過該連接,進行可靠的數據通信。
    UDP傳輸協議不需要雙方進行連接,發送方只需要指定接收方的地址和端口,若接收方此時正在該端口等待接收,那接收方就有可能(網絡質量不好的話,可能會丟,不過局域網里通常不會發生這樣的情況)收到消息。
    除此之外,還有一個重要的概念是廣播,將數據包發送到廣播地址(用UDP協議發送),則該網段的所有用戶,都可以收到這條數據。
    飛鴿協議分析
    飛鴿的協議也屬于應用層協議,它描述了飛鴿程序通信時的語法和語義。
    其語法定義如下(所有的命令字,都必需符合這樣的格式要求):
    Ver(1): PacketNo:SenderName:SenderHost:CommandNo:AdditionalSection
    每部分分別對應為:版本號(現在是1):數據包編號:發送主機:命令:附加數據
    其中:
    數據包編號,一般是取毫秒數。利用這個數據,可以唯一的區別每個數據包;
    SenderName指的是發送者的昵稱(m8飛鴿被我統一的寫死為m8,現在知道怎么定制了吧?);
    發送主機,指的是發送主機的主機名;
    命令,指的是飛鴿協議中定義的一系列命令,具體見下文;
    附加數據,指的是對應不同的具體命令,需要提供的數據,具體見下文。
    上面介紹了數據包的語法,即格式,這些命令都是通過UDP協議向其它主機發送的。
    接下來列出協議的命令,包括命令字及附加選項:
         1) Command functions (Low 8 bits from command number 32 bits)
            IPMSG_NOOPERATION        No Operation
            IPMSG_BR_ENTRY                Entry to service (Start-up with a Broadcast command)
            IPMSG_BR_EXIT                Exit from service (End with a Broadcast command)
            IPMSG_ANSENTRY                Notify a new entry
            IPMSG_BR_ABSENCE        Change absence mode
            IPMSG_BR_ISGETLIST        Search valid sending host members
            IPMSG_OKGETLIST                Host list sending notice
            IPMSG_GETLIST                Host list sending request
            IPMSG_ANSLIST                Host list sending
            IPMSG_SENDMSG                Message transmission
            IPMSG_RECVMSG                Message receiving check
            IPMSG_READMSG                Message open notice
            IPMSG_DELMSG                Message discarded notice
            IPMSG_ANSREADMSG        Message open confirmation notice(added from version-8)
            IPMSG_GETFILEDATA        File Transfer request by TCP
            IPMSG_RELEASEFILES        Discard attachment file
            IPMSG_GETDIRFILES        Attachment hierarchical file request
            IPMSG_GETINFO                Get IPMSG version info.
            IPMSG_SENDINFO                Send IPMSG version info.
            IPMSG_GETABSENCEINFO        Get absence sentence
            IPMSG_SENDABSENCEINFO        Send absence sentence
            IPMSG_GETPUBKEY                RSA Public Key Acquisition
            IPMSG_ANSPUBKEY                RSA Public Key Response
         2) Option flag (High 24 bits from command number 32 bits)
            IPMSG_ABSENCEOPT        Absence mode(Member recognition command)
            IPMSG_SERVEROPT                Server(Reserved)
            IPMSG_DIALUPOPT                Send individual member recognition command
            IPMSG_SENDCHECKOPT        Transmission check
            IPMSG_SECRETOPT                Sealed message
            IPMSG_READCHECKOPT        Sealed message check(added from ver8)
            IPMSG_PASSWORDOPT        Lock
            IPMSG_BROADCASTOPT        Broadcast message
            IPMSG_MULTICASTOPT        Multi-cast(Multiple casts selection)
            IPMSG_NEWMUTIOPT        New version multi-cast(reserved)
            IPMSG_AUTORETOPT        Automatic response(Ping-pong protection)
            IPMSG_NOLOGOPT                No log files
            IPMSG_NOADDLISTOPT        Notice to the members outside of BR_ENTRY
            IPMSG_FILEATTACHOPT        File attachment
            IPMSG_ENCRYPTOPT        Code
            IPMSG_NOPOPUPOPT        (No longer valid)
            IPMSG_RETRYOPT                Re-send flag(Use when acquiring HOSTLIST)
         3) Extended code flag (hex format combination)
            IPMSG_RSA_512
            IPMSG_RSA_1024
            IPMSG_RSA_2048
            IPMSG_RC2_40
            IPMSG_RC2_128
            IPMSG_RC2_256
            IPMSG_BLOWFISH_128
            IPMSG_BLOWFISH_256
            IPMSG_SIGN_MD5
         4) Extended files for attachment (fileattr low 8 bits)
            IPMSG_FILE_REGULAR
            IPMSG_FILE_DIR
            IPMSG_FILE_RETPARENT
            IPMSG_FILE_SYMLINK
            IPMSG_FILE_CDEV
            IPMSG_FILE_BDEV
            IPMSG_FILE_FIFO
            IPMSG_FILE_RESFORK
         5) Attachment file extended attribute(fileattr high 24 bits)
            IPMSG_FILE_RONLYOPT
            IPMSG_FILE_HIDDENOPT
            IPMSG_FILE_EXHIDDENOPT
            IPMSG_FILE_ARCHIVEOPT
            IPMSG_FILE_SYSTEMOPT
         6) Extended file attribute for attachment file
            IPMSG_FILE_UID
            IPMSG_FILE_USERNAME
            IPMSG_FILE_GID
            IPMSG_FILE_GROUPNAME
            IPMSG_FILE_PERM
            IPMSG_FILE_MAJORNO
            IPMSG_FILE_MINORNO
            IPMSG_FILE_CTIME
            IPMSG_FILE_MTIME
            IPMSG_FILE_ATIME
            IPMSG_FILE_CREATETIME
            IPMSG_FILE_CREATOR
            IPMSG_FILE_FILETYPE
            IPMSG_FILE_FINDERINFO
            IPMSG_FILE_ACL
            IPMSG_FILE_ALIASFNAME
            IPMSG_FILE_UNICODEFNAME
    基于上面介紹的內容,我們可以判斷:
    1:100:shirouzu:jupiter:32:Hello 表示 shirouzu用戶發送了 Hello 這條消息(32對應為IPMSG_SEND_MSG這個命令,具體需要看源碼中的宏定義)。
    ==========================================
    以下內容未完待續,困了,明天再寫
    好,接下來我們進入具體場景的分析:
    登錄/離線通知
    登錄過程需要實現向局域網內的用戶廣播,告訴他們,“我來也!”。收到這條消息的用戶則立即回復,“知道了,我在這里”,同時將新登錄的用戶加入到用戶列表中。發送方也可根據收到的回復信息,了解到當前網絡中,都有哪些已經登錄了的用戶。
    具體的數據包如下:
    登錄方(要發送到廣播地址,如255.255.255.255):
    1:XXX:m8:<主機名稱>:IPMSG_BR_ENTRY:
    接收方回復(發送到發送方的IP地址):
    1:XXX:<接收方主機名>:IPMSG_ANSENTRY:
    相應的,用戶離線時,應向廣播地址發送,“我去也!”,收到這條消息的用戶,需要將發送方從自己的用戶列表中移除,并且不需要回復。
    具體的數據包如下:
    即將離線用戶:
    1:XXX:m8:<主機名稱>:IPMSG_BR_EXIT:
    發送/接收消息
    發送消息是飛鴿協議中最重要的部分,通過和一些命令選項,可以實現復雜的功能:
    最基本的情況下,發送方通過 IPMSG_SEND_MSG 命令,可以將消息發送到接收方
    1:12345:m8:<主機名稱>:IPMSG_SEND_MSG:你好,飛鴿
    使用命令時,“附加數據”開使發揮作用了它里面包含了要發送的消息。
    通常情況下,由于UDP的不可靠性,還需要為 IPMSG_SEND_MSG 命令設定 IPMSG_SENDCHECKOPT選項,也就是要求接收方回復回執信息。
    1:12345:m8:<主機名稱>:IPMSG_SEND_MSG|IPMSG_SENDCHECKOPT:你好,飛鴿
    接收方收到IPMSG_SEND_MSG時,如果遇到IPMSG_SENDCHECKOPT選項,就要立即回復如下信息:
    1:XXX:<用戶名>:<主機名>:IPMSG_RECVMSG:12345
    IPMSG_RECVMSG命令通過附加數據段中的數據(12345),告訴發送方,我收到了你的編號為12345的消息包。
    除了上面介紹的IPMSG_SENDCHECKOPT選項,飛鴿還支持加密得選項,現有的m8版本沒有實現該功能,所以暫不對這一塊進行介紹。
    發送/接收文件
    文件的傳輸,要稍微復雜一些,它是通過 IPMSG_SEND_MSG 命令與 IPMSG_FILEATTACHOPT選項的組合,通知接收方“現在有文件要發給你了”,同時要將一些描述文件屬性的數據(如文件名、大小、創建時間、類別屬性如文件夾),發送給接收方,具體格式如下:
    file1ID:filename:size:mtime:fileattr[:extend-attr=val1[,val2...][:extend-attr2=...]]:\a:file2ID...
    這里需要注意的有幾點,第一,一條文件傳送命令,可以攜帶多條文件信息;第二,多個文件信息之前,要用\a分割;第三,size, mtime和fileattr 是用十六進制數描述的);第四,如果文件名中包含“:”,則需要將其轉義為“::”。
    相應的,接收方收到文件傳送命令后,首先需要從文件屬性的數據中解析出要接收的文件的屬性。然后向發送方相同的端口進行TCP連接,連接成功后,通過TCP通道向發送方發送IPMSG_GETFILEDATA命令用于接收文件或發送IPMSG_GETDIRFILES命令,用于接收文件夾。具體接收文件的命令如下:
    1:XXX:m8:<主機名>:IPMSG_GETFILEDATA:packetID:fileID : offset
    這條命令通過packetID,讓發送方明白對方請求的文件是源于哪個命令包;通過fileId讓發送方確定要發哪個文件;通過offset;讓發送方明白要從哪個字節開始發送。
    發送方的TCP通道收到上面的命令,就會發送對方請求的文件;而接收方將收到的數據保存到磁盤上即可。

    posted on 2009-05-07 10:30 suprasoft Inc,. 閱讀(2847) 評論(0)  編輯  收藏 所屬分類: Misc.
    ©2005-2008 Suprasoft Inc., All right reserved.
    主站蜘蛛池模板: 99999久久久久久亚洲| 久久精品国产亚洲av麻豆色欲| 亚洲一级毛片中文字幕| 日韩免费无码视频一区二区三区 | 一出一进一爽一粗一大视频免费的| 成人免费视频一区| 美女视频黄免费亚洲| 一二三四在线播放免费观看中文版视频| 亚洲一区二区在线视频| 久视频精品免费观看99| 亚洲另类精品xxxx人妖| 国产成人午夜精品免费视频| 亚洲中文字幕无码av| 在线观看免费精品国产| 鲁啊鲁在线视频免费播放| 区三区激情福利综合中文字幕在线一区亚洲视频1 | 一级毛片免费播放男男| 久久精品亚洲男人的天堂| 99久久婷婷免费国产综合精品| 亚洲国产综合无码一区| 99爱免费观看视频在线| 91亚洲精品自在在线观看| 日本免费一二区在线电影| 一级特黄录像视频免费| 久久精品亚洲一区二区| 美女视频黄a视频全免费| 亚洲av色香蕉一区二区三区蜜桃| 无码欧精品亚洲日韩一区夜夜嗨 | 国产成人yy免费视频| 亚洲欧洲免费无码| 亚洲第一页日韩专区| a级精品九九九大片免费看| 亚洲国产精品久久久久秋霞影院| 天天操夜夜操免费视频| 一级中文字幕免费乱码专区| 亚洲成年轻人电影网站www| 在线播放免费人成视频在线观看| gogo免费在线观看| 亚洲一区精彩视频| 亚洲性久久久影院| 无码国产精品久久一区免费 |