This document discusses three important issues in message passing between threads/processes: naming, synchronization, and buffering. For naming, it describes direct communication schemes that are symmetric or asymmetric, and also introduces indirect communication using mailboxes. For synchronization, it discusses blocking vs non-blocking sends and receives. Asynchronous communication is more difficult but portable, while synchronous ensures synchronization. Finally, it discusses capacity/buffering of communication links and how that impacts blocking behavior.