`

飞鸽协议分析

 
阅读更多

最近看到一些朋友在编写网络程序是遇到一些问题,故把以前做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.

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eroswang/archive/2007/12/04/1916721.aspx

分享到:
评论

相关推荐

    网络编程 之 飞鸽传书源码分析

    飞鸽传书的源代码~包含了一些分析,适合于网络编程和协议的分析与学习

    cpp-基于qt实现的mac版飞秋遵循飞秋协议飞鸽扩展协议支持多项飞秋特有功能

    基于qt实现的mac版飞秋,遵循飞秋协议(飞鸽扩展协议),支持多项飞秋特有功能

    飞鸽传书源代码 Visual C++版

    开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就...

    飞鸽传书 协议的核心过程

    分析,飞鸽传书中 ,文件传输的核心过程。 非常详细,透彻。。对于看过飞鸽源码的人,还是有帮助的

    飞鸽传书(IPMessenger) 源码

     开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就...

    局域网飞鸽传书软件的设计与实现.doc

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows 2000/net/xp等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;...

    JAVA局域网飞鸽传书软件设计与实现(源代码+论文)

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows 2000/net/xp等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;...

    [计算机毕设]基于java的局域网飞鸽传书系统设计与实现(源代码+项目报告).zip

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows/net/xp等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;其次,...

    基于java的局域网飞鸽传书系统设计与实现毕业设计(源代码+说明报告)

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows 等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;其次,介绍TCP...

    基于java的局域网飞鸽传书系统设计与实现毕业设计(源代码+项目报告).zip

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows 2000/net/xp等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;...

    JAVA局域网飞鸽传书软件设计与实现(源代码+论文)-jsp-java源程序代码.rar

    本论文的目标是设计一个类似飞鸽传输的局域网通信软件,并分析它在其领域的优势。本设计以C编写,能在windows 2000/net/xp等环境下运行。设计共分为五大模块,分别是:首先,介绍选题背景及意义和国内外研究现状;...

    飞信局域网通讯软件

    (PS:飞鸽协议是开源的,不过飞秋可不是,飞秋虽然同样采用飞鸽协议,但是在此基础上增加修改了不少内容,要兼容飞秋需要用WPE抓包分析飞秋的数据包。) 分层架构模式思想: 所谓分层架构,分层架构并不是一个程序...

    跟姐姐学JSP —— JSP系统清晰的初级教程

    这个分析过程也是定义在http协议中的,像我们这里请求的是/test.jsp这个jsp页面,服务器就会去webapp/ROOT目录下去查找这个test.jsp,然后对它进行解析,运行。 4.在服务器的操作结束后,会生成一个响应(response)...

    JAVA上百实例源码以及开源项目源代码

    例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...

    JAVA上百实例源码以及开源项目

    例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...

    java源码包---java 源码 大量 实例

    例如,容易实现协议的设计。 Java EJB中有、无状态SessionBean的两个例子 两个例子,无状态SessionBean可会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;...

    vc++ 应用源码包_1

    FreeBird2011最初版(模仿飞鸽,可聊天+传文件) 该实例可进行局域网的聊天、一对多、多对一、和多对多的传送和续传,理论上这是我本人的实现目的,而且目前经测试已基本实现了上述功能,而且网速一般有几M/S。另外有...

Global site tag (gtag.js) - Google Analytics