A system consisting of multiple processing nodes (which, depending on the scale being considered, can be different processes running on a single CPU, individual CPUs in a MultiProcessor? system; individual computers on a network, a cluster/server farm, or even an entire "site" on a WideAreaNetwork?), which work together to solve some problem or benefit some enterprise, and for which communication between nodes is either expensive (in terms of bandwidth or latency, not $$$), unreliable, or both. In many cases, the configuration of the network may dynamically change, often without warning or any centralized control.
Writing software for DistributedSystems is a long-standing problem in ComputerScience.
Just some problems that occur in DistributedSystems:
Discovering the topology of the "network", and/or changes to the topology.
Determining if a particular link or node has failed, or is providing low QualityOfService?
Low-level references/poitners valid on one node may not be valid on another
Determining if messages sent from one node to another arrive a) at all, b) completely, c) in the correct order, and d) without errors.