应用层/安全层/传输层怎样进行商议选型?

1、Why kubernetes not doesn’t use libnetwork

系统规划,协议先行。

多数技巧人并未接触协议的规划细节,越来越多的是选用已有协议举行应用层的编码,例如:

(1)使用http作为载体,设计get/post/cookie参数

(2)使用dubbo框架,而不用去深究内部的二进制桂林包体,以及连串号反系列化的底细

不管怎么样,了然商事安插的准绳,对深刻精晓系统通讯十分有支持。明日就以即时通信(后称im)为例,讲讲应用层的协议选型。

http://blog.kubernetes.io/2016/01/why-Kubernetes-doesnt-use-libnetwork.html

一、im协议的支行设计

所谓“协议”是双方共同遵循的条条框框,例如:离婚协议,停战协议。协议有语法、语义、时序三要素。
(1)语法:即数据与操纵新闻的布局或格式
(2)语义:即须求发出何种控制音信,完结何种动作以及做出何种响应
(3)时序:即事件完结顺序的详细表明

im协议布署分为三层:应用层、安全层、传输层。
图片 1
分别看下那三层的商事应该怎么选型。

2、Docker:Multi-host networking

二、im应用层协议安顿

应用层协议选型,常见的有二种:文本协议、二进制协议、流式XML协议。

(1)文本协议
文本协议是指
“贴近人类书面语言表明”的电视发布传输协议,典型的磋商是http协议,一个http协议大致长成那样:

GET / HTTP/1.1
User-Agent: curl
Host: musicml.net
Accept: */*

 

文件协议的特点是:

  • a.可读性好,便于调试
  • b.扩充性也好(通过key:value增加)
  • c.解析功效一般(一行一行读入,依据冒号分割,解析key和value)
  • d.对二进制的支撑不佳 ,比如语音/视频

im中,msn使用的是文本协议。

(2)二进制协议

二进制协议是指binary协议,典型是ip协议,以下是ip协议的一个图示:
图片 2
二进制协议一般定长南阳和可伸张变长包体 ,每一个字段固定了含义
,例如IP协议的前4个bit表示协议版本号 (Version)。
二进制协议有这么有些特点

  • a.可读性差,难于调试
  • b.伸张性糟糕,假设要壮大字段,旧版协议就不包容了,所以一般设计时会有一个Version字段
  • c.解析效能超高(大概从未解析代价)
  • 对二进制的扶助不好 ,比如语音/视频

im中,QQ使用的时二进制协议。

(3)流式XML协议
im的准标准协议xmpp就是利用流式XML,像gtalk,校内通那些im都以基于xmpp的,让大家来看一个xmpp协议的事例:

<message

to=’romeo@example.net’

from=’juliet@example.com’

type=’chat’

xml : lang=’en’>

<body>Wherefore art thou, Romeo?</body>

</message>

从xml标签中大概可以判定那是一个romeo发给juliet的谈天新闻。
xmpp协议得以兑现跨域的互通。例如gtalk和校内通用户聊天。只要服务端已毕了s2s服务(server
to server) ,但是以往的im基本没有互通须求,所以那些服务大旨没有人落成。
Xmpp协议有多少个特色:

  • a.它是准标准协议,可以跨域互通
  • b.XML的独到之处,可读性好,增加性好
  • c.解析代价超高(dom解析)
  • d.有效数据传输率超低(大批量的价签)

民用明确的显著不提出利用xmpp,越发是有线端im,假如要用,一定要和谐做压缩
,减少互连网流量(用过xmpp的同校都知道,发一个记名包须求有些交互,要浪费多少流量)。 

实质上的板栗
上边来看一个im协议的莫过于例子
,一般常见的做法是:定长二进制阜阳,可增添变长包体

  • 包体可以运用用文件、XML等增加性好的商事。
  • 新乡负责传输和分析作用,与工作非亲非故。包体保障伸张性,与作业有关。

那是一个实在的16字节im二进制定长咸阳

//sizeof(cs_header)=16
struct cs_header
{
uint32_t version;
uint32_t magic_num;
uint32_t cmd;
uint32_t len;
uint8_t data[];
}__attribute__((packed));

  • a.前4个字节是version;
  • b.接下来的4个字节是个“魔法数字(magic_num)“,用来保险数据错位或丢包难题,常见的做法是,济宁放几个约定好的特殊字符,包尾放多少个约定好的例外字符
    约定好,发给你的说道,某多少个字节地方,是0x 01020304 ,才是常规报文;
  • c.接下来是command(命令号),用来分别是keepalive报文、业务报文、密钥交流报文等;
  • d.len(包体长度),告知服务端要接到多少长度的包体。

那是一个实际的可增添im变长包体

message CUserLoginReq
{
optional string username = 1;
optional string passwd = 2;
}

message CUserLoginResp
{
optional uint64 uid =1;
}

选用的是google的Protobuf协议,能够看看,登录请求包传入的是用户名与密码,登录响应包回来的是用户的uid。
理所当然,除了Protobuf,可挑选的可扩充包体协议还有xml、json、mcpack(那…)等。

民用肯定的推介应用Protobuf,主要有多少个原因:

  • a.现成的解析库序列多,可以生成C++、Java、php等代码
  • b.自带压缩效用
  • c.在工业界已广泛应用
  • d.google制造

https://docs.docker.com/engine/userguide/networking/get-started-overlay/

三、im安全层协议布置

im协议,音讯的保密性相当首要,何人都不期望团结聊天内容被看到,所以安全层是必不可少的。

3、Docker libnetwork 设计文档

1、SSL

注解管理有些复杂,代价有点高。

https://github.com/docker/libnetwork/blob/master/docs/design.md

2、自行加解密

4、Docker network 官方文档

温馨来搞加解密,核心在于密钥的变通与管理,密钥管理措施有三种,主要有那样两种:

(1)固定密钥
服务端和客户端约定好一个密钥,同时约定好一个加密算法(eg:AES
),每一遍客户端im在殡葬前,就用约定好的算法,以及约定好的密钥加密再传输,服务端收到报文后,用约定好的算法,约定好的密钥再解密。那种办法,密钥和算法对程序员都以透明的。

(2)一人一密钥
简单易行说来就是各种人的密钥是固定的,然则种种人中间又分裂,其实就是在一定密钥的算法中含有用户的某一出奇性质,比如用户uid、手机号、qq号等。

(3)动态密钥(一session一密钥)
动态密钥,一Session一密钥的安全性更高,每一次对话前协议密钥。
密钥协商的进度要通过2次非对称密钥的肆意变化,1次对称加密密钥的随意生成,具体详情那里不举办,有趣味的同班可以看下SSL密钥协商额进度。

https://docs.docker.com/engine/userguide/networking/

四、im传输层协议布置

可选的情商有TCPUDP
近来的im传输层基本都以采纳TCP,有了epoll等技巧后,多连接就不是瓶颈了,单机几十万链接没什么难题。

 

原文链接:https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651959701&idx=1&sn=89850966b5e807097f8d273009104c50&chksm=bd2d04498a5a8d5f49e98825accf6fc3d3dd4edd49d92a0012befa992454c82191cbd4efa4be&scene=21#wechat_redirect

5、Docker multihost network 官方文档

https://docs.docker.com/engine/userguide/networking/get-started-overlay/

6、通晓Docker单机容器互连网

http://tonybai.com/2016/01/15/understanding-container-networking-on-single-host/

 7、kubernetes networking design document

https://github.com/kubernetes/community/blob/master/contributors/design-proposals/networking.md

8、kubernetes官方文档:Networking in Kubernetes

https://kubernetes.io/docs/admin/networking/

9、Four ways to connect a docker container to a local network

http://blog.oddbit.com/2014/08/11/four-ways-to-connect-a-docker/ 

10、Network Plugins

https://kubernetes.io/docs/admin/network-plugins/

11、Flannel 安装

http://dockone.io/article/618

12、Docker Networking Internals: How Docker uses Linux iptables and
interfaces

http://securitynik.blogspot.com/2016/12/docker-networking-internals-how-docker\_16.html

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注