An interprocess communication abstraction called a conversation is described. Although it provides an asynchronous message-passing facility, the conversation abstraction encodes synchronization information drawn from the distributed computation's logical clock with each message. The conversation abstraction can be implemented on an unreliable communications network at little cost, and because processes are free to use the synchronization information as needed, it is general enough to support efficient and elegant implementations of a wide spectrum of communication paradigms.