Avim 协议第一层之 AV地址协议


#1

av地址,性如 sb@avplayer.org 这样的地址。这层协议的作用,就是对上层提供一个 av地址,并实现在 av地址之间的数据互传。

每一个 avim 用户 ,注册的时候就获得了一个 av地址。 这个 av地址用于在网络上唯一的标记一个用户。

每一个数据包,都是从一个 av地址,传递到另一个 av地址。 而无需知道 av地址后面的那个用户到底在世界的哪个角落。只要使用这个 av地址发送数据,数据就能被送达,只要他在线。 当然如果不在线,网络会返回 NO Route 错误。类似你在 ip 网络上 ping 一个关机了的机器。

av地址层还提供用户鉴权和识别功能,你无需当心发往这个地址的数据会被别的人收到。网络保证只有你发送的那个用户能收到你的消息,而且也只有那个用户能正确解开数据。

这个 和 ip 协议对数据的完整性和是否被监听乃至伪造都不管不顾要相当的靠谱多了。

除了针对具体用户的地址,还有就是针对 “多个用户” 的地址, ip 里管这个叫多播地址。 向多用户地址发送的数据会被自动的转发到各个用户。这个地址用来实现 “聊天室” 或者 “群聊” 。

在实现上,多播地址其实是由一个自动转发代理机器人实现的。 因此加入和退出聊天室,只要配置机器人就可以了,无需通过 avim 协议本身达成。


Av 协议
#2

im 可以慢慢完善。 im 协议现在就暂时定一个,那就是什么结构也没有,就是纯文字好了。 暂时定这个协议先。 目前也够用,对吧 那么我们可以继续讨论 av协议要如何实现了。/ 第一个版本就是纯文字好了 那么 av协议要如何实现? 具体的,用户如何接入 av网? ip地址在其中能相互路由的网络,就是 internet 接入 internet 的方式很多,有 ADSL , 56k 猫拨号,光纤接入 etc etc 对吧? 接入 internet 实质上就是和 一个 已经接入 internet 的 节点建立物理链接。 这个物理链接可以是光线,也可以是网线,也可以是电话线 但是总之需要先和一个已经接入 internet 的机器建立物理的链接 然后你的数据就可以由它转发了。 ip 数据就通过机器之间的层层转发 所以呢,先期我们先不设计的这么复杂 先不搞 p2p 结构。 先搞 中心节点模式。 也就是需要一个中心服务器 其实你在家上网,ip也是中心模式的,同一地区的人都是连接到 ISP 的一台路由器上的。 但是 isp 和 isp 之间的路由器啊,那是 p2p 模式的 中国到美国的一条海底光缆断了。 网络并不会短,只是会拥堵而已 因为去米国的数据会通过日本的光缆中转掉 isp 和 isp 之间的路由器呢,是如何实现这种智能路由的? 就是靠的路由协议。 路由器和路由器之间通过协议交换路由信息。 但是路由协议其实一开始并没有 一开始是手工配置的。 路由协议是后来才有的。 所以, av协议也这样,一开始不设计这么复杂。 两台av服务器就手工配置就可以了 何况我们一开始肯定只有一台服务器。。。 所以。。。 路由协议完全不设计都没事。 因为用户都登录到同一台服务器 所以这个优先级可以放一放 那么路由的问题就暂时解决了,因为所有的用户都连接到同一台服务器我下了 那么路由的问题就暂时解决了,因为所有的用户都连接到同一台服务器下了 所以所谓的 av-server 呢,其实只要转发消息就可以了! 简单吧! 【AV3】peter_futurepeter_future@outlook.com 21:45:15 那就是这个问题 先不需要解决, 先知道我们的目标是这样就可以了 好了,那么第一期目标已经出来了,就是 一个 av 服务器,一个 av 客户端。 im 层使用 纯文本 im 协议,所以暂时无需设计。 av 层呢,就只是转发数据包就可以了。 接下来考虑,av 层本身的 “二进制数据结构” ip 协议呢,是通过一个 ip 头来实现的 对吧 数据结构上说,就是个 ip header 所需要的信息都在一个头部给出了 那么 av协议也需要一个这样的协议头。 大家来想想 如何设计 av协议的协议头很简单,因为 av地址是不定长的,设计不定长协议比较麻烦。 ip 地址是固定的 4 个字节。所以 ip协议头里,就是固定的给 8 个字节用来存 原地址和目的地址。 ipv6 就是把这个字段修改到 128bit 长。

可以有 128bit 长度的地址。

而 av协议的地址一开始就是不定长的

所以对付不定长的协议啊,我觉得使用 protobuf 就可以了。 im 可以慢慢完善。 im 协议现在就暂时定一个,那就是什么结构也没有,就是纯文字好了。 暂时定这个协议先。 目前也够用,对吧 那么我们可以继续讨论 av协议要如何实现了。/ 第一个版本就是纯文字好了 那么 av协议要如何实现? 具体的,用户如何接入 av网? ip地址在其中能相互路由的网络,就是 internet 接入 internet 的方式很多,有 ADSL , 56k 猫拨号,光纤接入 etc etc 对吧? 接入 internet 实质上就是和 一个 已经接入 internet 的 节点建立物理链接。 这个物理链接可以是光线,也可以是网线,也可以是电话线 但是总之需要先和一个已经接入 internet 的机器建立物理的链接 然后你的数据就可以由它转发了。 ip 数据就通过机器之间的层层转发 所以呢,先期我们先不设计的这么复杂 先不搞 p2p 结构。 先搞 中心节点模式。 也就是需要一个中心服务器 其实你在家上网,ip也是中心模式的,同一地区的人都是连接到 ISP 的一台路由器上的。 但是 isp 和 isp 之间的路由器啊,那是 p2p 模式的 中国到美国的一条海底光缆断了。 网络并不会短,只是会拥堵而已 因为去米国的数据会通过日本的光缆中转掉 isp 和 isp 之间的路由器呢,是如何实现这种智能路由的? 就是靠的路由协议。 路由器和路由器之间通过协议交换路由信息。 但是路由协议其实一开始并没有 一开始是手工配置的。 路由协议是后来才有的。 所以, av协议也这样,一开始不设计这么复杂。 两台av服务器就手工配置就可以了 何况我们一开始肯定只有一台服务器。。。 所以。。。 路由协议完全不设计都没事。 因为用户都登录到同一台服务器 所以这个优先级可以放一放 那么路由的问题就暂时解决了,因为所有的用户都连接到同一台服务器我下了 那么路由的问题就暂时解决了,因为所有的用户都连接到同一台服务器下了 所以所谓的 av-server 呢,其实只要转发消息就可以了! 简单吧!

那就是这个问题 先不需要解决, 先知道我们的目标是这样就可以了 好了,那么第一期目标已经出来了,就是 一个 av 服务器,一个 av 客户端。 im 层使用 纯文本 im 协议,所以暂时无需设计。 av 层呢,就只是转发数据包就可以了。 接下来考虑,av 层本身的 “二进制数据结构” ip 协议呢,是通过一个 ip 头来实现的 对吧 数据结构上说,就是个 ip header 所需要的信息都在一个头部给出了 那么 av协议也需要一个这样的协议头。 大家来想想 如何设计 av协议的协议头很简单,因为 av地址是不定长的,设计不定长协议比较麻烦。 ip 地址是固定的 4 个字节。所以 ip协议头里,就是固定的给 8 个字节用来存 原地址和目的地址。 ipv6 就是把这个字段修改到 128bit 长。

可以有 128bit 长度的地址。

而 av协议的地址一开始就是不定长的

所以对付不定长的协议啊,我觉得使用 protobuf 就可以了。

还是用我刚刚设计的多播模式 所以修改下:

// 基础包
message avPacket{
required avAddress src = 1; // 发送方地址
required avAddress dest = 2; // 目的地地址
required bool all_ofline = 4 [ default = false ]; // 控制是否允许服务器进行离线存储
required string application = 3 [ default = "avim" ] ; // 表明上层软件是何种协议。

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

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

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

感觉过于复杂了,简化一下:

// 基础包
  message avPacket{
  required avAddress src = 1; // 发送方地址
  required avAddress dest = 2; // 目的地地址
  required string upperlayerpotocol = 3 [ default = "avim" ] ; // 表明上层软件是何种协议。
  required uint64 payload_length = 1; // 消息长度
  optional bytes payload = 2; // 消息长度 > 0 的时候就有这个消息了
}

这样就相对简单多了。这样,发送一个消息就是吧消息塞入 payload , 然后地址填写好。 交给 av层。 av层再装发给服务器,服务器再转发给目标用户。搞定。


#3
// 这个就是基础包, av们相互通信使用的就是这个
message avPacket{
    required avAddress src = 1; // 发送方地址
    required avAddress dest = 2; // 目的地地址
    required string upperlayerpotocol = 3 [ default = "avim" ] ; // 表明上层软件是何种协议。
    required uint64 payload_length = 1; // 消息长度
    optional bytes payload = 2; // 消息长度 > 0 的时候就有这个消息了
}

还没结束 ? 消息的内容是加密的。 openSSL 当然上层交给 av层的时候是没加密的 不不。 不是 openssl 这个是单个数据包的加密。 av 层提供 socket 接口。 我看不懂object-c

1 user管理 – 张小凡 2 avim-ios Mic 3 avim-win dpainter 4 协议开发: peter 海盗

就是和操作系统一样的 socket 接口。 im层把没加密的数据交给 av 层。 unix呢````` av层自动确定对方的证书并把数据加密 avim-unix呢? 没人? 还是用现成的? 因为同名会冲突,所以 av 层就提供 av_ 前缀的接口。 im 层调用 av_sendto 发送数据。 和 调用 sendto() 发送 UDP 数据的方式一模一样。 名字会和ffmpeg的名字冲突 unix暂时没人认领 明白? 和 ffmpeg 的不会冲突, c++ 的名字会被 mangle 掉。 外层接口一律加上av? 额 我其实也不敢认领 因为写了丢人 要不还是简单做pidgin插件? 恩, av_socket 创建一个 av接口, av_sendto 发送数据。 就可以了。 av_close 关闭。 话说 av_socket 和 av_close 也不需要提供。。。 就一个 av_sendto 一个接口好了 。 程序启动就自动接入 av 网。 对外接口够简单吧? 就一个 av_sendto 成功返回 1 ,失败返回 0 … 协议层:自动带登陆功能吗 还提供个 av_async_sendto 协议层自动登录,可以通过 av_query_status 获取状态。获取当前是否已经成功连接上 av网的状态。

没连上调用 av_sendto 肯定全返回错误 peter先写个协议草案 push一下,然后 大家看了给意见修改 当然,ip 地址要需要 ifconfig 配置的,对吧? 所以也提供一个 av_config 接口来配置 av地址。 这样就是 3 个接口。这 3 个接口就是提供给 im 层的。其他的 im 层完全 无需关心! 哦,还有个 av_recvfrom,用来接收消息。4个 接口。


#4

av_sendto、av_async_sendto、av_close、av_query_status、av_recvfrom 暂定这几个接口!


#5

【AV6】张小凡(315539570) 22:42:35 @peter_future 这些也都记录到文档里面吧 【AV3】peter_futurepeter_future@outlook.com 22:42:52 我只记了API 【AV6】张小凡(315539570) 22:42:58 虽然是直接使用了openssl 【AV3】peter_futurepeter_future@outlook.com 22:43:25 海盗 记住了吗
【AV6】cai(464893490) 22:43:28 另外,服务器端和client端使用完全一样的 av协议实现! 【AV6】cai(464893490) 22:43:37 你看 linux 既可以做服务器又可以做客户端! 【AV6】cai(464893490) 22:43:44 但是 ip 协议的实现是一模一样的 【AV6】cai(464893490) 22:43:46 对吧 【AV3】peter_futurepeter_future@outlook.com 22:45:47 那在现在这种情况下 这些怎么用 比如:有了证书可以登录, 当前是没有证书的 那怎么实现登录啊 【AV6】cai(464893490) 22:45:57 不能登录 【AV3】peter_futurepeter_future@outlook.com 22:46:04 你的证书是为了 登录 avim网络用的对吧
【AV6】cai(464893490) 22:46:10 证书就是进入 av网的通行证 【AV6】cai(464893490) 22:46:28 证书必须由 avplayer.org 颁发。 【AV6】cai(464893490) 22:46:33 avplayer.org 作为 ROOT CA 【AV6】cai(464893490) 22:46:50 可以签发二级CA。 【AV3】peter_futurepeter_future@outlook.com 22:47:02 小凡 你懂证书怎么用吗 【AV6】cai(464893490) 22:47:06 二级 CA 可以颁发证书 【AV3】peter_futurepeter_future@outlook.com 22:47:50 我想知道 从代码角度怎么写
【AV6】张小凡(315539570) 22:48:13 我这一块不太熟 【AV6】张小凡(315539570) 22:48:38 openssl都没用过,学着写 【AV4】dpainter(149314245) 22:48:43 先弄个服务端,客户端demo出来吧,怎么登录验证之类的以后在讨论 【AV6】cai(464893490) 22:49:13 没有服务器端 【AV6】cai(464893490) 22:49:21 只有一个中间转发作用的路由器。 【AV3】peter_futurepeter_future@outlook.com 22:49:32 难道我得先启动的时候 通过av_config设置网络的时候 把证书放进去吗
【AV6】cai(464893490) 22:49:42 路由器对客户端目前不执行认证。 【AV6】cai(464893490) 22:49:46 对 【AV4】dpainter(149314245) 22:49:46 纳尼,几个小时前我记得还有服务端的啊,现在没了? 【AV3】peter_futurepeter_future@outlook.com 22:49:59 配置了 才能发消息 不配置就不让发 【AV6】cai(464893490) 22:50:08 所谓的服务器,在 av网里不叫服务器,叫路由器 【AV4】匠人(f_x_p)(464518486) 22:50:28 转发服务器 【AV3】peter_futurepeter_future@outlook.com 22:50:29 那就明白了 概念先弄明白 不用着急实现
【AV4】dpainter(149314245) 22:50:31 ok,router server。。。 【AV3】peter_futurepeter_future@outlook.com 22:51:25 那先开两个仓库 avim_prot 协议实现 avim_router 路由实现

这两个仓库的内容负责网络数据的投递 【AV3】peter_futurepeter_future@outlook.com 22:52:22 海盗怎么消失了
【AV3】peter_futurepeter_future@outlook.com 22:53:23 还有一个 License 【AV3】peter_futurepeter_future@outlook.com 22:53:39 avim_prot 我和海盗 avim_router 谁来搞
【AV6】cai(464893490) 22:54:01 不要 【AV6】hyqi@hyq.me 22:54:01 router是什么 【AV6】cai(464893490) 22:54:05 不开2个仓库。 【AV3】peter_futurepeter_future@outlook.com 22:54:06 client端 谁做的 谁到社区开git吧 没权限找dr要
【AV6】cai(464893490) 22:54:06 no 【AV6】cai(464893490) 22:54:10 不需要。 【AV6】cai(464893490) 22:54:24 你的 Linux 电脑也可以当路由器的 【AV3】peter_futurepeter_future@outlook.com 22:54:26 那比如 client要集成protocal 怎么办 【AV6】cai(464893490) 22:54:27 你造不? 【AV6】cai(464893490) 22:54:53 av协议的实现,是植入每一台电脑的。 【AV6】cai(464893490) 22:55:27 服务器由 av_route 添加。一般的机器就只要添加一个默认路由表。 【AV6】cai(464893490) 22:55:48 默认路由表里给出,所有的消息都通过某个路由器转发。


#6

输入 route 命令看看 那现在就 avim_router prot+router avim_server 内容分发 所谓客户机器啊,就是路由表就只有一项, 一个默认路由。 所有的数据都通过 “网关”这台默认路由发送。

而路由器呢,则是有一个庞大的路由表的 不同的目的地址,通过路由表找到对应的网络端口发送。 张小凡 22:58:18 这里的客户端 网关(路由器),在某种程度来说是代码是一致的,只是分工不同? 对啊 代码是完全一致的 只是配置不一样 客户端只会调用 av_route 命令一次,设定一个默认路由 搞定 而服务器端呢,则是要实现一个 路由协议,通过路由协议,再调用 av_route 不停的修改路由表。 但是我说了,暂时这个路由协议不实现它 avim_route 这才是其他所有im不具有的 特别的地方 所以所谓服务器端啊,现在就是 av_config 配置一下,就等待了,啥不干了。一切等 av协议的代码自己处理了。而客户端呢,用 avconfig 设定了,就进入 IM 部分的代码了。 im 部分不停的调用 av部分的接口,让 av部分干活。就可以了 在dr面前,我都不好意思说我还是学网络专业的… 所以啊,你看,linux路由器,需要执行啥程序不? 不需要 一切 ip 相关的路由操作,都是 linux 内核自动实现的 只需要执行一个程序对 内核配置配置就可以了 那就一个 av_router 我+小凡+海盗 还有人来没
然后提供个 web 接口让用户配置。 peter , av_router 就是 av协议 + 空 main() 。 所以完全不需要单独实现。。。 就是一个空白的 main() 就算实现了 av协议了,作为一个 router 了 所有的协议处理都由 av协议的底层库代劳了 以后这个 空的 main 要扩展,实现一个 路由协议 就是路由器和路由器之间要相互交换一些信息。 通过交换得来的信息,再调用 av_route 配置路由表 就可以了 但是现在路由协议先不实现 所以 router 就是个空白的 main() 写一个 sleep(-1) 进入无穷睡眠就可以了

3行代码实现完一个 av_router 明白? 现在就是实现一个 libavproto 就可以了。 输入 route 命令看看 然后提供个 web 接口让用户配置。


#7

dpainter 在的啊 那我再讲一遍。 im 把数据 -> av , av 根据消息目的地址差找路由器进行路由 -> 对于的接口上转发 av包。 client 就一条默认路由 就好像我们自己的电脑,就一条到路由器的默认路由的,对吧,我们叫 默认网关 dhcp 自动获得的没错吧? 但是路由器呢,是有很庞大的路由表的,而且它有 N 个网卡。 也就是说,有一个这个av是负责路由的库? 从 1 网卡收到的数据,通过 2网卡转发,那他怎么知道是通过2网卡而不是 3 网卡呢? 就是通过路由表 就一个负责路由 av包的库

路由表只有对 route 有意义 client 一般就设定一个默认路由,就是你登录的那台服务器. client 连接过去,路由表就自动加一条啊断开,就删一条 这样他就能通过路由表找到对应 client 的 TCP 连接 那个 socket ,然后转发消息 明白?