(507条消息) nanomsg笔记--通信协议与传输协议_Automannnn的博客-CSDN博客_nanomsg花了一段时间吧nanomsg的源码给编译了一遍,同时对里面的主要的协议进行了调试。
由于该项目是c写的,发现可读性太差了,调试了很多遍仍然模模糊糊的。再加上该项目中的代码量也不低,所以这个练习是我吸收的最差的一个。 决定不能再在上面耗着了,将目前能够理解的,结合网友的经验帖进行记录一下。
注意,这里的传输协议不是规范的叫法,也并非tcp/ip协议的那个传输层协议,而是属于应用层的一种协议。我为了方便记忆就暂称之为传输协议。
通信协议,我这里指的是 通信双方的行为表现。
1.通信协议之bus总线通信:
1.1图解:
1.2实现:
1.3注释:
绑定在某一个地址(总线,bus)上的节点,可以收到其它所有连接在该总线的节点发送的信息;同时,它发送的信息也可以被所有的其它节点接收到。
只是连接在某一个地址上的两个节点或者多个节点,彼此的消息是不可达的。 即上图中的虚线部分是不可达的。
它内部的实现通过priolist提供消息通信的实现;
2.通信协议之pipeline单向管道推送协议:
2.1图解:
2.2实现:
2.3注释:
它是基于socket实现的,但是不必像socket那样,服务端绑定后,客户端连接。
可以客户端先连接,然后服务端再绑定。 它是通过 状态机+定时器+线程池事件机制自动完成的这个步骤;
内部是通过:lb负载+priolist实现;
3.通信协议之pair端对端通信模型:
3.1图解:
3.2注释:
它跟 socket很像,socket也是端对端的通信。但是针对同一个地址,可以有多个连接进行连接。
pair端对端通信协议,限定了一个地址的两端,只能为1对1的关系。
其内部是通过exel + pipe的方式完成;
4.通信协议之pub/sub消息广播模式:
4.1图解:
4.2实现:
4.3注释:
它与pipeline通信模型有些相似,最大的不同在于,它是 单生产者单消费者的。
它是基于 list,priolist实现;
5.通信模型之req/rep请求响应模型:
5.1图解:
略,与pipeline差不多,不过它有操作时序的要求。
5.2实现:
5.3注释:
与服务器容器很像。 客户端发起请求,服务端返回响应。
服务端不可能事先给客户端发送响应。
6.通信协议之surveyor/respondent调查者模式:
6.1图解:
6.2实现:
6.3注释:
它刚好与 请求响应模式有一点对立的意思; 它的首次发送信息必须由 服务端发起;
传输协议我在这里的理解是 数据所在的目的位置,或者数据传输的途径。
7.传输协议之inproc进程间数据传输:
7.1实现:
在windows中,它是通过共享内存完成的。 该内存封装在 ctx上下文中,在传输的过程中从上下文中拷贝至目标内存进行实现。
在linux中,系统提供该协议的支持。
8.传输协议之ipc线程间数据传输:
8.1实现:
在windows中,通过WriteFile(), ReadFile()的方式,完成数据的传输;
在linux中,系统提供支持;
9.传输协议之tcp基于ip的传输协议:
9.1实现:
通过套接字api实现通信过程;
10.传输协议之ws传输协议:
10.1实现:
通过socket套接字api实现通信;
由浏览器提供支持的socket;它能引导一个http协议升级成 websocket协议,俺认为这是它与socket最大的不同。
总结:
由于使用的是c语言,这对我调式和理解代码增加相当的难度,尤其是多个的结构体的使用,使我理解起来造成了极大困难;
这次练习的本意的是熟悉消息队列,但是没有达到效果。
很多东西用面向对象的思维,其实更容易理解。 不过据说nanomsg使用c实现使得它的效率提高了,相较于zeromq有了一些优化。
协议,虚拟机 本质上 就是个 状态机。
资源: