飞鸽传书
原名:IP Messenger
原作者:白水啓章
许可协议:BSD License
官方网站:http://www.ipmsg.org/
“飞鸽传书”是简单的即时消息/文件传输程序。P2P结构,无须服务器;适合(但不限于)局域网使用。在日本和中国很流行。
这个软件初成于上个实际90年代中期。作者受Mac上的一个叫BroadCast的软件的启发,开发了一个即时通软件,竟在公司内(然后MailingList上)一举成名。
飞鸽传书的通信协议是UDP和TCP/IP,因此得名。邻居发现和即时消息使用UDP协议,而文件传输则使用TCP。
协议很简单,基于文本的通信协议。
下面是协议简述:
---------------------------------
=== 报文格式 ===
UDP报文格式是以冒号“:”隔开的文本格式,如下:
[quote]协议版本:报文编号:发送方用户名:发送方主机名:命令编号:附加字段[/quote]
其中,协议版本是1;命令编号可以在IPMSG.H里面查到。
命令编号(转换成二进制)的低8位是命令名,高24位都是标志位(flags),标志位用“或”运算结合。
用户名不是“昵称“,后文细说。
下面是一个例子:
[quote]1:100:shirouzu:jupiter:32:Hello[/quote]
命令是32(IPMSG_SENDMSG),附加字段是Hello,是消息内容,后文细说。
=== 邻居发现 ===
一个节点加入网络时,广播IPMSG_BR_ENTRY命令,告知其他成员。
收到IPMSG_BR_ENTRY的成员,应当将发送方加入自己的通讯录,并向新加入的成员发送IPMSG_ANSENTRY消息。
新加入的节点通过返回的IPMSG_ANSENTRY消息,就能知道网络中的所有成员。但是由于IP协议有数据包的丢失,UDP不保证成功传输,因此,应该尽可能保留原有的通讯录,不要完全更新。
“离开”状态或者“昵称“的变更,都通过广播IPMSG_BR_ABSENCE消息通知所有成员。这个消息无须回应。
对于IPMSG_BR_ENTRY, IPMSG_ANSENTRY和IPMSG_BR_ABSENCE命令,如果一个成员处于“离开”状态,那么它们都要设置IPMSG_ABSENCEOPT标志位。它们的附加字段是“昵称”。另外,对于拨号用户,或者无法收到广播的用户,还要设置IPMSG_DIALUPOPT标志位。这样,邻居发现类的命令就单独对这些节点进行单播。
=== 消息传输 ===
发送消息使用IPMSG_SENDMSG命令,扩展字段是消息本体。接收方如果发现IPMSG_SENDCHECKOPT标志位被设置,还要返回IPMSG_RECVMSG命令,扩展字段是发来的消息的报文编号。
---------------------------------
实现了以上协议,就可以完成邻居发现和基本的消息传递功能。消息传递还有“广播”的方式,还有消息加密和文件传送功能,以后再讨论。
原名:IP Messenger
原作者:白水啓章
许可协议:BSD License
官方网站:http://www.ipmsg.org/
“飞鸽传书”是简单的即时消息/文件传输程序。P2P结构,无须服务器;适合(但不限于)局域网使用。在日本和中国很流行。
这个软件初成于上个实际90年代中期。作者受Mac上的一个叫BroadCast的软件的启发,开发了一个即时通软件,竟在公司内(然后MailingList上)一举成名。
飞鸽传书的通信协议是UDP和TCP/IP,因此得名。邻居发现和即时消息使用UDP协议,而文件传输则使用TCP。
协议很简单,基于文本的通信协议。
下面是协议简述:
---------------------------------
=== 报文格式 ===
UDP报文格式是以冒号“:”隔开的文本格式,如下:
[quote]协议版本:报文编号:发送方用户名:发送方主机名:命令编号:附加字段[/quote]
其中,协议版本是1;命令编号可以在IPMSG.H里面查到。
命令编号(转换成二进制)的低8位是命令名,高24位都是标志位(flags),标志位用“或”运算结合。
用户名不是“昵称“,后文细说。
下面是一个例子:
[quote]1:100:shirouzu:jupiter:32:Hello[/quote]
命令是32(IPMSG_SENDMSG),附加字段是Hello,是消息内容,后文细说。
=== 邻居发现 ===
一个节点加入网络时,广播IPMSG_BR_ENTRY命令,告知其他成员。
收到IPMSG_BR_ENTRY的成员,应当将发送方加入自己的通讯录,并向新加入的成员发送IPMSG_ANSENTRY消息。
新加入的节点通过返回的IPMSG_ANSENTRY消息,就能知道网络中的所有成员。但是由于IP协议有数据包的丢失,UDP不保证成功传输,因此,应该尽可能保留原有的通讯录,不要完全更新。
“离开”状态或者“昵称“的变更,都通过广播IPMSG_BR_ABSENCE消息通知所有成员。这个消息无须回应。
对于IPMSG_BR_ENTRY, IPMSG_ANSENTRY和IPMSG_BR_ABSENCE命令,如果一个成员处于“离开”状态,那么它们都要设置IPMSG_ABSENCEOPT标志位。它们的附加字段是“昵称”。另外,对于拨号用户,或者无法收到广播的用户,还要设置IPMSG_DIALUPOPT标志位。这样,邻居发现类的命令就单独对这些节点进行单播。
=== 消息传输 ===
发送消息使用IPMSG_SENDMSG命令,扩展字段是消息本体。接收方如果发现IPMSG_SENDCHECKOPT标志位被设置,还要返回IPMSG_RECVMSG命令,扩展字段是发来的消息的报文编号。
---------------------------------
实现了以上协议,就可以完成邻居发现和基本的消息传递功能。消息传递还有“广播”的方式,还有消息加密和文件传送功能,以后再讨论。