zoukankan      html  css  js  c++  java
  • 通信协议

      由于没有存储共享器,分布式系统中的所有通信都是基于底层消息交换的。如果进程A要与进程B通信,A必须首先在自己的地址空间中生成该消息,再执行一个系统调用,通知操作系统将该消息通过网络发送给B。

      为了使一组计算机能够通过网络相互通信,它们必须使用相同的协议。可以把协议划分为两大类。

      一类是面向连接协议,使用这种协议,消息发送方和接收方必须首先显式地确立连接,可能还需要就采用的协议进行协商,然后两者才能进行数据交换。通信完毕之后必须释放连接。

      一类是无连接协议,使用这种协议,交换数据之前不需要有建立连接的过程,消息发送方只需要在准备好的时候开始传送第一个消息即可。

      通信过程划分为7层:

      如机器1上的进程A想与机器2上的进程B通信,它先生成一个消息,然后将该消息传递给机器1上的应用层,该层可能是一个库过程,也可能通过其他方式实现。应用层软件随后在消息前面增加一个报头(header),并通过第6层与第7层之间的接口将处理后的消息传递给表示层。表示层在得到的消息中增加自己的报头,并将得到的消息传给下一层即会话层。逐层向下传递,某些层不仅要在消息头部增加自己的报头,而且还要在消息末尾增加报尾,当消息最终到达底层物理层时,由该层执行实际的消息传输,把它放置在屋里传输介质上去。

      那么此时封装的消息就为:

    1、传输协议

      当应用层接收到消息时,传输层将消息分为适于传输的足够小的块,每块都分配一个序列号,然后将它们发送出去,在传输层报头中设计的内容包括哪些包已发送、哪些包已接收到、接收方所拥有的空间还能够容纳多少包、哪些包应该重发以及其他一些类似的主题。

      网络传输协议称为传输控制协议(TCP),因特网协议簇也支持无连接的传输协议,该协议称为通用数据报协议(UDP),从本质上说,它不过是附加了某些次要内容的IP协议。不需要面向连接协议的用户程序通常使用UDP。

      会话层本质上是传输层的增强版本,它提供对话控制,还提供了同步功能,对于长时间的传输过程非常有用,它允许用户在传输过程中插入若干检查点,如果传输崩溃,只需要回退到最近的一个检查点(跟打游戏死了后回到前一个检查点一样哈哈),而不需要重新传输。不过实践中很少用到会话层。

    2、通信类型

      电子邮件系统是一个其通信为持久的典型示例。对于持久通信,提交传输的消息一直由通信中间件存储,直到该消息被传送给接收方为止。因此对于发送者来说,在提交消息后,就没必要持续运行了,同样,消息提交后,接收应用程序也没有必要持续运行。

      对于瞬时通信,通信系统只有在发送和接收应用程序正在运行时才存储消息。由于终端或因为接收方当前不在活动状态,中间件就不能传送消息了,而是把它丢掉。

    3、远程过程调用

      当机器A上的进程调用机器B上的进程时,A上的调用进程被挂起,而B上的被调用进程开始执行。调用方可以通过使用参数将信息传送给被调用方,然后可以通过传回的结果得到信息。编程人员看不到任何消息传递过程,这种方法称之为远程过程调用(RPC)

    3.1常规过程调用

      eg:count - read(fd,buf,bytes);

      其中,fd为一个整数型,表示一个文件。buf为一个字符数组,用于存储输入的数据,nbytes为另一个整型数,用来记录实际输入的字节数。调用前的堆栈如下图左,进行了调用,调用方先把参数反序压入堆栈,即最后一个参数最先压入。在read操作完后将返回值放入某个寄存器中,移出返回地址,并将控制权交回调用方。随后调用方将参数从堆栈移出,使堆栈还原到初始的状态。

    3.2 客户与服务器存根程序

      RPC背后隐含的思想是尽量使远程过程调用具有与本地调用相同的形式。即调用过程不应该发现被调用的过程实际在另一台机器上执行。比如犹如刚才的read,虽然read中执行了系统调用,但是它本身依然是通过将参数压入堆栈的常规方式调用。

      RPC是通过类似的途径获得透明性的。不同点在于,它并不要求操作系统提供数据,而是将参数打包成一个消息,然后将请求此消息发送到服务器。

      

      当消息到达服务器时,服务器上的操作系统将它传递给服务器存根,服务器存根是客户存根在服务器端的等价物,它也是一段代码,用来将通过网络输入的请求转换为本地过程调用,服务器存根一般先调用receive,然后被阻塞,等待消息输入。

    总的来说,远程过程调用包含下列步骤:

    (1)客户过程以正常的方式调用客户存根

    (2)客户存根生成一条消息,然后调用本地操作系统

    (3)客户端操作系统将消息发送给远程操作系统

    (4)远程操作系统将消息发送给服务器存根

    (5)服务器存根将参数提取出来,然后调用服务器

    (6)服务器执行要求的操作,操作完后将结果返回给服务器存根

    (7)服务器存根将结果打包成一个消息,然后调用本地操作系统

    (8)服务器操作系统将含有结果的消息发送回客户端操作系统

    (9)客户端操作系统将消息交给客户存根

    (10)客户存根将结果从消息中提取出来,返回给调用它的客户过程

  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/Null556/p/6791222.html
Copyright © 2011-2022 走看看