飛鴿協議分析

來源:互聯網
上載者:User
最近看到一些朋友在編寫網路程式是遇到一些問題,故把以前做IPMSG時翻譯的文檔貼過來,希望對網路編程新手有所協助,在尋找編程項目的同學們也可參照此文檔寫出自己的IPMSG。

本文只包含其中幾個比較重要的命令以及運行機制的中文翻譯,更詳細的內容請參照文後的IPMSG 協議英文文檔

聲明:下述協議內容略去了一些在編寫程式過程中沒有用到協議內容,最初的Ipmsg協議是用日文寫的,下面協議內容由本人(cugb_cat)翻譯自Mr.Kanazawa的英文文檔。本翻譯文檔可任意傳播和使用。

        IP信使傳輸協議(第9版草案)         1996/02/21
                2003/01/14 修訂

                H.Shirouzu
            shirouzu@h.email.ne.jp

關於IP信使:
  IP信使使用TCP/UDP協議提供收發訊息及檔案(目錄)。
特性:
IP信使能夠安裝在任何一個安裝了TCP/IP協議棧的作業系統上,使用線上使用者的動態識別機制,可以和線上所有使用者進行資訊交換。
運行機制介紹:
使用TCP/UDP連接埠(預設連接埠為2425),訊息的收發使用UDP協議,檔案(檔案夾)的收發使用TCP協議。
1、   命令字:
1)   基本命令字(32位命令字的低8位)
    IPMSG_NOOPERATION     不進行任何操作
    IPMSG_BR_ENTRY     使用者上線
    IPMSG_BR_EXIT         使用者退出
    IPMSG_ANSENTRY     通報線上
    IPMSG_SENDMSG         發送訊息
    IPMSG_RECVMSG         通報收到訊息
    IPMSG_GETFILEDATA     請求通過TCP傳輸檔案
    IPMSG_RELEASEFILES   停止接收檔案
    IPMSG_GETDIRFILES     請求傳輸檔案夾
2)   選項位(32位命令字的高24位)
IPMSG_SENDCHECKOPT   傳送檢查(需要對方返回確認資訊)
IPMSG_FILEATTACHOPT   傳送檔案選項
3)   附件類型命令(檔案類型命令字的低8位)
IPMSG_FILE_REGULAR   普通檔案
IPMSG_FILE_DIR     目錄檔案
IPMSG_FILE_RETPARENT   返回上一級目錄
2、   資料包格式(使用字串):
1)   資料包格式(版本1的格式)
版本號碼(1):包編號:寄件者姓名:寄件者主機名稱:命令字:附加資訊
2)   舉例如下
“1:100:shirouzu:Jupiter:32:Hello”
3、   資料包處理總述:
1)   使用者識別
當IPMSG 啟動時,命令IPMSG_BR_ENTRY被廣播到網路中,向所有線上的使用者提示一個新使用者的到達(即表示“我來了”);所有線上使用者將把該新上線使用者添加到自己的使用者列表中,並向該新上線使用者發送IPMSG_ANSENTRY命令(即表示“我線上”);該新上線使用者接收到IPMSG_ANSENTRY命令後即將線上使用者添加到自己的使用者列表中。
2)   收發訊息
使用IPMSG_SENDMSG命令發送訊息,訊息內容添加在附加資訊中;在接收訊息時,如果對方要求回信確認(IPMSG_SENDCHECKOPT位開啟),則需發送IPMSG_RECVMSG命令並將對方發送的資料包的編號放在附加資訊中一同發送至發送訊息方
3)   附加檔案的擴充(添加於第9版)
帶有IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG命令可用來傳輸檔案,檔案屬性及內容添加在附加資訊中,檔案內容添加在訊息內容後並以’/0’與之分隔開。傳輸檔案時以下資訊將被添加到訊息內容之後(包括格式):檔案序號:檔案名稱:大小(單位:位元組):最後修改時間:檔案屬性[: 附加屬性=val1[,val2…][:附加資訊=…]]:/a:檔案序號…
(檔案大小、最後修改時間和檔案屬性為十六進位數,如果檔案名稱中包含’:’則使用“::”代替)。
接收端開始接收檔案時,請求傳輸檔案命令IPMSG_GETFILEDATA將發送到發送端的TCP連接埠(和UDP的傳送埠相同),並將發送端發送的包編號:檔案序號:位移量(全為十六進位格式)寫到附加資訊區一同發送,檔案發送端接收到該請求資訊並進行校正正確後即開始傳送檔案(不使用任何格式,亦不進行加密)。
當接收端接收到目錄檔案時,將發送附加資訊區為發送端發送的包編號:檔案序號:位移量(全為十六進位格式)的 IPMSG_GETDIRFILES命令,以用來請求傳輸目錄檔案;發送端則將頭資訊長度:檔案名稱:檔案大小:檔案屬性:檔案內容添加到附加資訊區(除了檔案名稱和檔案內容外,其餘皆為十六進位),頭資訊長度是從頭資訊長度開始到檔案內容前的‘:’分割符為止的字元個數。
當檔案屬性為IPMSG_FILE_DIR時,IPMsg能夠自動識別其為目錄,下一個檔案的資料在該目錄之後。
當檔案屬性為IPMSG_FILE_RETPARENT時,IPMsg識別其動作為返回上一級目錄,在這種情況下,檔案名稱為‘.’其屬性為目前的目錄的值。

附IPMSG協議英文版:

QUOTE:Original ipmsg protocol specification is written in Japanese.
This document was translated by Mr.Kanazawa.
This document is not verified yet.

----------------------------------------------------------------------
    IP Messenger communication protocol (Draft-9)   1996/02/21
                                Modified 2003/01/14

                                    H.Shirouzu
                              shirouzu@h.email.ne.jp
----------------------------------------------------------------------

About IP Messenger
    This is a Send/Receive message service using the TCP/UDP Port.

Characteristics
    IP Messenger can be installed in any OS if TCP/IP is used on your machine.
    Dynamic member recognition can be done within your network or specified network.
    You can exchange messages between all IPMsg members.

Function description
    Use TCP/UDP port(default:2425). See the following descriptions
    (Message Send/Receive: UDP, File Send/Receive: TCP)

1. Command

  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

2.Command format(Use all character strings)

  1) Command(Format version-1)

    Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection

  2) An example for Message Send/Receive by using the current command format

    "1:100:shirouzu:jupiter:32:Hello"

3.Command process overview

  1) Member recognition

    An IPMSG_BR_ENTRY command notifies a new entry to the current
    members at start-up.

    All members add the new member to their list after getting a notification message.
    An IPMSG_ANSENTRY command sends a message back to the new member.

    The new member gets the current member data by a
    IPMSG_ANSENTRY command. All members can communicate as long as an
    IP packet exists.

    An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or
    nickname change to all members. However, an IPMSG_ANSENTRY command
    does not send a message back, which is different from an IPMSG_BR_ENTRY
    command.

    IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands
    use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to
    additional command.
    Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by
    a broadcast command. A member recognition command needs to be
    sent individually to the members with this optional flag.

    (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands
    sends a group name by adding the new group name after the current
    command format character strings (Input '/0' between the current
    command and extended name).

  2) Send/Receive Message
    Send Message uses an IPMSG_SENDMSG command that can input a message
    in the extended area.
    Receive Message sends back an IPMSG_RECVMSG command only
    if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number
    to the extended area.

    Broadcast Message Send uses an IPMSG_BOADCASTOPT command
    and an IPMSG_SENDMSG flag should be ON.
    Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT
    for ping-pong protection. If either one or another packet is ON, then
    confirmation/auto-send packet is not sent back.

    Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON.
    In this case, Receive Message sends an IPMSG_READMSG command.
    Input the original packet number to the extended area.

    (Additional IPMSG_NOADDLISTOPT)
    When receiving an IPMSG_SENDMSG packet from a host that is
    not on your Send/Receive list, IPMsg will either confirm a host by
    sending an IPMSG_BR_ENTRY command or add a host name to
    the Send/Receive list.
    However, single-shot Message Send/Receive action needs to be avoided.
    Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command.

    (Additional IPMSG_READCHECKOPT from version-8 )
    When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag,
    IPMsg process is the same as IPMSG_SENDMSG with an
    IPMSG_SENDCHECKOPT flag.
    However, Send Message uses an IPMSG_ANSREADMSG command,
    not IPMSG_RECVMSG.

  3) Message Send/Receive 亅encrypted extension (Added in the version-9 )

    Use the combination of Public-key(RSA) and common key(RC2/Blowfish).
    (Encrypted extension area is used in hex format.)

    (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive
    Message. Receive Message gets an IPMSG_ANSPUBKEY that
    means receiving RSA public key from Send Message.

    IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is
    encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first
    part of extension

    In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN
    E=Exponent丄N=method)devide by ':'. and Input the Fdelimiter '-'
    between E and N.

    This sequence can be skipped after the 2nd Send/Receive process by
    memorizing public key and encrypted data.
   
    (Encrypted message)After a sender creates a common key that is
    supported both sender and receiver, a common key can encrypt a message.
    In addition, a receiver's public key encrypts the common key.

    (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in
    IPMSG_SENDMSG. At the first part of extension, input the value which
    is 'or' resoult from Convination of public key and common key type .
    Then use common key which encrypt with public key devide by ':'.
    Then input message which is eccrypted by public key devide by ':'.
    If both supports IPMSG_SIGN_XXX, then add ':' and signeture.

    Also, In the method of encode padding, PKCS#1ECB key is used for RSA,
    PKCS#5 CBC common key is used for RC2/blowfish.

    Also, The Packet related to Entry manifestation the capability of
    ecryption support using IPMSG_ENCRYPTOPT

  4) Extension with file attachment(Available from version-9 )

    An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for
    File transfer (download permission)notification sends a message
    with attachment.
    Input '/0' after the message and attachment file data.
   

    fileID:filename:size:mtime:fileattr[:extend-attr=val1
    [,val2...][:extend-attr2=...]]:/a:fileID...
    (size, mtime, and fileattr describe hex format.
      If a filename contains ':', please replace with "::".)

    When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA
    command requests a data transmission packet to the TCP port that is the same number
    as the UDP sending port number. Input packetID:fileID: offset to the extended area.
    (Use all hex format.)
    File Transfer side receives the request. After recognizing that it's a correct request,
    then send the specified data (no format)

    When the data receiving side downloads a hierarchical attachment file,
    use an IPMSG_GETDIRFILES command and input a packetID:fileID
    to the extended area and send a data transmission request packet.
    (all hex format)

    Data sending side sends the following hierarchical data format.
    header-size:filename:file-size:fileattr[:extend-attr=val1
    [,val2...][:extend-attr2=...]]:contents-data
    Next headersize: Next filename...
    (All hex format except for filename and contetns-data)

    header-size is from the beginning of header-size to the delimiter ':'
    that is before contents-data. extend-attr can be omitted and used multiple
    extended attributes. Use '=' for data input.

    When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically
    in the directory, the next file data is after the directory.

    When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns
    to the parent directory. In this case, File name is always "." and the attribute
    value is the current directory data.

    Sending process starts from the attachment directly and returns the
    IPMSG_FILE_RETPARENT command to the attachment directory.

    Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the
    attachment file.

  5) Other commands

    When acquiring different versions, send an IPMSG_GETINFO command.
    Receiving side sends the version information character string to
    extended area.

    Send an IPMSG_GETABSENCEINFO command for acquiring an absence message.
    Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode.
    If the status is not absence mode, a character string "Not absence mode" will be sent back.

  6) Confirmation/Retry

    If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered
    within a specified time, then it will be sent again.
    A number of retry actions or interval period is depended on the current condition.

4. Other

  1) Linefeed

    Linefeed characters in Send Message is standardized with UNIX type ('0x0a').
    Please change if needed.

  2) Delimiter ':'

    ':' is used as a delimiter. You can't use this delimiter for user name
    and host name.
    If the use/host names contain a ':', please replace with another sign,
    for an example ';'.
    Although using this delimiter isn't problem as yet, I may create an
    escape sequence.
   

  3) Kanji codes

    SJIS

5. Contact e-mail address

    E-Mail shirouzu@h.email.ne.jp

Note
    See ipmsg.h for command codes.
    Please e-mail me your comments and suggestions. 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.