IPmsg(飞鸽传书)协议翻译

  最近准备做一个自己的项目练手,系统的巩固一下自己最近学习的知识,网上找了一下,发现IPmsg(飞鸽传书)是个不错的选择:LINUX C/C++、多线程、线程间通信、QT。所以就决定做这个。

  找了很多资料,决定从翻译协议开始,顺便熟悉协议,网上只能找到第9版的英文协议,最新的第十版只有日文,没办法,硬着头皮翻译日文吧。。

  先吐槽一下google、bing、百度三家的翻译质量:google翻译英文很不错,日文感觉一般,bing是友人推荐,翻译日文质量在我意料之外,协议翻译基本也就是参考bing翻译的,google辅助。百度了就要坑很多了,翻译过程可以概述为:分词查字典。根本不做任何语法调整。(如果用这个方法翻英文,我怀疑”HOW ARE YOU“真的就翻成了”怎么试你“。汗。。。。)无力吐槽。。。

  其他不多说了,直接上翻译协议,由于一点日文不懂,翻译的比较烂,见笑了。。

翻译中文版
  1 /******************************************************************
  2  *原始的IPmsg协议规范是由日本人白水启章(H.Shirouzu)先生编写。   *
  3  *本文档是由风之痕(Frank Song)翻译。   2012/10/30
  4  *email:spf.doudou@gmail.com //如果有任何意见和建议,欢迎联系我
  5  ******************************************************************/
  6  
  7 ----------------------------------------------------------------------
  8                      IPmsg通信规范协议(草案第10版)      1996/02/21
  9                                                    修改于 2011/05/03
 10 
 11                                                            H.Shirouzu
 12                                                      http://ipmsg.org
 13 ----------------------------------------------------------------------
 14 
 15 概述:
 16         一个使用TCP/UDP端口接收和发送消息的服务程序。
 17 
 18 功能特点:
 19         IPmsg可以在任何使用TCP/IP协议的操作系统中使用,在你的计算机所在的
 20     网络或者指定的网络中动态识别各个成员,并且可以在所有成员之间传递消息。
 21     
 22 详细信息:
 23     1、命令    
 24         1) 命令类型(命令编号(32位)的低8位)
 25         
 26         IPMSG_NOOPERATION    无操作
 27         IPMSG_BR_ENTRY        进入服务 (启动时对广播)
 28         IPMSG_BR_EXIT        退出服务 (退出时对广播)
 29         IPMSG_ANSENTRY        通知新输入条目
 30         IPMSG_BR_ABSENCE    变更无人值守模式
 31 
 32         IPMSG_BR_ISGETLIST    搜索有效的发送主机成员列表
 33         IPMSG_OKGETLIST        通知发送主机列表
 34         IPMSG_GETLIST        请求发送主机列表
 35         IPMSG_ANSLIST        发送主机列表
 36 
 37         IPMSG_SENDMSG        发送消息
 38         IPMSG_RECVMSG        消息确认
 39 
 40         IPMSG_READMSG        消息读取
 41         IPMSG_DELMSG        消息丢弃
 42         IPMSG_ANSREADMSG    消息读取确认(第8版追加)
 43 
 44         IPMSG_GETFILEDATA    文件传输请求(使用TCP)
 45         IPMSG_RELEASEFILES    文件丢弃
 46         IPMSG_GETDIRFILES    文件夹传输请求
 47 
 48         IPMSG_GETINFO        得到IPmsg版本信息
 49         IPMSG_SENDINFO        发送IPmsg版本信息
 50 
 51         IPMSG_GETABSENCEINFO  收到缺席通知     //
 52         IPMSG_SENDABSENCEINFO 发送缺席通知     //
 53 
 54         IPMSG_GETPUBKEY        取得RSA公钥
 55         IPMSG_ANSPUBKEY        响应RSA公钥
 56         
 57         2) 选项标记类型 (命令编号(32位)的高24位)
 58         
 59         IPMSG_ABSENCEOPT    存在/缺席模式(成员识别命令中使用)
 60         IPMSG_SERVEROPT        服务器模式(预留)
 61         IPMSG_DIALUPOPT        发送单个成员识别命令
 62 
 63         IPMSG_SENDCHECKOPT    传输校验
 64         IPMSG_SECRETOPT        密封消息
 65         IPMSG_READCHECKOPT    密封消息确认(第8版追加)
 66         IPMSG_PASSWORDOPT    挂锁
 67         IPMSG_BROADCASTOPT    广播(报告)
 68         IPMSG_MULTICASTOPT    组播(多选)
 69         IPMSG_NEWMULTIOPT    新版本组播(预留)
 70         IPMSG_NOLOGOPT        不保留日志(建议)
 71         IPMSG_NOADDLISTOPT    通知BR_ENTRY以外的成员
 72         IPMSG_AUTORETOPT    自动应答(防止乒乓球?)(第10版加入)  //
 73 
 74         IPMSG_FILEATTACHOPT    附件
 75         IPMSG_ENCRYPTOPT    密码
 76         IPMSG_ENCEXTMSGOPT    加密的附件信息 (第10版加入)    //
 77 
 78         IPMSG_CAPUTF8OPT    兼容UTF-8   (第10版)
 79         IPMSG_UTF8OPT        全部使用UTF-8 (第10版)
 80         IPMSG_CLIPBOARDOPT    支持图像   (第10版)
 81 
 82         IPMSG_RETRYOPT        重试标志(搜索HOSTLIST时使用)
 83         
 84         3) 加密部分扩展标志 (16进制格式)
 85 
 86         IPMSG_RSA_512        公钥加密(RSA  512bit)
 87         IPMSG_RSA_1024        公钥加密(RSA 1024bit)
 88         IPMSG_RSA_2048        公钥加密(RSA 2048bit)
 89         IPMSG_RC2_40        共用密钥加密(RC2 40bit)
 90         IPMSG_BLOWFISH_128    共用密钥加密(Blowfish 128bit)
 91         IPMSG_AES_256        共用密加密(AES 256bit)
 92         IPMSG_PACKETNO_IV    包字符串使用对称密钥密码  //
 93         IPMSG_ENCODE_BASE64    base64使用共用密钥密码
 94         IPMSG_SIGN_SHA1        明文文本使用SHA1数字签名
 95         
 96         4) 文件类型(fileattr的低8bit)
 97 
 98         IPMSG_FILE_REGULAR
 99         IPMSG_FILE_DIR
100         IPMSG_FILE_RETPARENT
101         IPMSG_FILE_SYMLINK
102         IPMSG_FILE_CDEV
103         IPMSG_FILE_BDEV
104         IPMSG_FILE_FIFO
105         IPMSG_FILE_RESFORK
106 
107         5) 文件属性(fileattr的高24bit)
108 
109         IPMSG_FILE_RONLYOPT
110         IPMSG_FILE_HIDDENOPT
111         IPMSG_FILE_EXHIDDENOPT
112         IPMSG_FILE_ARCHIVEOPT
113         IPMSG_FILE_SYSTEMOPT
114 
115         6) 文件属性扩展部分
116     
117         IPMSG_FILE_UID
118         IPMSG_FILE_USERNAME
119         IPMSG_FILE_GID
120         IPMSG_FILE_GROUPNAME
121         IPMSG_FILE_PERM
122         IPMSG_FILE_MAJORNO
123         IPMSG_FILE_MINORNO
124         IPMSG_FILE_CTIME
125         IPMSG_FILE_MTIME
126         IPMSG_FILE_ATIME
127         IPMSG_FILE_CREATETIME
128 
129         IPMSG_FILE_CREATOR
130         IPMSG_FILE_FILETYPE
131         IPMSG_FILE_FINDERINFO
132 
133         IPMSG_FILE_ACL
134         IPMSG_FILE_ALIASFNAME
135         
136     2、命令格式(所有都表示为字符串)
137         1)命令(版本 1138         Ver(1):包号:用户名:主机名:命令编号:附加部分
139         2)使用当前命令格式收/发消息示例:
140         "1:100:shirouzu:jupiter:32:Hello"
141         
142     3、命令处理概述
143         1)成员识别
144         
145         在启动时,IPMSG_BR_ENTRY广播通知所有已存在的成员,正在启动一个新的成员主机。
146         
147         广播之后,所有的成员把新成员加入到他们的列表中,一个IPMSG_ANSENTRY命令返回
148         给新成员。(注:win版本的IP地址范围和成员数目随机等待0-4秒)
149         
150         新成员通过IPMSG_ANSENTRY命令得到现有成员的数据,只要有一个IP数据包存在,所有
151         的成员都可以进行通信。
152         
153         IPMSG_BR_ABSENCE广播可以告诉所有成员无人值守模式或者昵称的变化。(与IPMSG_BR_ENTRY
154         命令不同,收到后IPMSG_ANSENTRY不返回)
155         
156         IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE命令使用IPMSG_ABSENCEOPT标志作为无人
157         模式或者昵称添加的命令。
158         IPMSG_DIALUPOPT命令用于拨号上网等不能接受广播的成员,此标志需要单独向成员发送确认命令。
159         
160         (扩展组:)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE告诉成员如果输入的是传统
161         字符串,将会把组名设置为他所属组的名字。
162         
163         2)收/发消息
164         
165         使用IPMSG_SENDMSG发送消息,消息被放在命令的扩展区。接受方IPMSG_SENDCHECKOPT标志为ON
166         的话就只返回扩展区带有数据包编号的IPMSG_RECVMSG命令。
167         
168         发送广播时使用IPMSG_BOADCASTOPT命令,IPMSG_SENDMSG标志为ON。自动发送的包添加
169         IPMSG_AUTORETOPT命令进行ping-pong保护,如果有一包为ON,确认/自动发送包不返回。
170         
171         发送信息密封需要一个为ON的IPMSG_SECRETOPT包。这样,接收端讲发送一个扩展区带有包编号
172         的IPMSG_READMSG命令。
173         
174         (追加:IPMSG_NOADDLISTOPT)
175         当从不再主机列表的中的主机收到 IPMSG_SENDMSG包时,IPmsg将会发送一个IPMSG_BR_ENTRY命令,
176         以确认主机是否存在,或者把主机加入主机列表中。但这种行为是应该被避免的,所以应该在
177         IPMSG_SENDMSG包中添加IPMSG_NOADDLISTOPT标志。
178         
179         (第8版追加:IPMSG_READCHECKOPT )
180         IPmsg处理带有IPMSG_READCHECKOPT标志的IPMSG_READMSG命令和处理带有IPMSG_SENDCHECKOPT标
181         志的IPMSG_SENDMSG命令是一样的,但是前者用IPMSG_ANSREADMSG应答,后者用IPMSG_RECVMSG。
182         
183         此外,消息嵌入图像文件类型如4)中所述。(第10版加)
184         
185         3)收/发消息加密(第9版加)
186         
187         公钥与共钥配合使用。做为一般规则,加密用十六进制的格式。然而,IPMSG_ENCODE_BASE64具有
188         加密消息的功能,使用共通钥部分base64描述的方式,而不是十六进制。(第10版追)
189         
190         (公钥的取得)向接收方发送IPMSG_GETPUBKEY命令,对方接受IPMSG_ANSPUBKEY,从而获取公钥。
191         IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY开头的主机加密标志(IPMSG_RSA_2048 等)应设置为OR。
192         (详细信息见“13)加密标志”部分)
193         
194         此外,在IPMSG_ANSPUBKEY中,公共密钥按照EE-NNNNNN(E=指数,N=方法)方式用“:”分开。同时,
195         在E和N中间添加“-”。这个序列在随后的收/发处理中可以通过记录公钥和加密信息来跳过。
196         
197         (信息加密)当发送方建立一个收/发双方的共用密钥后,就用它来加密信息,另外,接收方的公钥
198         加密共用密钥。应该注意是否有组合执行限制(其他参考 4)。
199         
200         (加密信息传输)在IPMSG_SENDMSG中设置IPMSG_ENCRYPTOPT标志。在扩展部分开始区域,加入公钥
201         和共用密钥的OR值。然后用以‘:’分隔的公钥加密共用密钥。(如果你使用了IPMSG_ENCODE_BASE64,
202         则会使用bash64编码,而不是十六进制)公钥加密共用密钥,共用密钥加密消息、明文和末尾的‘\0’。
203         
204         (电子签名选项)如果两者都支持SHA-1电子签名,则设置IPMSG_SIGN_SHA1。明文的SHA-1值用私钥
205         加密,上述的加密正文追加在‘:’后边。
206         
207         另外,在编码方式方面,RSA公钥根据密码/署名为PKCS#1-v1_5,AES/Blowfish/RC2共用密钥和使用
208         PKCS#5 CBC加密。
209         PMSG_PACKETNO_IV设置:IV是Packet使用的号码字符串(IV比较短的时候用0补全),如果IV不为0,
210         IPMSG_PACKETNO_IV就要被设置。
211         
212         另外,Entry包如果设置了IPMSG_ENCRYPTOPT 标志,表明支持加密功能。
213         
214         (用户名公钥指纹)(第10版加)
215         在末尾的用户名和SHA-1数字签名可以授予使用2048bitRSA,使用公钥指纹(下述)。
216         1)帮助保持用户名的唯一性
217         2)你可以使用假公钥防止身份信息被盗(收到信息后确认IPMSG_ANSPUBKEY与指纹相匹配)
218         
219         创建用户名公钥指纹
220         1)生成公钥的SHA-1摘要值(160位)
221         2)末尾添加32位0成为192位的值
222         3)192位到64为分为3各字段,用XOR运算三个字段
223         4)64位值固定为16个字的十六进制字符串
224         5)以指纹字符串的形式把指纹添加到用户名末尾
225         
226         此外,即使使用用户名公钥指纹,如果Entry包没有IPMSG_ENCRYPTOPT 或
227         IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY的加密能力不包括IPMSG_RSA_2048/IPMSG_SIGN_SHA1 ,
228         我建议你销毁报文。
229         
230         4)文件扩展部分(第九版追加)
231         
232         包含IPMSG_FILEATTACHOPT位的IPMSG_SENDMSG文件传输命令标志着有附件信息。
233        在信息后和附件信息后加入'\0'234 
235         fileID:filename:size:mtime:fileattr[:extend-attr=val1
236         [,val2...][:extend-attr2=...]]:\a[:]fileID...
237         (大小,修改时间,十六进制描述的文件属性,如果文件名中含有'',请用"::"替代。)
238         
239         当接收信息下载附件文件时,IPMSG_GETFILEDATA命令请求和UDP一样的TCP数据传输包端口。
240         在扩展区域添加packetID:fileID: offset(均使用十六进制格式)
241         文件发送方收到请求并判定它是正确的请求之后发送指定数据。(无格式)
242         
243         当数据接收方下载划分的附件文件时,使用IPMSG_GETDIRFILES命令,并且将packetID:fileID
244         写入扩展区域,发送数据传输请求包。(均使用十六进制)
245         
246         数据发送方发送下面划分的数据格式:
247         header-size:filename:file-size:fileattr[:extend-attr=val1
248         [,val2...][:extend-attr2=...]]:contents-data
249         下一个headersize:下一个filename...
250         (除了文件名和内容数据之外均使用十六进制格式)
251         
252         header-size是从header-size开始到内容数据前的分隔符':'结束。扩展属性可以忽略并且
253         使用多扩展属性。使用'='for 数据输入。
254         
255         当文件属性是IPMSG_FILE_DIR,飞鸽自动判定它是在目录中,下一个文件数据在目录之后。
256         
257          当文件属性是IPMSG_FILE_RETPARENT,飞鸽判定它返回到父目录。在这种情况之下,文件名
258          总是'.'并且属性值是当前目录信息。
259         
260         开始发送附件并且返回IPMSG_FILE_RETPARENT命令到附件目录。
261         
262         另外,Entry包添加IPMSG_FILEATTACHOPT 标志表明支持附件文件。
263         
264         (附件文件加密)在Entry包使用了IPMSG_SENDMSG和IPMSG_ENCEXTMSGOPT 的情况下,你可以
265         继续用上面的格式写‘\0’结束的明文信息,整个消息内容都会得到加密。
266         
267         (添加图像附件)图像被粘贴到普通信息里面,以发送正常附件文件的形式发送。但是,指
268         定文件属性的IPMSG_FILE_CLIPBOARD 。在文件名字段中指定的文件,要包裹文件的类型扩展
269         名,通常使用PNG格式。
270         嵌入图像的位置信息,IPMSG_FILE_CLIPBOARDPOS=推荐的插入偏移位置可以用上面说的
271         extend-attr=val(都用十六进制表示)。但是,如果想插入多张图片,已经存在的图片
272         算作之前存在的一个字符。
273         
274         另外,Entry包设置IPMSG_CLIPBOARDOPT来表明主机支持图像嵌入。
275         
276         5)多语言扩展(UTF-8277         
278         主机可以通过UTF-8发/收消息和文件来支持多语言通信。IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE
279         通过设置IPMSG_CAPUTF8OPT标志表明可能使用UTF-8。如果IPMSG_CAPUTF8OPT设置IPMSG_UTF8OPT,
280         你就可以用UTF-8发送数据包(包含文件附件消息部分)
281         
282         如果你接受附件文件的原信息中设置了IPMSG_UTF8OPT ,同时IPMSG_GETFILEDATA命令设置了IPMSG_UTF8OPT,
283         就可以接收数据的UTF-8形式的文件/目录的名称。
284         
285         BR包(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE)中不能IPMSG_UTF8OPT标明UTF-8的使用。(现
286         有的非UTF-8客户端会出现问题)。因此,BR包后边加\0\n两个字节(如果不扩展的组名称,插入一个
287         '\0'作为虚拟名称,IPmsg会继续插入\0\n,即:\0\0\n)
288         之后,UTF-8中添加下面的项:
289         UN:用户名\n
290         HN:主机名\n
291         NN:昵称\n
292         GN:组名\n
293         另外,仅由ASCII码标识条目或者不存在的条目可以省略。
294         以上扩展如果与以前的不同看,以扩展的为标准。
295         
296         6)其他命令
297         
298         发送 IPMSG_GETINFO 命令来得到其他成员的IPmsg版本。接收方的版本信息通过
299         IPMSG_SENDINFO发送回来。
300         
301         发送IPMSG_GETABSENCEINFO命令来得到成员缺席通知。如果你设置了无人模式通知,
302         接收方发送IPMSG_SENDABSENCEINFO。当离开的时候发送一个字符串(如:“Not absence mode”等)
303         
304         7)确认/重试
305         
306         对于IPMSG_SENDMSG 和IPMSG_RECVMSG 发送的数据包,要在一定时间内确认,如果确认超时,
307         则重发数据包。重试次数和超时时间依赖于实现。
308         
309     4、其他
310         
311         1)关于换行
312         
313         消息中的换行符统一为UNIX格式(‘0x0a’),如有必要,请进行转换。
314         
315         2)分隔符
316         
317         用户名、主机名后使用':'分隔符,包含':'的名字不能使用分隔符。万一用户名主机名中包含
318         ':',请使用其他符号(如:';')代替。
319         
320         3)字符码
321         
322         如果设置了IPMSG_UTF8OPT,使用UTF-8,如果没有,使用CP932。
323         
324         4)加密的组合
325         
326         协议中没有可参考的实现,windows版本中,只支持下面3种:
327         
328             1. IPMSG_RSA_2048 / IPMSG_AES_256      ... (*1)
329             2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2)
330             3. IPMSG_RSA_512  / IPMSG_RC2_40
331         
332         (*1)IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1支持选线
333         (*2)IPMSG_PACKETNO_IV支持选项
334         
335     5、联系信息
336             
337             在http://ipmsg.org 中。
338     
339     
340 附录
341     
342         命令代码,请参阅 ipmsg.h。
343         如果有任何建议,请发送给我。    
原日文版
  1 (Japanese)
  2 ----------------------------------------------------------------------
  3         IP Messenger 通信プロトコル仕様(ドラフト10版)     1996/02/21
  4                                                     Modify 2011/05/03
  5 
  6                                                            H.Shirouzu
  7                                                      http://ipmsg.org
  8 ----------------------------------------------------------------------
  9 
 10 概要
 11     TCP/UDP Port を使用した、メッセージ送受信サービスです
 12 
 13 特徴
 14     TCP/IP が使えれば OS の種類を問いません。自分のいるネットワーク
 15     内(および指定のネットワーク)で、動的なメンバ認識ができます。
 16     メッセージ送信そのものは、IP接続している全メンバに対し行えます。
 17 
 18 詳細
 19     TCP/UDP ポート(default:2425)を使用して、以下の方法で処理します。
 20     (メッセージ送受信:UDP、ファイル送受信:TCP を使用)
 21 
 22   1.コマンド
 23 
 24      1) コマンド種類 (command番号(32bit)のうち、下位8bit)
 25 
 26     IPMSG_NOOPERATION    無操作
 27     IPMSG_BR_ENTRY        サービスにエントリ(起動時にBroadcast)
 28     IPMSG_BR_EXIT        サービスから抜ける(終了時にBroadcast)
 29     IPMSG_ANSENTRY        エントリを認識したことを通知
 30     IPMSG_BR_ABSENCE    不在モード変更
 31 
 32     IPMSG_BR_ISGETLIST    ホストリスト送出可能メンバの探索
 33     IPMSG_OKGETLIST        ホストリスト送出可能通知
 34     IPMSG_GETLIST        ホストリスト送出要求
 35     IPMSG_ANSLIST        ホストリスト送出
 36 
 37     IPMSG_SENDMSG        メッセージの送信
 38     IPMSG_RECVMSG        メッセージの受信確認
 39 
 40     IPMSG_READMSG        封書の開封通知
 41     IPMSG_DELMSG        封書破棄通知
 42     IPMSG_ANSREADMSG    封書の開封確認(8 版から追加)
 43 
 44     IPMSG_GETFILEDATA    添付ファイル要求(TCP で使用)
 45     IPMSG_RELEASEFILES    添付ファイル破棄
 46     IPMSG_GETDIRFILES    添付階層ファイル要求
 47 
 48     IPMSG_GETINFO        IPMSGバージョン情報取得
 49     IPMSG_SENDINFO        IPMSGバージョン情報応答
 50 
 51     IPMSG_GETABSENCEINFO  不在通知文取得
 52     IPMSG_SENDABSENCEINFO 不在通知文応答
 53 
 54     IPMSG_GETPUBKEY        RSA 公開鍵取得
 55     IPMSG_ANSPUBKEY        RSA 公開鍵応答
 56 
 57      2) オプションフラグ種類 (command番号(32bit)のうち、上位24bit)
 58 
 59     IPMSG_ABSENCEOPT    不在モード(メンバ認識系コマンドで使用)
 60     IPMSG_SERVEROPT        サーバー(予約)
 61     IPMSG_DIALUPOPT        メンバ認識系のコマンドを個別に送り返す
 62 
 63     IPMSG_SENDCHECKOPT    送信チェック
 64     IPMSG_SECRETOPT        封書
 65     IPMSG_READCHECKOPT    封書確認(8 版から追加)
 66     IPMSG_PASSWORDOPT    錠前
 67     IPMSG_BROADCASTOPT    ブロードキャスト(同報)
 68     IPMSG_MULTICASTOPT    マルチキャスト(複数選択)
 69     IPMSG_NEWMULTIOPT    ニューバージョンマルチキャスト(予約)
 70     IPMSG_NOLOGOPT        ログに残さない(ことを推奨)
 71     IPMSG_NOADDLISTOPT    BR_ENTRYしていない一時メンバ通知
 72     IPMSG_AUTORETOPT    自動応答(ピンポン防止用)
 73 
 74     IPMSG_FILEATTACHOPT    ファイル添付
 75     IPMSG_ENCRYPTOPT    暗号
 76     IPMSG_ENCEXTMSGOPT    ファイル添付情報を暗号文に含める
 77 
 78     IPMSG_CAPUTF8OPT    UTF-8を使用する能力がある
 79     IPMSG_UTF8OPT        メッセージ全体に UTF-8を使用している
 80     IPMSG_CLIPBOARDOPT    メッセージ画像埋め込み添付をサポート
 81 
 82     IPMSG_RETRYOPT        再送フラグ(HOSTLIST 取得時に使用)
 83 
 84      3) 暗号拡張部用フラグ (拡張部に組み合わせを hex 表現で使用)
 85 
 86     IPMSG_RSA_512        公開鍵(RSA  512bit)暗号能力
 87     IPMSG_RSA_1024        公開鍵(RSA 1024bit)暗号能力
 88     IPMSG_RSA_2048        公開鍵(RSA 2048bit)暗号能力
 89     IPMSG_RC2_40        共通鍵(RC2 40bit)暗号能力
 90     IPMSG_BLOWFISH_128    共通鍵(Blowfish 128bit)暗号能力
 91     IPMSG_AES_256        共通鍵(AES 256bit)暗号能力
 92     IPMSG_PACKETNO_IV    共通鍵暗号の IV に Packet番号文字列を利用
 93     IPMSG_ENCODE_BASE64    暗号文の共通鍵以降の記述に base64 を利用
 94     IPMSG_SIGN_SHA1        平文に SHA1電子署名を付与
 95 
 96      4) 添付ファイル拡張用ファイル種類(fileattr下位8bit)
 97 
 98     IPMSG_FILE_REGULAR
 99     IPMSG_FILE_DIR
100     IPMSG_FILE_RETPARENT
101     IPMSG_FILE_SYMLINK
102     IPMSG_FILE_CDEV
103     IPMSG_FILE_BDEV
104     IPMSG_FILE_FIFO
105     IPMSG_FILE_RESFORK
106 
107      5) 添付ファイル拡張用ファイル属性(fileattr上位24bit)
108 
109     IPMSG_FILE_RONLYOPT
110     IPMSG_FILE_HIDDENOPT
111     IPMSG_FILE_EXHIDDENOPT
112     IPMSG_FILE_ARCHIVEOPT
113     IPMSG_FILE_SYSTEMOPT
114 
115      6) 添付ファイル拡張用拡張ファイル属性
116 
117     IPMSG_FILE_UID
118     IPMSG_FILE_USERNAME
119     IPMSG_FILE_GID
120     IPMSG_FILE_GROUPNAME
121     IPMSG_FILE_PERM
122     IPMSG_FILE_MAJORNO
123     IPMSG_FILE_MINORNO
124     IPMSG_FILE_CTIME
125     IPMSG_FILE_MTIME
126     IPMSG_FILE_ATIME
127     IPMSG_FILE_CREATETIME
128 
129     IPMSG_FILE_CREATOR
130     IPMSG_FILE_FILETYPE
131     IPMSG_FILE_FINDERINFO
132 
133     IPMSG_FILE_ACL
134     IPMSG_FILE_ALIASFNAME
135 
136 
137   2.コマンドフォーマット(すべて文字列として表現)
138 
139      1) コマンド(フォーマットバージョン1)
140 
141     Ver(1) : Packet番号 : 自User名 : 自Host名 : Command番号 : 追加部
142 
143      2) 現在のコマンドフォーマットによるメッセージの送信文字列例
144 
145     "1:100:shirouzu:jupiter:32:Hello"
146 
147 
148   3.コマンド処理概要
149 
150      1) メンバ認識
151 
152     起動時に、IPMSG_BR_ENTRY コマンドをブロードキャストし、すでに
153     立ち上がっているメンバに、新規参加を知らせます。
154 
155     このブロードキャストにより、すでに立ち上がっているメンバは、
156     自分の送信先リストに新規参加メンバの情報を追加します。さらに、
157     IPMSG_ANSENTRY コマンドをその新規参加メンバに対し、返信します。
158     (備考: Win版では、メンバ数やIPアドレス距離等に基づいて、0-4秒
159      程度のランダムな待ちを入れています)
160 
161     新規参加メンバは、この IPMSG_ANSENTRY を受信することにより、
162     すでに立ち上がっている全メンバの情報を得ることができます。
163     したがい、IPパケットが失われない限りは、全てのメンバが同一の
164     送信先リストを保持できるというわけです。
165 
166     不在モードやニックネームの変更などを、メンバ全員に通知するには、
167     IPMSG_BR_ABSENCE をブロードキャストします。(IPMSG_BR_ENTRY と
168     違い、受け取ったメンバは IPMSG_ANSENTRY を返しません)
169 
170     IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE コマンドでは、
171     不在モードにあわせて IPMSG_ABSENCEOPT を立てて、コマンドの追加
172     部にはニックネームを入れます。また、ダイアルアップユーザなど、
173     ネットワーク指定のブロードキャストが届かないメンバは、さらに、
174     IPMSG_DIALUPOPT を立てます。このオプションが立っているメンバに
175     は、メンバ認識系のコマンドを個別に送出します。
176 
177     (グループ化拡張)IPMSG_BR_ENTRY, IPMSG_ANSENTRY, IPMSG_BR_ABSENCE
178     において、従来のコマンドフォーマット文字列に続いて('\0'を挟んで)
179     グループ名を入れることによって、自分の所属(設定)するグループ名
180     を伝えることができます。
181 
182      2) メッセージ送受信
183 
184     メッセージ送信には IPMSG_SENDMSG を使用し、拡張部にメッセージ
185     本体を入れます。受信側は、IPMSG_SENDCHECKOPT が立っている場合
186     に限り、IPMSG_RECVMSG を返します。拡張部には元のパケット番号を
187     入れます。
188 
189     ブロードキャストによるメッセージ送信は、IPMSG_BOADCASTOPT を
190     立てた IPMSG_SENDMSG を使用します。(不在通知文など)自動送出
191     されるパケットには、ピンポン防止のため IPMSG_AUTORETOPT をつけ
192     ます。どちらかのオプションが立っているパケットには、確認および
193     自動送出パケットを返しません。
194 
195     封書で送出するには、IPMSG_SECRETOPT を立てたパケットを送出しま
196     す。この場合、受信側は開封時に IPMSG_READMSG を送出します。
197     拡張部には元のパケット番号を入れます。
198 
199     (追加された、IPMSG_NOADDLISTOPT について)
200     自分の送信先リストに載っていないホストからの IPMSG_SENDMSG
201     パケット到着時には、
202     ・ 送信先に IPMSG_BR_ENTRY を送信して、ホスト存在確認を行う
203     ・ 直接自分の送信先リストに加える
204     のいずれかの処理を行うことにより、エントリー系パケット取りこぼ
205     しをフォローする実装が考えられます。しかし、エントリーを行わな
206     い単発メッセージ送信の場合は、これは望ましくない動作ですので、
207     この場合は受信ホストにそのようなフォロー動作をしないことを推奨
208     するため、IPMSG_SENDMSG に IPMSG_NOADDLISTOPT フラグを立てます。
209 
210     (8版で追加された、IPMSG_READCHECKOPT について)
211     IPMSG_READMSG に、IPMSG_READCHECKOPT がついていた場合、丁度、
212     IPMSG_SENDMSG における IPMSG_SENDCHECKOPT のように処理します。
213     ただし、返信には、IPMSG_RECVMSG ではなく、IPMSG_ANSREADMSG
214     を使用します。
215 
216     なお、メッセージの画像埋め込みは 4)ファイル添付拡張にて説明。
217 
218      3) メッセージ送受信-暗号化拡張(9版で追加)
219 
220     公開鍵(RSA)と共通鍵(AES/Blowfish/RC2)を組み合わせて実現します。
221     暗号関連の拡張部は原則として、hex フォーマットで表します。
222     ただし、暗号対応能力(後述)に IPMSG_ENCODE_BASE64 が含まれ
223     ている暗号メッセージ送信では、共通鍵部分以降の記述について
224     hex の代わりに、base64 で記述します。(10版で追加)
225 
226     (公開鍵取得)まず受信側に IPMSG_GETPUBKEY を送信します。相手
227     から IPMSG_ANSPUBKEY を受け取ることにより、相手側 RSA 公開鍵
228     を得ます。IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY ともに、拡張部の最初
229     に自ホストの暗号対応能力(IPMSG_RSA_2048 等)をフラグの OR で
230     表した値を入れます。
231     (フラグ詳細は「1. 3) 暗号拡張部用フラグ」をご覧ください)
232 
233     さらに、IPMSG_ANSPUBKEY では':'を挟んで、公開鍵を EE-NNNNNN
234     (E=指数、N=法)という形を入れます。E と N の間には '-'235     入れて、区切りにします。
236     なお、2度目以降の送信時には、公開鍵および暗号対応能力を記憶
237     することにより、このシーケンスを省略することができます。
238 
239     (メッセージ暗号化)送信側は、両者でサポートしている共通鍵
240     種類を選んでセッション用共通鍵を作り、その共通鍵を用いて本文
241     を暗号化します。さらにその共通鍵を相手側公開鍵で暗号化します。
242     なお、実装により組み合わせに制限があります(4. その他を参照)
243 
244     (暗号メッセージ送信)IPMSG_SENDMSG に IPMSG_ENCRYPTOPT を
245     を立てて、拡張部の最初に、暗号化に使用した公開鍵/共通鍵種類
246     の組み合わせを OR で表現した値を入れます。続いて、':' を入れ
247     た後、(これ以降 IPMSG_ENCODE_BASE64 を立てた場合は hex の
248     代わりに base64 で記述します)、公開鍵で暗号化した共通鍵、
249     ':' を挟んで、共通鍵で暗号化した本文を入れます。
250     なお、平文には末尾の'\0'を含めます。
251 
252     (電子署名オプション)両者が SHA-1による電子署名をサポート
253     している場合、IPMSG_SIGN_SHA1 立てた上で、平文への SHA-1ダイ
254     ジェスト値を自分自身の秘密鍵で暗号化した署名を、上記の暗号化
255     本文に続けて ':'をはさんで追加します。
256 
257     なお、エンコード・パディング方式については、RSA 公開鍵による
258     暗号/署名では PKCS#1-v1_5、AES/Blowfish/RC2 共通鍵による暗号
259     化は PKCS#5 CBC を使用します。
260     IPMSG_PACKETNO_IV が立っている場合、IV は Packet番号文字列を
261     利用します。(IV サイズより短いため、残りは 0 で補完します)
262     IPMSG_PACKETNO_IV が立っていない場合、IV は 0 となります。
263 
264     また、Entry 系パケットには IPMSG_ENCRYPTOPT を立て、暗号機能
265     をサポート可能であることを表明します。
266 
267     (公開鍵指紋付ユーザ名)(10版で追加)
268     2048bitRSA かつ SHA-1 署名が利用可能なユーザは、ユーザIDの
269     末尾に、公開鍵を利用した指紋(後述)を付与することで、
270      1) ユーザ名の一意性を保ちやすくする
271      2) 公開鍵詐称によるなりすましを防ぐ(IPMSG_ANSPUBKEY受信時
272        に鍵と指紋の一致を確認)
273     ことができます。
274 
275     公開鍵指紋付きユーザ名は以下のようにして作成します。
276      1) 公開鍵の法に対する SHA-1 ダイジェスト値(160bit)を生成
277      2) 末尾に 32bit の 0 を付与して、192bit の値とする
278      3) 192bit を 64bit*3つのフィールドに分割し、3つを XORする
279      4) 64bit値を16文字固定のhex文字列化する
280      5) ユーザ名の末尾に、ユーザ名-<指紋文字列> の形式で指紋を付加
281 
282     なお、この公開鍵指紋付ユーザ名を使っているにもかかわらず、
283     Entry系に IPMSG_ENCRYPTOPT フラグが立っていない、もしくは
284     IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY での暗号対応能力 に、
285     IPMSG_RSA_2048/IPMSG_SIGN_SHA1 が含まれていない場合は、
286     不正パケットとして破棄することを推奨します。
287 
288      4) ファイル添付拡張(9版で追加)
289 
290     ファイル添付(ダウンロード許可)通知するには、IPMSG_SENDMSG
291     に IPMSG_FILEATTACHOPT を立てたメッセージを送信します。
292     その際、通常(or 暗号)メッセージに続けて、'\0'をはさんで、
293     添付(ダウンロード許可)ファイル情報を列挙します。
294 
295     fileID:filename:size:mtime:fileattr[:extend-attr=val1
296     [,val2...][:extend-attr2=...]]:\a[:]fileID...
297     (なお、size, mtime, fileattr は hex で表現します。
298      filenameに':'がある場合、"::"でエスケープします)
299 
300     受信側が添付ファイルをダウンロードしたい場合、送信元UDPポート
301     と同じ番号のTCPポートに対して、IPMSG_GETFILEDATA コマンドを使
302     い、拡張部に packetID:fileID:offset を入れて、データ送信要求
303     パケットを出します。(すべてhex)
304     添付側がそのリクエストを受信して、送信要求を正しいと認めると、
305     その通信路に該当ファイルのデータを流します(フォーマットなし)
306 
307     受信側が階層添付ファイルをダウンロードしたい場合は、コマンド
308     に IPMSG_GETDIRFILES を使い、拡張部に packetID:fileID を入れて
309     データ送信要求パケットを出します。(すべてhex)
310 
311     データ送信側は、以下のフォーマットで階層データを流します。
312     header-size:filename:file-size:fileattr[:extend-attr=val1
313     [,val2...][:extend-attr2=...]]:contents-data
314     次のheadersize:次のfilename...
315     (filename と contetns-data 以外はすべて hex)
316 
317     header-size は header-size の先頭から contents-data の直前の
318     ':'までのサイズをあらわします。extend-attr は省略可かつ複数
319     存在可能な拡張属性で、'='で対応するデータ値を入れます。
320 
321     fileattr が IPMSG_FILE_DIR の場合、自動的にそのディレクトリに
322     潜った状態とみなして、後続のファイル情報が続きます。
323 
324     fileattr が IPMSG_FILE_RETPARENT の場合、親ディレクトリに戻
325     ることを表し、ファイル名は常に"."です。このときの属性値は、
326     親ディレクトリに戻る前の、現在ディレクトリの情報を表します。
327 
328     送信は添付ディレクトリ自体から開始し、最後に添付ディレクトリ
329     に戻る IPMSG_FILE_RETPARENT 情報を送信して終了を伝えます。
330 
331     なお、Entry 系パケットに IPMSG_FILEATTACHOPT を立て、ファイル
332     添付をサポート可能であることを表明します。
333 
334     (添付ファイル名暗号化)上記フォーマット内容を、メッセージ平文
335     末尾から '\0' に続けて記述した後、メッセージ全体の暗号化を行う
336     ことができます。その場合、Entry系パケットおよび IPMSG_SENDMSG
337     に IPMSG_ENCEXTMSGOPT を立てます。
338 
339     (メッセージ画像埋め込み添付)メッセージに貼り付けられた画像
340     は、通常のファイル添付として送られます。ただし、fileattr に
341     IPMSG_FILE_CLIPBOARD を指定します。ファイル名フィールドには、
342     添付したい画像種類の拡張子を含むダミーファイル名を指定します。
343     通常は PNG を使います。
344     メッセージへの画像埋め込み位置は、上記の extend-attr=val の形
345     で IPMSG_FILE_CLIPBOARDPOS=挿入用推奨オフセット位置(文字単位)
346     を指定します(すべてhex表現)。ただし、複数の画像を挿入する場合、
347     自画像よりも前に存在する画像も1文字としてカウントします。
348 
349     なお、メッセージ画像埋め込みをサポートしているホストは、Entry系
350     パケットに IPMSG_CLIPBOARDOPT を立てます。
351 
352      5) 多言語(UTF-8)拡張
353 
354     ファイル送受信を含むメッセージの送受信で UTF-8 での多言語通信を
355     行えるホストは、IPMSG_BR_ENTRY/IPMSG_ANS_ENTRY/IPMSG_BR_ABSENCE
356     コマンドで IPMSG_CAPUTF8OPT を立てたパケットを流すことで、UTF-8
357     での送受信が可能であることを表明します。お互いが IPMSG_CAPUTF8OPT
358     をサポートしている場合、IPMSG_UTF8OPT を立てた上で、メッセージ
359     (ファイル添付メッセージ部分を含む)を UTF-8 で表現したパケット
360     を送信することができます。
361 
362     添付ファイルを受信する場合、元の添付メッセージに IPMSG_UTF8OPT
363     が立っていれば、同じく IPMSG_UTF8OPT を立てた IPMSG_GETFILEDATA
364     コマンドで添付ファイル転送要求を送ることで、ファイル名/ディレク
365     トリ名をUTF-8 で表現したデータを受信することができます。
366 
367     BR系パケット(IPMSG_BR_ENTRY/IPMSG_BR_EXIT/IPMSG_BR_ABSENCE) に
368     ついては、IPMSG_UTF8OPT による UTF-8表現は使えません(既存の
369     非UTF-8クライアントに問題が発生するためです)。そのため、
370     BR系パケットでは、グループ名拡張の末尾に続いて、\0\n の 2バイト
371     を付加(グループ名拡張を入れない場合、ダミーのグループ名として
372     \0 を挿入した後、\0\n を続けます。つまり、\0\0\n となります)
373     した後、UTF-8 で以下のエントリを追加します。
374      UN:ユーザ名\n
375      HN:ホスト名\n
376      NN:ニックネーム\n
377      GN:グループ名\n
378     なお、ASCIIのみで表現可能なエントリや存在しないエントリは
379     省略して構いません。上記拡張と従来のフィールドが異なる場合、
380     拡張エントリを正しいものと解釈します。
381 
382      6) その他のコマンド
383 
384     他のメンバのバージョンを取得するには、IPMSG_GETINFO コマンド
385     を送ります。受信側は拡張部にバージョン情報の文字列を設定した
386     IPMSG_SENDINFO を送り返します。
387 
388     不在モードメンバの不在通知文を取得するには、IPMSG_GETABSENCEINFO
389     コマンドを送ります。受信側は、不在モード中なら不在通知文を設定
390     した、IPMSG_SENDABSENCEINFO を送り返します。不在モード中でない
391     場合、適当な文字列("Not absence mode"など)を送り返します。
392 
393      7) 確認・リトライ
394 
395     一定時間以内に確認パケット(IPMSG_SENDMSG に対する、
396     IPMSG_RECVMSG など)が受け取れなかった場合、同一のパケットを
397     再送出します。リトライの回数・間隔については、実装依存です。
398 
399 
400   4. その他
401 
402      1) 改行について
403 
404     送出メッセージ内の改行文字は、UNIX形式に統一します('0x0a')。
405     必要に応じて、変換を行ってください。
406 
407      2) デリミタ
408 
409     デリミタに':'を使っている関係上、ユーザ名、ホスト名領域には、
410     ':'を含む名前は、使えません。万一、自ホスト名が':'を含んでいる
411     場合、他の文字(たとえば';')などに置き換えて使用してください。
412 
413      3) 文字コード
414 
415     IPMSG_UTF8OPT を付与した場合、文字コードは UTF-8、そうでない
416     場合は、CP932 の使用を想定しています。
417 
418      4) 暗号化の組み合わせ
419 
420      プロトコルではありませんが、リファレンス実装の説明ということで、
421      Windows版では、以下の3つの組み合わせのみサポートしています。
422 
423        1. IPMSG_RSA_2048 / IPMSG_AES_256      ... (*1)
424        2. IPMSG_RSA_1024 / IPMSG_BLOWFISH_128 ... (*2)
425        3. IPMSG_RSA_512  / IPMSG_RC2_40
426 
427        (*1) オプションで IPMSG_PACKETNO_IV/IPMSG_SIGN_SHA1 をサポート
428        (*2) オプションで IPMSG_PACKETNO_IV をサポート
429 
430 
431   5. 連絡先
432 
433     http://ipmsg.org に記載しています。
434 
435 
436 附記
437     コマンドコードは、ipmsg.hを参照してください。
438     何かご意見・提案がありましたら、お寄せください。
英文第九版
  1 Original ipmsg protocol specification is written in Japanese.
  2 This document was translated by Mr.Kanazawa.
  3 This document is not verified yet. (too old...)
  4 
  5 ----------------------------------------------------------------------
  6         IP Messenger communication protocol (Draft-9)    1996/02/21
  7                                                 Modified 2003/01/14
  8 
  9                                                        H.Shirouzu
 10 ----------------------------------------------------------------------
 11 
 12 About IP Messenger
 13     This is a Send/Receive message service using the TCP/UDP Port.
 14 
 15 Characteristics
 16     IP Messenger can be installed in any OS if TCP/IP is used on your machine.
 17     Dynamic member recognition can be done within your network or specified network.
 18     You can exchange messages between all IPMsg members. 
 19 
 20 Function description
 21     Use TCP/UDP port(default:2425). See the following descriptions
 22     (Message Send/Receive: UDP, File Send/Receive: TCP)
 23 
 24   1. Command 
 25 
 26      1) Command functions (Low 8 bits from command number 32 bits)
 27 
 28     IPMSG_NOOPERATION    No Operation
 29     IPMSG_BR_ENTRY        Entry to service (Start-up with a Broadcast command)
 30     IPMSG_BR_EXIT        Exit from service (End with a Broadcast command)
 31     IPMSG_ANSENTRY        Notify a new entry
 32     IPMSG_BR_ABSENCE    Change absence mode
 33 
 34     IPMSG_BR_ISGETLIST    Search valid sending host members
 35     IPMSG_OKGETLIST        Host list sending notice
 36     IPMSG_GETLIST        Host list sending request
 37     IPMSG_ANSLIST        Host list sending 
 38 
 39     IPMSG_SENDMSG        Message transmission
 40     IPMSG_RECVMSG        Message receiving check
 41 
 42     IPMSG_READMSG        Message open notice
 43     IPMSG_DELMSG        Message discarded notice
 44     IPMSG_ANSREADMSG    Message open confirmation notice(added from version-8)
 45 
 46     IPMSG_GETFILEDATA    File Transfer request by TCP
 47     IPMSG_RELEASEFILES    Discard attachment file
 48     IPMSG_GETDIRFILES    Attachment hierarchical file request
 49 
 50     IPMSG_GETINFO        Get IPMSG version info.
 51     IPMSG_SENDINFO        Send IPMSG version info.
 52 
 53     IPMSG_GETABSENCEINFO    Get absence sentence
 54     IPMSG_SENDABSENCEINFO    Send absence sentence
 55 
 56     IPMSG_GETPUBKEY        RSA Public Key Acquisition
 57     IPMSG_ANSPUBKEY        RSA Public Key Response
 58 
 59      2) Option flag (High 24 bits from command number 32 bits)
 60 
 61     IPMSG_ABSENCEOPT    Absence mode(Member recognition command)
 62     IPMSG_SERVEROPT        Server(Reserved)
 63     IPMSG_DIALUPOPT        Send individual member recognition command
 64 
 65     IPMSG_SENDCHECKOPT    Transmission check
 66     IPMSG_SECRETOPT        Sealed message
 67     IPMSG_READCHECKOPT    Sealed message check(added from ver8)
 68     IPMSG_PASSWORDOPT    Lock
 69     IPMSG_BROADCASTOPT    Broadcast message
 70     IPMSG_MULTICASTOPT    Multi-cast(Multiple casts selection)
 71     IPMSG_NEWMUTIOPT    New version multi-cast(reserved)
 72     IPMSG_AUTORETOPT    Automatic response(Ping-pong protection)
 73     IPMSG_NOLOGOPT        No log files
 74     IPMSG_NOADDLISTOPT    Notice to the members outside of BR_ENTRY
 75 
 76     IPMSG_FILEATTACHOPT    File attachment
 77     IPMSG_ENCRYPTOPT    Code
 78 
 79     IPMSG_NOPOPUPOPT    (No longer valid)
 80     IPMSG_RETRYOPT        Re-send flag(Use when acquiring HOSTLIST)
 81 
 82      3) Extended code flag (hex format combination)
 83 
 84     IPMSG_RSA_512
 85     IPMSG_RSA_1024
 86     IPMSG_RSA_2048
 87     IPMSG_RC2_40
 88     IPMSG_RC2_128
 89     IPMSG_RC2_256
 90     IPMSG_BLOWFISH_128
 91     IPMSG_BLOWFISH_256
 92     IPMSG_SIGN_MD5
 93 
 94      4) Extended files for attachment (fileattr low 8 bits)
 95 
 96     IPMSG_FILE_REGULAR
 97     IPMSG_FILE_DIR
 98     IPMSG_FILE_RETPARENT
 99     IPMSG_FILE_SYMLINK
100     IPMSG_FILE_CDEV
101     IPMSG_FILE_BDEV
102     IPMSG_FILE_FIFO
103     IPMSG_FILE_RESFORK
104 
105      5) Attachment file extended attribute(fileattr high 24 bits)
106 
107     IPMSG_FILE_RONLYOPT
108     IPMSG_FILE_HIDDENOPT
109     IPMSG_FILE_EXHIDDENOPT
110     IPMSG_FILE_ARCHIVEOPT
111     IPMSG_FILE_SYSTEMOPT
112 
113      6) Extended file attribute for attachment file
114 
115     IPMSG_FILE_UID
116     IPMSG_FILE_USERNAME
117     IPMSG_FILE_GID
118     IPMSG_FILE_GROUPNAME
119     IPMSG_FILE_PERM
120     IPMSG_FILE_MAJORNO
121     IPMSG_FILE_MINORNO
122     IPMSG_FILE_CTIME
123     IPMSG_FILE_MTIME
124     IPMSG_FILE_ATIME
125     IPMSG_FILE_CREATETIME
126 
127     IPMSG_FILE_CREATOR
128     IPMSG_FILE_FILETYPE
129     IPMSG_FILE_FINDERINFO
130 
131     IPMSG_FILE_ACL
132     IPMSG_FILE_ALIASFNAME
133     IPMSG_FILE_UNICODEFNAME
134 
135 
136   2.Command format(Use all character strings)
137 
138      1) Command(Format version-1)
139 
140     Ver(1) : PacketNo : SenderName : SenderHost : CommandNo : AdditionalSection
141 
142      2) An example for Message Send/Receive by using the current command format
143 
144     "1:100:shirouzu:jupiter:32:Hello"
145 
146 
147   3.Command process overview
148 
149      1) Member recognition
150 
151     An IPMSG_BR_ENTRY command notifies a new entry to the current
152     members at start-up.
153 
154     All members add the new member to their list after getting a notification message.
155     An IPMSG_ANSENTRY command sends a message back to the new member.
156 
157     The new member gets the current member data by a
158     IPMSG_ANSENTRY command. All members can communicate as long as an 
159     IP packet exists.
160 
161     An IPMSG_BR_ABSENCE command broadcasts absence mode cancel or 
162     nickname change to all members. However, an IPMSG_ANSENTRY command 
163     does not send a message back, which is different from an IPMSG_BR_ENTRY 
164     command.
165 
166     IPMSG_BR_ENTRY, IPMSG_ANSENTRY, and IPMSG_BR_ABSENCE commands 
167     use an IPMSG_ABSENCEOPT flag for absence mode. Input a nickname to 
168     additional command.
169     Add an IPMSG_DIALUPOPT flag for dial-up users who can't be reached by 
170     a broadcast command.  A member recognition command needs to be 
171     sent individually to the members with this optional flag. 
172 
173     (Extended group)IPMSG_BR_ENTRY and IPMSG_BR_ABSENCE commands 
174     sends a group name by adding the new group name after the current 
175     command format character strings (Input '\0' between the current 
176     command and extended name).
177 
178      2) Send/Receive Message
179     Send Message uses an IPMSG_SENDMSG command that can input a message
180     in the extended area. 
181     Receive Message sends back an IPMSG_RECVMSG command only 
182     if an IPMSG_SENDCHECKOPT flag is ON. Input the original packet number 
183     to the extended area. 
184 
185     Broadcast Message Send uses an IPMSG_BOADCASTOPT command 
186     and an IPMSG_SENDMSG flag should be ON. 
187     Auto-Send packet(absence notice) needs to be added to IPMSG_AUTORETOPT
188     for ping-pong protection. If either one or another packet is ON, then
189     confirmation/auto-send packet is not sent back. 
190 
191     Send Message Sealing needs to be an IPMSG_SECRETOPT packet ON. 
192     In this case, Receive Message sends an IPMSG_READMSG command.
193     Input the original packet number to the extended area.
194 
195     (Additional IPMSG_NOADDLISTOPT)
196     When receiving an IPMSG_SENDMSG packet from a host that is 
197     not on your Send/Receive list, IPMsg will either confirm a host by 
198     sending an IPMSG_BR_ENTRY command or add a host name to 
199     the Send/Receive list. 
200     However, single-shot Message Send/Receive action needs to be avoided. 
201     Add an IPMSG_NOADDLISTOPT flag to an IPMSG_SENDMSG command.
202 
203     (Additional IPMSG_READCHECKOPT from version-8)
204     When an IPMSG_READMSG command contains an IPMSG_READCHECKOPT flag, 
205     IPMsg process is the same as IPMSG_SENDMSG with an 
206     IPMSG_SENDCHECKOPT flag. 
207     However, Send Message uses an IPMSG_ANSREADMSG command,  
208     not IPMSG_RECVMSG.
209 
210      3) Message Send/Receive encrypted extension (Added in the version-9)
211 
212     Use the combination of Public-key(RSA) and common key(RC2/Blowfish).
213     (Encrypted extension area is used in hex format.)
214 
215     (Public key acquisition)Send an IPMSG_GETPUBKEY command to Receive
216     Message. Receive Message gets an IPMSG_ANSPUBKEY that 
217     means receiving RSA public key from Send Message.
218 
219     IPMSG_GETPUBKEY/IPMSG_ANSPUBKEY both require the value which is
220     encryption capability (Exp. IPMSG_RSA_1024) flag uses "OR" at first
221     part of extension  
222 
223     In addition, In IPMSG_ANSPUBKEY, public key written as EE-NNNNNN
224     E=Exponent, N=method)devide by ':'. and Input the Fdelimiter '-' 
225     between E and N.
226 
227     This sequence can be skipped after the 2nd Send/Receive process by 
228     memorizing public key and encrypted data. 
229     
230     (Encrypted message)After a sender creates a common key that is 
231     supported both sender and receiver, a common key can encrypt a message. 
232     In addition, a receiver's public key encrypts the common key.
233 
234 
235     (Encrypted message transmission) IPMSG_ENCRYPTOPT is used in
236     IPMSG_SENDMSG. At the first part of extension, input the value which
237     is 'or' resoult from Convination of public key and common key type . 
238     Then use common key which encrypt with public key devide by ':'.
239     Then input message which is eccrypted by public key devide by ':'.
240     If both supports IPMSG_SIGN_XXX, then add ':' and signeture. 
241 
242     Also, In the method of encode padding, PKCS#1ECB key is used for RSA, 
243     PKCS#5 CBC common key is used for RC2/blowfish.
244 
245     Also, The Packet related to Entry manifestation the capability of 
246     ecryption support using  IPMSG_ENCRYPTOPT
247 
248      4) Extension with file attachment(Available from version-9)
249 
250     An IPMSG_SENDMSG command with an IPMSG_FILEATTACHOPT flag for 
251     File transfer (download permission)notification sends a message
252     with attachment. 
253     Input '\0' after the message and attachment file data.
254     
255 
256     fileID:filename:size:mtime:fileattr[:extend-attr=val1
257     [,val2...][:extend-attr2=...]]:\a:fileID...
258     (size, mtime, and fileattr describe hex format. 
259      If a filename contains ':', please replace with "::".)
260 
261     When Receive Message downloads an attachment file, an IPMSG_GETFILEDATA 
262     command requests a data transmission packet to the TCP port that is the same number  
263     as the UDP sending port number. Input packetID:fileID:offset to the extended area. 
264     (Use all hex format.)
265     File Transfer side receives the request. After recognizing that it's a correct request, 
266     then send the specified data (no format)
267 
268     When the data receiving side downloads a hierarchical attachment file, 
269     use an IPMSG_GETDIRFILES command and input a packetID:fileID
270     to the extended area and send a data transmission request packet. 
271     (all hex format)
272 
273     Data sending side sends the following hierarchical data format.
274     header-size:filename:file-size:fileattr[:extend-attr=val1
275     [,val2...][:extend-attr2=...]]:contents-data
276     Next headersize: Next filename...
277     (All hex format except for filename and contetns-data)
278 
279     header-size is from the beginning of header-size to the delimiter ':' 
280     that is before contents-data. extend-attr can be omitted and used multiple 
281     extended attributes. Use '=' for data input. 
282 
283     When fileattr is IPMSG_FILE_DIR, IPMsg recognizes that it is automatically
284     in the directory, the next file data is after the directory.
285 
286     When fileattr is IPMSG_FILE_RETPARENT, IMPsg recognizes that it returns 
287     to the parent directory. In this case, File name is always "." and the attribute 
288     value is the current directory data.
289 
290     Sending process starts from the attachment directly and returns the
291     IPMSG_FILE_RETPARENT command to the attachment directory. 
292 
293     Add an IPMSG_FILEATTACHOPT flag for an Entry packet to support the 
294     attachment file.
295 
296      5) Other commands
297 
298     When acquiring different versions, send an IPMSG_GETINFO command.
299     Receiving side sends the version information character string to
300     extended area.
301 
302     Send an IPMSG_GETABSENCEINFO command for acquiring an absence message.
303     Receiving side sends an IPMSG_SENDABSENCEINFO back if the status is absence mode.
304     If the status is not absence mode, a character string "Not absence mode" will be sent back.
305 
306      6) Confirmation/Retry
307 
308     If a confirmation packet for IPMSG_SENDMSG or IPMSG_RECVMSG is not delivered
309     within a specified time, then it will be sent again. 
310     A number of retry actions or interval period is depended on the current condition. 
311 
312 
313   4. Other
314 
315      1) Linefeed
316 
317     Linefeed characters in Send Message is standardized with UNIX type ('0x0a').
318     Please change if needed. 
319 
320      2) Delimiter ':'
321 
322     ':' is used as a delimiter. You can't use this delimiter for user name 
323     and host name. 
324     If the use/host names contain a ':', please replace with another sign, 
325     for an example ';'. 
326     Although using this delimiter isn't problem as yet, I may create an 
327     escape sequence. 
328     
329 
330      3) Kanji codes
331 
332     CP932
333 
334 
335   5. Contact
336     http://ipmsg.org/ (Japanese site)
337     http://ipmsg.org/index.html.en (English site)
338 
339 
340 Note
341     See ipmsg.h for command codes.
342     Please e-mail me your comments and suggestions.
原文地址:https://www.cnblogs.com/Franck/p/2749613.html