libp2p 概念之发布/订阅

发布/订阅

发布/订阅是一种系统,在该系统中,对等点聚集在他们感兴趣的主题周围。对某个主题感兴趣的对等点被称为订阅了该主题:

图表显示了一个带有弯曲轮廓的阴影区域,代表了一个主题。 分散在阴影区域内的是十二个点,代表对等点。 一个标签指向写着“Peers subscribed to topic”的点。

对等点可以向主题发送消息。每条消息都会传递给订阅该主题的所有对等方:

带有两个面板的图表显示从左到右的进展。 在第一个面板中,阴影区域内的散点表示订阅主题的对等点。 其中一个点是一个标有“消息”的对话气泡。 在第二个面板中,所有点现在都有一个对话气泡的副本,表示消息已传输到订阅该主题的所有对等点。

pub/sub 的使用示例:

  • 聊天室。每个房间都是一个发布/订阅主题,客户端发布聊天消息,房间中的所有其他客户端都会收到这些消息。
  • 文件共享。每个发布/订阅主题代表一个可以下载的文件。上传者和下载者在发布/订阅主题中公布他们拥有的文件的哪些部分,并协调将在发布/订阅系统之外发生的下载。

设计目标

在点对点发布/订阅系统中,所有对等点都参与在整个网络中传递消息。对等发布/订阅系统有几种不同的设计,它们提供了不同的权衡。理想的属性包括:

  • 可靠性:所有消息都传递给订阅该主题的所有对等点。
  • 速度:消息传递很快。
  • 效率:网络不会被过多的消息副本淹没。
  • 弹性:对等点可以在不中断网络的情况下加入和离开网络。没有失败的中心点。
  • 规模:主题可以拥有大量订阅者并处理大量消息。
  • 简单性:该系统易于理解和实施。每个对等点只需要记住少量的状态。

libp2p 当前使用一种称为gossipsub的设计。它以这样的事实命名,即对等点互相八卦他们看到了哪些消息,并使用这些信息来维护消息传递网络。

发现

在对等方可以订阅主题之前,它必须找到其他对等方并与它们建立网络连接。发布/订阅系统本身没有任何方法来发现对等点。相反,它依赖于应用程序代表它寻找新的对等点,这个过程称为环境对等点发现

发现对等点的潜在方法包括:

  • 分布式哈希表
  • 本地网络广播
  • 与现有对等点交换对等点列表
  • 集中跟踪器或集合点
  • 引导对等点列表

例如,在一个 BitTorrent 应用程序中,上述大多数方法在下载文件的过程中已经使用过。通过重用在 BitTorrent 应用程序执行其常规业务时发现的对等点,该应用程序也可以建立一个强大的发布/订阅网络。

发现的对等点被询问是否支持发布/订阅协议,如果支持,则将其添加到发布/订阅网络。

对等互连的类型

在 gossipsub 中,对等点通过全消息对等互连或仅元数据对等互连相互连接。整体网络结构由这两个网络组成:

图中显示了一个大的阴影区域,里面有许多相互连接的点,代表所有订阅同一主题的连接对等点。 标有“Full-message peering”的粗黑线将松散网格中的所有点连接起来,形成许多三角形和多边形。 在这些线之间有一个密集的网格,由更细、更轻的线组成,标记为“仅元数据对等”。 这些线从每个点延伸到它周围的几乎所有其他点,经常相互交叉。

完整留言

全消息对等互连用于在整个网络中传输消息的全部内容。该网络连接稀疏,每个对等点仅连接到其他几个对等点。(在里面八卦规范 这个连接稀疏的网络称为网格,其中的对等点称为网格成员。)

限制全消息对等互连的数量很有用,因为它可以控制网络流量;每个对等点仅将消息转发给其他几个对等点,而不是所有对等点。每个对等点都有一个目标数量的要连接的对等点。在这个例子中每个对等体将理想像将被连接到3个的其它对等体,但将沉降2 - 4 连接:

图中显示了一个大的阴影区域,内部有散点,由粗黑线连接,代表对等点之间的完整消息对等。 大多数点都有从它们到其他点的三条暗线。 其中一个点有四行从它开始,并标记为“对等点达到上限”。 一个不同的点只有两条线,并标记为“对等点达到下限”。 图表下方是一个图例,上面写着“网络对等互连度 = 3; 上限 = 4; 下界 = 2“ 伴随着小符号,分别显示三、四和两条线的点。

在本指南中,以紫色突出显示的数字 可由开发人员配置。

对等互连度(也称为网络度D)控制着网络速度、可靠性、弹性和效率之间的权衡。更高的对等程度有助于更快地传递消息,更有可能到达所有订阅者,并且任何对等点离开而破坏网络的可能性也更小。然而,高对等程度也会导致在整个网络中发送每条消息的额外冗余副本,从而增加参与网络所需的带宽。

在 libp2p 的默认实现中,理想的网络对等程度是 6,可以接受4 – 12 之间的任何 程度。

仅元数据

除了全消息对等连接的稀疏连接网络之外,还有一个仅元数据对等连接的密集连接网络。该网络由非全消息对等体的对等体之间的所有网络连接组成。

仅元数据网络共享有关哪些消息可用的八卦,并执行功能以帮助维护全消息对等网络。

图中显示了一个大的阴影区域,内部有散点,由许多细线连接,代表对等点之间的元数据对等。 点之间的线标有“每个对等互连是两个对等互连之间的网络连接”。

嫁接和修剪

对等互连是双向的,这意味着对于任何两个连接的对等点,两个对等点都认为它们的连接是完整消息,或者两个对等点都认为它们的连接仅是元数据。

任一对等方都可以通过通知另一方来更改连接类型。嫁接是将仅元数据连接转换为完整消息的过程。修剪 是相反的过程;将完整消息对等互连转换为仅元数据:

显示两个并排的两步过程的图表。 在第一个过程中是一条细细的线,连接两个点,代表通过仅元数据连接连接的两个对等点。 从左边的点发出一个语音气泡,上面写着“我正在将我们的连接嫁接到一个完整的消息对等中”,语音气泡下方是一个箭头,显示气泡沿着连接行进到右边的点。 在接下来的步骤中,这条线变粗、变暗,现在标记为“全消息对等”。 第二道工序与第一道工序相反; 两个点由一条粗而黑的线连接起来,这条线变成了一条标记为“仅元数据对等”的细线。 对话气泡上写着“我正在将我们的连接修剪回仅元数据的对等互连。”

当一个对等点的全消息对等点太少时,它会随机嫁接一些只有元数据的对等点成为全消息对等点:

带有三个面板的图表,显示了从上到下的进展。 在第一个面板中是一个点,从它向外辐射出许多线,代表具有许多连接的对等点。 其中两条线是黑色的,代表完整的消息连接。 旁边是一系列圆圈,其中前两个是深色阴影,标有“从 2 个完整内容对等点开始”。 系列中的前三个圆圈标记为“太少”。 接下来的九个圆圈标记为“可接受的数量”。 之后的圆圈标记为“太多”。 该系列中的第六个圆圈带有“理想”标签。 在第二个面板中,从该点辐射出的四个先前的光线已突出显示为绿色。 出现骰子符号,指示随机选择现在突出显示的行。 系列中的四个圆圈也以绿色突出显示, 直到标记为“理想”的圆圈。 该小组的标题是“选择更多的同行嫁接以获得理想的人数”。 在最后一个面板中,突出显示的绿线和圆点变暗,表明它们已成为完整内容的对等点。 标题为“嫁接完成”。

相反,当一个对等点有太多的全消息对等点时,它会随机将其中一些修剪回仅元数据:

包含三个面板的图表显示从上到下的进展,类似于上一个图表。 在第一个面板中是一个点,从它向外辐射出许多线,代表具有许多连接的对等点。 其中 14 条线是黑色的,代表完整的消息连接。 混合中还有一些细线代表仅元数据对等互连。 旁边是一系列圆圈,其中前 14 个圆圈带有深色阴影,标有“从 14 个完整内容对等点开始”。 系列中的前三个圆圈标记为“太少”。 接下来的九个圆圈标记为“可接受的数量”。 之后的圆圈标记为“太多”。 该系列中的第六个圆圈带有“理想”标签。 在第二个面板中,从点向外辐射的八条先前的暗线已突出显示为粉红色。 出现骰子符号,指示随机选择现在突出显示的行。 该系列中的八个圆圈也以粉红色突出显示,从末端到标记为“理想”的圆圈。 该面板的标题是“选择要修剪的对等节点以获得理想的数字”。 在最后一个面板中,突出显示的粉红色线条和点变亮,表明它们已成为仅元数据的对等点。 标题为“修剪完成”。

在 libp2p 的实现中,每个 peer 每1秒执行一系列检查 。这些检查称为 心跳。在此期间进行嫁接和修剪。

订阅和取消订阅

对等点跟踪其直接连接的对等点订阅了哪些主题。使用这些信息,每个对等点都能够建立一个关于他们周围主题的图片,以及哪些对等点订阅了每个主题:

图中显示中心有一个大点,周围有小点,这些小点通过细线连接到大点。 大点被标识为“从这个对等方的角度来看”,而较小的点被标识为“直连对等方”。 圆点后面是五个不同颜色的阴影区域,有些重叠,有些不相交。 每个区域都被标记为一个主题,从“主题 1”到“主题 5”。 阴影区域随着与大中心点的距离逐渐消失,表明对等方的视角范围有限。 不与大点共享阴影区域的较小点之一被标记为“即使未订阅与他们相同的主题,对等点也会跟踪其他人的订阅”。

通过发送订阅和 取消订阅消息来跟踪订阅。当两个对等点之间建立新连接时,它们首先向对方发送它们订阅的主题列表:

显示由细细线连接的两个点的图表。 每个点都有一个从它发出的语音气泡,带有一个箭头,表明它沿着连接线向另一个点移动。 左边圆点的对话气泡上写着“我订阅了:主题 1、主题 2、主题 3”。 右边圆点的对话气泡上写着“我订阅了:主题 1,主题 5”。

然后随着时间的推移,每当对等方订阅或取消订阅主题时,它都会向其每个对等方发送订阅或取消订阅消息。无论接收对等方是否订阅了相关主题,这些消息都会发送到所有连接的对等方:

显示由细细线连接的两个点的图表。 左边的点有一个语音气泡,它带有一个箭头,表明它沿着连接线朝右边的点移动。 对话气泡显示“我订阅了:主题 5。我取消订阅:主题 2、主题 3。”

订阅和取消订阅消息与嫁接和修剪消息齐头并进。当一个节点订阅一个主题时,它会选择一些节点,这些节点将成为该主题的完整消息节点,并在订阅消息的同时向它们发送嫁接消息:

带有显示向下进展的两个面板的图表。 第一个面板显示了一个中心点,它通过细线连接到另外两个点,一个在它的左边,一个在它的右边。 右点位于标有“主题 3”的阴影区域内。 两个气泡从中心点发出,一个指向左指向左点,另一个指向右指向右点。 左边的对话气泡显示“我订阅了主题 3”。 右侧的对话气泡显示“我订阅了主题 3。此外,我正在将我们的连接嫁接到全消息对等互连中。”  下一个面板显示了相同的三个点,但是中心点现在位于标记为“主题 3”的阴影区域内,并且连接中心点和右点的线变粗变暗,表明正在查看完整的消息。

当对等方取消订阅某个主题时,它将在发送取消订阅消息的同时通知其完整消息对等方他们的连接已被修剪:

带有显示向下进展的两个面板的图表。 它与上图类似,但顺序相反。 第一个面板显示了一个连接到其他两个点的中心点,一个在它的左边,一个在它的右边。 连接中心点和左边点的线是细而轻的,而连接中心点和右边点的线是粗而暗的。 中央和右侧的点位于标有“主题 3”的阴影区域内。 两个气泡从中心点发出,一个指向左指向左点,另一个指向右指向右点。 左边的对话气泡显示“我已取消订阅主题 3”。 右侧的对话气泡显示“我已取消订阅主题 3。此外,我正在将我们的连接修剪回仅元数据的对等互连。”  下一个面板显示相同的三个点,

发送消息

当一个节点想要发布一条消息时,它会向它所连接的所有完整消息的节点发送一个副本:

带有两个面板的图表显示从左到右的进展。 第一个面板的标题是“Peer 创建自己的新消息”。 一个小的、未标记的气泡从一个点发出。 该点有四条粗黑线从它向外辐射。 第二个面板的标题是“发送给所有其他完整消息对等方的消息”。 它显示了语音气泡的四个副本,现在沿着四行中的每一行远离圆点。

类似地,当一个对等点从另一个对等点收到一条新消息时,它会存储该消息并将副本转发给它所连接的所有其他完整消息对等点:

带有三个面板的图表,显示从左到右的进展。 第一个面板的标题是“传入消息”。 一个小的对话气泡沿着一条粗黑线向一个表示同行的点移动。 还有另外三条从圆点向外辐射的粗黑线。 第二个面板的标题是“Peer 存储消息的副本”。 它显示了相同的点,线条向外辐射。 对话气泡现在位于圆点上方的中心。 最后一个面板的标题是“消息转发给所有其他全消息对等点”。 它显示了对话泡泡的三个副本,现在正沿着对话泡泡尚未出现的三条线远离点。

在里面 八卦规范,对等点也称为路由器,因为它们具有通过网络路由消息的功能。

对等点记住最近看到的消息列表。这让对等方仅在第一次看到消息时对其进行操作,而忽略已看到消息的重传。

对等方也可以选择验证收到的每条消息的内容。什么算作有效和无效取决于应用程序。例如,聊天应用程序可能强制所有消息必须少于 100 个字符。如果应用程序告诉 libp2p 一条消息无效,那么该消息将被丢弃并且不会通过网络进一步复制。

闲话

同行们八卦他们最近看到的消息。每 1秒,每个对等方随机选择 6个仅元数据对等方,并向他们发送最近看到的消息列表。

带有三个面板的图表,显示从左到右的进展。 第一个面板的标题是“每 1 秒……”。 它显示了一个带有许多向外辐射的细线的点,代表仅元数据连接。 出现一个秒表符号,表示时间的流逝。 第二个面板的标题是“随机选择 6 个仅限元数据的对等互连”。 向外辐射的六条线已突出显示为黄色,并且出现一个骰子符号,表示随机选择。 最后一个面板的标题是“向他们发送最近看到的消息列表”。 现在突出显示的每条线都有一个从中心点向外移动的语音气泡。 六个对话气泡是相同的,上面写着“我见过:”,然后是较大的对话气泡内的三个小对话气泡符号,紫色深浅不一,表示三个不同的信息。

八卦让同伴有机会注意到他们错过了全消息网络上的消息。如果一个 peer 注意到它反复丢失消息,那么它可以与拥有消息的 peer 建立新的全消息对等。

以下是如何通过仅元数据对等互连请求特定消息的示例:

带有六个面板的图表,显示了向下的进展。 每个面板显示由细线连接的两个点,代表通过仅元数据连接连接的两个对等点。 每个点还有其他几条向外辐射的线,有的细而亮,有的粗而暗。 这些线代表与未描绘的其他对等点的仅元数据和完整消息对等点的混合。 第一个面板的标题是“Peer 从他们的完整消息 peer 接收消息”。 在图表的左侧,有三个紫色气泡沿着三条粗黑线向左侧的点移动。 第二个面板的标题是“Peer 等到心跳并选择随机的元数据对等点”。 左侧圆点上方是秒表和骰子符号,代表时间的流逝和随机选择。 连接到左侧点的三条线以前细而轻,现在已突出显示为黄色,包括连接左右点的线。 突出显示的线代表随机选择的连接。 第三个面板的标题是“新收到的消息被八卦给仅元数据的同行”。 此面板仍显示黄色突出显示的连接。 从左边的点发出并沿着连接它和右边点的线行进的是一个语音气泡,上面写着“我见过:”,然后是一个紫色的小语音气泡,代表左点刚收到的消息。 第四个面板的标题是“Peer注意到它没有八卦消息并请求它”。 之前突出显示的线条又变细了。 右边的点有一个从它发出的对话泡泡, 前往左边的同行,上面写着“请发送:”,然后是同样的紫色小气泡。 第五个面板的标题是“请求的消息已传输”。 现在有一个紫色的气泡沿着连接两个点的线从左到右移动。 最后一个面板的标题是“新收到的消息被广播到完整内容的对等点”。 现在有紫色语音气泡的三个副本,从右边的点沿着与之相连的三条粗黑线向外传播。

在里面 八卦规范,八卦宣布最近看到的消息称为IHAVE消息,对特定消息的请求称为IWANT消息。

扇出

允许对等点向他们未订阅的主题发布消息。有一些关于如何执行此操作的特殊规则,以帮助确保可靠地传递这些消息。

第一次节点想要向它未订阅的主题发布消息时,它会随机选择订阅该主题的6 个节点(如下所示的3 个)并将它们记住为该主题的扇出节点:

带有两个面板的图表显示从左到右的进展。 第一个面板的标题是“Peer 想要向它未订阅的主题发布消息”。 它在阴影区域内显示一小群点,代表订阅了某个主题的对等点。 这些点由代表仅元数据和完整消息对等的细线、浅线和粗线混合而成。 阴影区域外是一个单点,表示未订阅该主题的对等方。 这个点通过细线连接到阴影区域内的几个点。 第二个面板的标题是“随机选择 3 个订阅该主题的对等点并将它们记住为扇出对等点”。 在这个面板中, 将外部点连接到阴影区域内的点的三条线已变为蓝色,现在末端的箭头指向它们所连接的阴影区域内的对等点。 这些线代表扇出对等互连。 存在骰子符号,指示随机选择哪些仅元数据对等成为扇出对等。

与其他类型的对等互连不同,扇出对等互连是单向的;它们总是从主题外的对等点指向订阅该主题的对等点。订阅该主题的对等方不会被告知他们已被选中,并且仍将连接视为任何其他仅元数据对等方。

每次发送者想要发送消息时,它都会将消息发送到其扇出对等点,然后由后者在主题内分发消息:

带有两个面板的图表显示从左到右的进展。 如上图所示,每个面板都显示订阅了一个主题的同一个节点集群,在外面有一个节点。 第一个面板的标题是“发送给扇出节点的新消息”。 它显示了三个紫色气泡沿着三个蓝色箭头从单个向阴影区域内的同行传播。 这表示三个应用程序消息通过三个扇出连接发送到订阅该主题的三个对等点。 第二个面板的标题是“一旦进入主题,消息将照常转发给所有其他订阅者”。 紫色的气泡已经从阴影区域的外面移到外面。 现在,阴影区域中的每个点上方都有对话气泡的副本。

如果发送者要发送消息,但注意到他们的一些扇出对等点自上次以来就消失了,他们将随机选择额外的扇出对等点将它们顶回6

当一个节点订阅一个主题时,如果它已经有一些扇出节点,它会更喜欢它们成为完整消息的节点:

带有两个面板的图表显示从左到右的进展。 每个面板都显示订阅了一个主题的同一个节点集群,外面有一个节点,如上图所示。 第一个面板的标题是“Peer has existing fan-out peerings”。 在连接阴影区域外的点和阴影区域内的点的线中,其中三个是蓝色的,并且有指向阴影区域内的点的箭头,而其余的则是细、轻且没有箭头。 这表示未订阅主题的对等点具有三个扇出对等点,其中对等点订阅了该主题,其余对等点仅是元数据。 第二个面板的标题是“订阅主题后,扇出对等互连优先成为全消息对等互连”。 以前在阴影区域外的单个对等点现在在阴影区域内, 表示它现在订阅了该主题。 三个以前的蓝色箭头变成了粗黑线,代表以前的扇出对等互连变成了全消息对等互连。 点的其他线条仍然像以前一样细而轻。

2分钟未向主题发送任何消息后,该主题的所有扇出对等点都将被遗忘:

带有两个面板的图表显示从左到右的进展。 每个面板都显示订阅了一个主题的同一个节点集群,其中一个节点在外面,包括三个蓝色的带箭头的扇出节点,如上图所示。 第一个面板的标题是“在 2 分钟内没有发布任何消息之后……”在单点上方有一个秒表,表示时间的流逝。 第二个面板的标题是“所有扇出对等互连恢复为仅元数据对等互连”。 在此面板中,将单个点连接到阴影区域内的点的三条以前的蓝色箭头线变得又细又轻,代表对等方的扇出对等互连变为仅元数据对等互连。

网络数据包

对等点实际通过网络相互发送的数据包是本指南中所有不同消息类型的组合(应用程序消息、拥有/想要、订阅/取消订阅、嫁接/修剪)。这种结构允许将多个不同的请求批量处理并在单个网络数据包中发送。

这是整个网络数据包结构的图形表示:

显示标题为“网络数据包”的大气泡的图表。 气泡分为四个主要部分,标题为“应用消息”、“我已经看到这些消息”、“请给我发送这些消息”、“订阅更改”和“嫁接和修剪”。 在标题为“应用程序消息”的部分内有一个标记为“应用程序消息”的较小的紫色气泡。 紫色的对话气泡包含几个纸质表单样式的填充字段。 发件人字段显示“Peer A”。 序列号字段显示 5。收件人(主题 ID)字段有三行,分别是“主题 1”、“主题 2”和“主题 3”。 消息正文字段显示“有记录以来最重的家猫为 21.297 公斤”。 最后两个字段用于发送者公钥和发送者签名。 每一个都包含一系列 0 到 255 之间的随机数字, 表示一系列字节。 紫色语音气泡下方是另一个也标记为“应用程序消息”的气泡,但是此气泡逐渐消失并且没有任何字段可见,这表示存在已在此图表中省略以显示的其他应用程序消息。 在标题为“我已经看到这些消息”(副标题:“我有”)的部分中,有一个包含三列的表格。 这些列的标题是“收件人(主题 ID)”、“发件人”和“序列号”。 表中有三行,每一行都填充了主题名称、发送者和序列号。 数据是说明性的,具体数值并不重要。 在标题为“请给我发送这些消息”(副标题:“IWANT”)的部分中,有一个与前一个类似的表格,但只有发送者和序列号列; 收件人栏不存在。 再次, 表中有三行,填充了说明性的发件人和序列号。 在标题为“订阅更改”的部分中有一个包含两列的表格。 第一栏的标题是“对于这个话题……”,第二栏的标题是“我想要……”,可选择订阅或取消订阅。 该表有三行填充数据。 其中两个主题正在订阅,一个正在取消订阅。 在标题为“嫁接和修剪”的最后一节中,是另一个具有两列的表,与上一个表类似。 第一栏的标题是“对于这个主题……”,而第二栏的标题是“你已经……”,可选择嫁接或修剪。 此表中有三行。 其中两个主题已被嫁接,一个已被修剪(与上表没有特别的联系)。

见 规格 对于确切的 协议缓冲区 用于编码网络数据包的模式。

状态

以下是每个对等方必须记住的状态摘要,以参与发布/订阅网络:

  • 订阅:订阅的主题列表。
  • 扇出主题:这些是最近发送消息但未订阅的主题。对于每个主题,都会记住上次向该主题发送消息的时间。
  • 当前连接到的对等点列表:对于每个连接到的对等点,状态包括它们订阅的所有主题以及每个主题的对等连接是完整内容、仅元数据还是扇出。
  • 最近看到的消息:这是最近看到的消息的缓存。它用于检测和忽略重传的消息。对于每条消息,状态包括发送者和序列号,这足以唯一标识任何消息。对于最近的消息,会保留完整的消息内容,以便可以将其发送给任何请求消息的对等方。

标题为“对等状态”的图表。 有四个部分,标题为“我订阅的主题”、“我最近向其发送消息的主题”、“当前连接的对等点”和“最近看到的消息”。 在标题为“我订阅的主题”的部分中,列出了三个任意主题名称,“主题 1”、“主题 4”和“主题 5”。 在标题为“我最近向其发送消息的主题”(副标题:“但不订阅”)的部分中,有一个表格,其中列出了每个主题 ID 的主题 ID 和上次发送消息的时间。 列出了两个主题,主题 6 和主题 7,分别是 10 秒前和 35 秒前发送的最后一条消息。 标题为“当前连接的对等点”的部分包含一个大表。 这些列的标题是“对等 ID”、“他们订阅的主题”和“对等类型”,可以选择完整消息、仅元数据或扇出。 该表填充了六个不同的对等点,其中一些订阅了多个主题,因此在“他们订阅的主题”和“对等互连的类型”列中有多行。 对于每个对等方订阅其中一个框的每个主题,都为完整消息、仅元数据或扇出打勾。 勾选完整消息的主题是上面“我订阅的主题”部分中列出的所有主题。 同样,对于扇出被勾选的主题,这些主题都出现在“我最近向其发送消息的主题”部分的上方。 在标题为“最近看到的消息”的最后一部分中,是另一个大表。 列是“Sender (Peer ID)”、“Sequence number”、“Time first seen”和“Full message”。 表格的前四行用“最后几秒”标签括起来。 此括号内的行都有完整的消息列,其中填充了一个紫色的气泡,表示完整的消息内容作为过去几秒钟内看到的消息的状态的一部分被记住。 表格的所有八行都用标签“最后 2 分钟”括起来,但是对于最后四行,完整的消息列是空的。 这些行仅填充了发送者(对等 ID)、序列号和首次出现时间列。 表格行按第一次看到的时间顺序列出,从第一行的 1 秒前到底部行的 90 秒前。 一些序列号在消息之间共享,但仅限于发送者不同的地方。 表格的所有八行都用标签“最后 2 分钟”括起来,但是对于最后四行,完整的消息列是空的。 这些行仅填充了发送者(对等 ID)、序列号和首次出现时间列。 表格行按第一次看到的时间顺序列出,从第一行的 1 秒前到底部行的 90 秒前。 一些序列号在消息之间共享,但仅限于发送者不同的地方。 表格的所有八行都用标签“最后 2 分钟”括起来,但是对于最后四行,完整的消息列是空的。 这些行仅填充了发送者(对等 ID)、序列号和首次出现时间列。 表格行按第一次看到的时间顺序列出,从第一行的 1 秒前到底部行的 90 秒前。 一些序列号在消息之间共享,但仅限于发送者不同的地方。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值