网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

什么是消息缓冲?

更新时间:2026年03月27日   作者:spoto   标签(Tag):

远程过程调用(Remote Procedure Call,RPC)是一种通信技术。它允许一个程序向另一个程序发送请求,从而让后者能够在网络上使用该程序的服务,而无需了解网络的详细信息。

在分布式系统中,进程间的通信是通过消息传递来完成的。这种方式允许进程之间通过基本的操作来交换消息。程序员需要了解消息的内容,以及发送和接收消息的进程的名称。进程使用 send() 函数来发送消息,而 receive() 函数则用于接收消息。

RPC消息:

在分布式系统中,进程之间的通信是通过将消息从一个进程传递到另一个进程来实现的。消息传递属于最底层的抽象层次,而RPC则代表了更高层次的抽象。由于采用了最底层的抽象方式,因此应用程序开发者需要能够识别消息的内容、发送进程的地址、接收进程的地址以及涉及到的数据类型。

语法:在消息传递过程中,用于 send() 和 receive() 原语的语法如下:

send (receiver, message) // requires the name of the destination process 
                            and the message data as arguments
receive(sender, message) // requires the name of the sender process 
                            and the message data as arguments

语义学:

  1. 阻塞/非阻塞:阻塞式的send()函数会停止当前操作,并等待消息被发送且消息缓冲区被清空之后才继续处理。而阻塞式的receive()函数则会在接收到消息之前一直处于阻塞状态。非阻塞式的send()函数则会将控制权迅速返回给调用者。此时,消息的传输过程可以与发送过程并行进行。
  2. 带缓冲处理的消息/不带缓冲处理的消息:“Unbuffered receive()”意味着,发送进程不会使用消息缓冲区来暂存消息,而是直接将消息发送给接收进程。在send()函数中,地址指的是发送进程的地址;而在buffered send()函数中,地址则指的是缓冲区的地址。
  3. 可靠的/不可靠的发送方式:不可靠的 send() 方法在发送消息给接收者时,不会等待接收者确认是否收到消息。此外,它也不会自动重新发送消息以确保消息能够被正确接收。而可靠的 send() 方法则能够确保消息在发送完成之前就已经被接收到了。
  4. 直接/间接沟通:使用端口可以实现间接通信。发送方将消息发送到端口,接收方则从该端口接收消息。与直接发送到中间端口的方式相比,消息会直接被发送到相关进程。在直接通信的情况下,需要明确指定要发送和接收的消息的进程。
  5. 固定大小/可变大小的消息:固定大小的消息的大小是由系统所限制的。而可变大小的消息则比较复杂,不过它们使得编程变得更加简单;相反地,固定大小的消息则会给编程带来更多的复杂性。

消息类型:

两个在 RPC 实现中使用的消息类型:

  1. 呼叫信息
  2. 回复信息/消息

1. 通话记录:

客户端向服务器发送调用消息,这样就能执行远程过程了。

格式:

  1. 远程过程标识符:该字段中包含了关于要执行的远程过程的详细信息。
  2. 论点/论据:执行该程序所需的参数或条件。
  3. 消息识别:该字段用于标识那些因序列号问题而丢失或重复的消息。
  4. 消息类型:该字段用于标识消息的类型,即该消息属于呼叫消息类型还是回复消息类型。
  5. 客户端身份识别:这个字段允许服务器识别客户端,同时还能验证客户端的身份。

RPC调用消息格式:

远程过程标识符
消息标识符消息类型客户端标识符程序编号版本号程序编号论点/论据

2. 回复消息:

服务器通过回复消息将远程过程执行的结果返回给客户端。两个回复消息的形式——成功的消息与失败的消息。

A. 成功的回复信息:如果特定的远程过程能够成功执行的话。

格式:

Message Identifier     Message Type     Reply Status (0) - Successful     Result

B. 一条失败的消息:如果出现以下任何一种情况,那么该消息就属于无效的类型:

  1. 服务器通过扫描客户端的标识符字段来确认,该客户端并未被授权使用这项服务。
  2. 该标识符缺失了。
  3. 如果服务器在程序编号、版本号或过程编号字段中找不到任何相关信息,那么……
  4. 在执行远程过程的过程中,出现了异常情况。
  5. 如果服务器无法解码给定的参数,那么……
  6. 服务器发现,该通话信息与其预期不符,因此不予接受。

格式:

Message Identifier     Message Type     Reply Status (1) - Unsuccessful     Reason for failure

消息缓冲

缓冲机制指的是在消息从某个进程传输到另一个进程的过程中,需要排队等待接收或发送消息。缓冲区是一种临时存储区域,用于暂时保存消息,直到接收进程准备好接收这些消息时再将其取出。根据同步和异步系统的不同,有以下几种缓冲机制:

同步系统

这些系统可能具备以下特点:没有缓冲器,也没有单消息缓冲器。

无缓冲区或没有缓冲区:

在无缓冲策略中,不会使用任何临时存储机制来保存消息。这种策略适用于异步通信方式。两个该策略中使用了以下几种方法:一种方式是,消息会保留在发送方的地址空间中,直到接收方完成当前接收操作之后才被发送出去。另一种方式是,消息会被丢弃,然后在一定时间后重新发送。这个时间是由系统自行设定的。

空缓冲区

单消息缓冲区:

在单消息缓冲机制中,缓冲区仅用于存储一条消息。只有当接收方尚未准备好接收该消息时,该消息才会被暂存于缓冲区中。缓冲区的位置可以位于内核的地址空间中,也可以位于接收方的进程地址空间中。这种机制适用于同步通信场景。

单消息缓冲区

2. 异步系统:

这些系统可以拥有无限容量的缓冲区,或者具有有限数量的消息存储能力(即多个消息的缓冲能力)。

无限制的容量缓冲区:

在这种策略中,如果接收方尚未准备好接收消息,那么发送方不必等待即可继续发送消息。所谓“无限制的容量”,指的是能够保留从发送方接收到的所有消息,并确保这些消息能够被顺利传递给接收方。这种策略适用于异步通信场景。

有限容量缓冲区(多消息缓冲区):

在有限大小的缓冲区中,这种机制被用来处理缓冲区溢出的问题。它适用于异步通信模式。所分配的缓冲区大小取决于具体的实现方式。以下是两种可以用来解决缓冲区溢出问题的方法:

  1. 沟通失败:无法达成有效交流。send()函数会返回一个错误信息给发送方,这意味着通信未能成功进行,因为消息没有到达预定的接收地点。这种方式的可靠性较低。
  2. 流量控制型通信:在这里,采用了流量控制策略。即,发送方会一直处于阻塞状态,直到接收方开始接受新的消息为止。这样,缓冲器中就会为新的消息腾出空间。这种策略可以避免因发送方被阻塞而导致的异步通信方式,从而避免意外地出现死锁情况。
多消息缓冲区

缓冲空间的分配方式取决于具体的实现方式。在接收端,消息被存储在邮箱中,而该邮箱可以位于内核的地址空间中,也可以位于接收端的接收方进程的地址空间中。

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

上一篇: OSI安全架构

下一篇: IGRP路由协议

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料