The address chosen by each node is essentially the IP address and port of the receiver socket. However, for the following reasons, this is not good enough:
- The node is shunned (excluded) and re-joins after leaving. We'd like to have the same logical address, although the physical address changed. This is already done in JBoss code, should be available in JGroups proper
- NIC failover: a NIC goes down, we want to continue sending/receiving on a different NIC
- The sender sends on all available NICs (send_on_all_interfaces="true"). This means that -if we take the receiver's datagram packet's address to be the identity of the sender - we get N different identities; 1 for each interface the message is sent on
- Network Address Translation: the sender's address might get changed by the NAT
- A logical address consists of
- a user-given (or generated) name, e.g. "X". This name stays with the address from channel creation
to channel close
- a UUID. This is created on channel connect, deleted on channel disconnect and re-created on channel
connect. This is used for equals() and hashCode() of the logical address. Since it is re-created on
every connect(), it will prevent reincarnation issues. UUIDs are guaranteed to be unique over time for
a given host. This is better than using address:port, because port is not guaranteed to be unique over
time, especially when we use bind_port
- A logical address is picked, either by JGroups, or set by a user on channel creation. The lifetime of this address is the lifetime of the process in which the channel is created, or until channel.close() or disconnect() is called.
- Each member as a small cache, in which it associates the logical addresses for messages received with the sender's address. When a message is to be sent to a logical address (unicast message), the corresponding physical address is looked up from the cache. Note that there maybe multiple physical addresses if the same message was sent on different interfaces (send_on_all_interfaces="true").
- The logical addresses must be picked such that they cannot be reused after disconnect()/close().