Skip to content
This repository has been archived by the owner on Jan 29, 2019. It is now read-only.

avim 基础协议设计 #1

Open
microcai opened this issue Apr 1, 2013 · 11 comments
Open

avim 基础协议设计 #1

microcai opened this issue Apr 1, 2013 · 11 comments
Assignees

Comments

@microcai
Copy link
Member

microcai commented Apr 1, 2013

@Jackarain @hyqhyq3 @peterfuture

经过 avplayer.org 社区讨论, 现在归纳 avim 的设计报告如下:

avim 设计为 * 一个分布式的即时消息传递框架 * , 主要用途用于构建 即时通讯软件.

avim 为每一个消息接受端分配一个全球唯一标识符, 由 AVID 表示, 形式为
user@domain/resource

avim 使用域将消息接受端进行划分. 每一个域下需要一台到多台 avim 服务器端.

avim 服务器端执行的是 "消息的准确传递" . 如果目的客户不存在(暂时不可达), 服务器端要负责对消息进行离线存储. 等客户上线后再行转发. 对消息进行离线存储由目的用户所在的服务器负责.

avim 的消息可靠性到达机制, 被用来构建 avplayer 社区规划中的下一代即时通讯软件: avim (与协议同名)

avim 使用 avim 的消息可靠性到达机制传递 文本/图像/声音/视频 消息.

@microcai
Copy link
Member Author

microcai commented Apr 1, 2013

avim-base-protocol 的目的是为上层的 聊天协议提供一个坚实的基础

avim-base-protocol 类似于一个 "高可靠性的UDP协议", 每一个 avim-server 都是一个网关.

消息以 block 为单位进行传送. block 的大小没有任何硬性限制. 目前的服务器端软件可能会采取将 block 大小限制到 1MB 以内 诸如此类的做法. 支持多播, 也就是可以填写多个目的地址.

@microcai
Copy link
Member Author

microcai commented Apr 1, 2013

协议如下:

message avim-base-packet{
repeated avid; // 重复多次的 avid 地址
avblock; // 一个不固定长度的 数据块
}

message avid{
string avid;
};

message avblock{
int length;
repeated byte;
};

@microcai
Copy link
Member Author

microcai commented Apr 1, 2013

avblock 应该也允许 repeated 吧, 一次发送多个 avblock ?

@microcai
Copy link
Member Author

microcai commented Apr 2, 2013

应该再添加一个 string application 表明上层协议

@lovey599
Copy link
Member

lovey599 commented Apr 2, 2013

看了下下,很OK

@lovey599
Copy link
Member

lovey599 commented Apr 2, 2013

觉得是时候讨论具体功能了,那样能产生更加详细的协议

@lovey599
Copy link
Member

lovey599 commented Apr 2, 2013

avPacket是不是应该加上类型?比如图片?或者图片嵌入msgblock中?感觉嵌入不太好,因为我们要发送诸如字体定义等其它属性

@microcai
Copy link
Member Author

microcai commented Apr 2, 2013

不不不, avim-base 协议只是一个 “可靠性的 UDP”. 具体的 avim 聊天协议要构建在这个协议之上。 现在先设计这个基础协议

@microcai
Copy link
Member Author

microcai commented Apr 2, 2013

// 这个文件是 avim base 协议的 protobuf 定义. 使用 protoc 编译为对应的 C++ 代码
package avim.proto.base;

// 基础的AV地址, AVID 就是这个庞大的路由网络的地址标识
message avID{
required string username = 1;
required string domain = 2;
optional string resource = 3; // 大部分情况下需要设置。不设置表示多播到客户登陆的所有客户端
optional string useragent = 4; // 可选, 用户使用的客户端标识: 登陆的时候使用
}

// 基础包
message avimPacket{
required avID src = 1; // 发送方地址
repeated avID dest = 2 ; // 目的地地址
required bool all_ofline = 4 [ default = false ]; // 控制是否允许服务器进行离线存储
required string application = 3 [ default = "avim" ] ; // 表明上层软件是何种协议。
enum messagetype {
option allow_alias = true;
MESSAGING = 0 ; // 消息, 服务器执行转发即可
MESSAGING_REPLAY = 1; // 应答,以便确认是否传递成功
CLIENTCONTROL = 2; // 客户控制消息,see @avClientControl
}
required messagetype type = 5; // 消息类型

// 下面是依据类型确定的消息

optional avPacketMessage avmessage = 6; // messagetype = 0 的时候就是这个消息
optional avPacketMessageReplay avmessage_reply = 7; // messagetype = 1 的时候就是这个消息

optional avClientControl avctl = 256 ; //  客户控制消息 see @avClientControl

}

// 由和消息无关的控制消息,由服务器和服务之间传递,或则客户端和服务器之间的传递
// 客户端和客户端之间肯定是不使用这个消息块的
// 用于执行:
// 登陆, 认证, 客户发现,注册新客户,注销客户
message avClientControl{
enum controltype {
LOGIN = 0; // 登陆,digest 为空
AUTHREQUIRED = 1 ; // 如果服务器要求认证,就会返回这个, 要求认证, digest 包含 salt
DIGEST_AUTH = 2 ; // 那么,就执行认证吧,发送这个消息进行认证, digest 包含的是 salt 后的密码
}

optional string digest = 50; // 客户端认证的时候发送的数据

}

message avPacketMessage{
required uint64 length = 1; // 消息长度
optional bytes msgblock = 2; // 消息长度 > 0 的时候就有这个消息了
}

message avPacketMessageReplay{
enum Status{
option allow_alias = true;
DELIVERED = 0;
SUCCESS = 0 ; // 消息成功送达目的地
FAILED = 1 ; // 消息送达失败
SUCCESS_OFFLINED = 2; // 失败, 但已经被离线存储
MULTIADDREDD_STATUS_ATTACHED = 3; // 对于多个目的地址的消息来说: 部分成功,具体成功失败看下面
};
required Status status = 1; // 消息的状态

// 如果目的地址是多个的话,需要在这里检查每一个消息地址的成功失败状态
message MultiStatus{
required Status status = 1;
required avID   avid = 2;
}
optional MultiStatus multistatus =2; // 

}

@microcai
Copy link
Member Author

microcai commented Apr 2, 2013

应该差不多可以了吧?

@lovey599
Copy link
Member

lovey599 commented Apr 2, 2013

确实差不多了

@microcai microcai modified the milestone: avim 基础协议 Nov 4, 2014
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants