nanomsg笔记--通信协议与传输协议

  花了一段时间吧nanomsg的源码给编译了一遍,同时对里面的主要的协议进行了调试。

  由于该项目是c写的,发现可读性太差了,调试了很多遍仍然模模糊糊的。再加上该项目中的代码量也不低,所以这个练习是我吸收的最差的一个。  决定不能再在上面耗着了,将目前能够理解的,结合网友的经验帖进行记录一下。

   注意,这里的传输协议不是规范的叫法,也并非tcp/ip协议的那个传输层协议,而是属于应用层的一种协议。我为了方便记忆就暂称之为传输协议。

   通信协议,我这里指的是 通信双方的行为表现。

1.通信协议之bus总线通信:

1.1图解:

nanomsg笔记--通信协议与传输协议_第1张图片

1.2实现:

nanomsg笔记--通信协议与传输协议_第2张图片

nanomsg笔记--通信协议与传输协议_第3张图片

1.3注释:

  绑定在某一个地址(总线,bus)上的节点,可以收到其它所有连接在该总线的节点发送的信息;同时,它发送的信息也可以被所有的其它节点接收到。

   只是连接在某一个地址上的两个节点或者多个节点,彼此的消息是不可达的。  即上图中的虚线部分是不可达的。 

   它内部的实现通过priolist提供消息通信的实现;

2.通信协议之pipeline单向管道推送协议:

2.1图解:

nanomsg笔记--通信协议与传输协议_第4张图片

nanomsg笔记--通信协议与传输协议_第5张图片

2.2实现:

nanomsg笔记--通信协议与传输协议_第6张图片

nanomsg笔记--通信协议与传输协议_第7张图片

2.3注释:

   它是基于socket实现的,但是不必像socket那样,服务端绑定后,客户端连接。

   可以客户端先连接,然后服务端再绑定。 它是通过 状态机+定时器+线程池事件机制自动完成的这个步骤;

   内部是通过:lb负载+priolist实现;

3.通信协议之pair端对端通信模型:

3.1图解:

nanomsg笔记--通信协议与传输协议_第8张图片

3.2注释:

  它跟 socket很像,socket也是端对端的通信。但是针对同一个地址,可以有多个连接进行连接。

   pair端对端通信协议,限定了一个地址的两端,只能为1对1的关系。

   其内部是通过exel + pipe的方式完成;

4.通信协议之pub/sub消息广播模式:

4.1图解:

nanomsg笔记--通信协议与传输协议_第9张图片

nanomsg笔记--通信协议与传输协议_第10张图片

4.2实现:

nanomsg笔记--通信协议与传输协议_第11张图片

nanomsg笔记--通信协议与传输协议_第12张图片

4.3注释:

   它与pipeline通信模型有些相似,最大的不同在于,它是 单生产者单消费者的。

   它是基于 list,priolist实现;

5.通信模型之req/rep请求响应模型:

5.1图解:

   略,与pipeline差不多,不过它有操作时序的要求。 

5.2实现:

nanomsg笔记--通信协议与传输协议_第13张图片

5.3注释:

   与服务器容器很像。  客户端发起请求,服务端返回响应。

   服务端不可能事先给客户端发送响应。 

6.通信协议之surveyor/respondent调查者模式:

6.1图解:

nanomsg笔记--通信协议与传输协议_第14张图片

6.2实现:

nanomsg笔记--通信协议与传输协议_第15张图片

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有了一些优化。 

     协议,虚拟机  本质上 就是个 状态机。 

资源

        nanomsg的地址;

        nanomsg使用;

         nanomsg和zeromq的区别;

你可能感兴趣的:(c++)