组播(Group communication)

组播也称多播或群播,是计算机中一种群组通信,它是发送单一消息到所有群组成员的概念抽象。引入群组的概念,允许程序员将一系列进程作为一个抽象概念来处理。一般来说群组成员是动态的,一个进程随时可以加入或离开一个群组。同一时刻,一个进程可以属于多个群组。理想情况下,进程只需要发送一个消息到一个群组,消息会被群组所有进程接受处理,发送进程并不需要知道群组成员。

实现组播

组播可以通过支持组播的硬件实现(Ethernet和wifi都支持组播和广播),如果硬件不支持,可以通过硬件向所有客户端广播,然后在客户端通过软件过滤来实现。每个广播消息添加组播地址标签,当客户端收到广播消息时候,会与自己接受的组播地址做匹配,如果不匹配就丢弃该消息。

image.png

另外一种组播的实现是完全软件模拟。对组中的每个进程单独发送一个消息,这又有两种方式,第一个是发送进程直接向组中所有进程单独发送消息,这要求发送进程能知道进程组所有进程信息。再就是发送进程发送消息到进程组中协调进程(知道进程组成员信息),由协调进程向进程组每个进程发送消息。

image.png

与单播通信一样,组播也需要传输层协议,能够将消息有效的传输到目的地。

组播容错语义

  • 可靠性

    原子多播(Atomic multicast):消息要么正确送达所有成员,要么不送达任何成员。即向一个群组发送了一条信息,如果一个成员收到了该信息,那么必须保证所有群组成员都会收到该信息。 满足该属性的组播就称为原子组播(原子多播)。 如何实现原子多播是一个困难的事情,它需要所有接收者都要发送确认,并且需要处理发送者或接收者崩溃以及消息或确认丢失的情况。

    可靠多播(Reliable multicast):是对原子多播的一种妥协,它假定发送进程将保持存活,以确保信息已发送给组内所有成员,尽可能到实现消息的传递,但是在接收者不可达的情况下不保证。

    不可靠多播(Unreliable multicast):不提供消息到达检测和重传机制,用于不需要可靠性的场景如音视频,以及发送者不知道组成员的场景。

  • 消息序

    一致的消息顺序是组播易用的基础。假设我们有一个由四个进程{0,1,2,3}组成的进程组。组外的进程A和B通过多个单播在大致相同的时间向组内发送信息。A发送信息MAM_A,B发送信息MBM_B
    进程A:MAP0MAP1MAP2MAP3M_A→P_0,M_A→P_1,M_A→P_2,M_A→P_3
    进程B:MBP0MBP1MBP2MBP3M_B→P_0,M_B→P_1,M_B→P_2,M_B→P_3
    如果每个进程都收到了信息序列{MAM_AMBM_B},那么消息序就是一致的。反之如果一些进程先收到MAM_A,然后收到MBM_B,而另一些进程先收到MBM_B,然后收到MAM_A,那么消息序就是不一致的。

    全局时间顺序(Global time ordering):所有消息按照准确的发送顺序到达,实现全局时间顺序是不大现实的,由于物理距离和时钟偏移的问题,我们不能指望接受进程通过精确的唯一时间戳来进行一致的比较。

    全序(Consistent time ordering):是全局时间顺序的一种妥协,只需所有消息将以相同的顺序发送给所有群组成员,但是到达顺序不一定与实际的发送顺序严格一致。

    因果序/偏序(Partial ordering):只对有因果关系的消息(根据lamport的"happenedBefore")将按顺序传递给所有组员。并发消息可以按任何顺序传递。

    同步排序(Sync ordering):进一步放宽要求后,不同的进程可以以不同的顺序接收报文。提供一种特殊的报文类型:同步(sync)原语,它可以用来确保在接受任何附加(同步后)报文之前处理任何待处理报文。这意味着如果发送了消息,所有成员都将在同步操作之前处理该消息。成员发送同步信息后发送的任何信息都将在同步后由所有成员处理。同步的任何一方都不会分割信息的发送。这种信息排序方式称为同步排序。

    无序(Unordered):消息可以以任意的顺序传递给不同的成员。我们可以对相同源的消息进行顺序排序,这意味着从一个成员发送的所有信息都将按照发送的顺序被接收,不同的消息源的消息对于不同接收者可能不同。