Many services across the distributed system may be interdependent. In the sprite of reuse, a service readily will ask another service for help. One service communicates with another service to jointly solve a problem. Past answers may be cached and reused. Default answers may be available on the local host.
Meta data, data, and function sharing are prevail. Services in the distributed system really act like a collection of ``virtual'' services as they share more and directly implement less. Component assembly is the paradigm for building services.
Interdependence is in conflict with change. The more a service depends on other services the more potential conflicts may arise when a change occurs. Interfaces and contracts in a distributed system must be very static and stable to accommodate both change and interdependence.
It is very simple to extend a service, but much more difficult to shrink or remove a service. In fact, old services are still provided by having the old service evoke a newer service. Many services include undefined extension parameters to accommodate future changes.
Alternatively, two services communicating over an interface could dynamically negotiate the protocol and contract. This implies that the meta interface needs to be static and stable allowing for a more dynamic definition of the service interface.
Telnet is an example of a protocol with interface negotiation while FTP is an example of a protocol without interface negotiation. As a result, you see many versions of FTP running on a system while only one version of TELNET is present.