In OData, entity instances have unique ids.
In addition, ATOM defines selflinks, for refreshing the contents of an entry, and editlinks for updating the contents of an entry. In our JSON format we have said that the self/edit links are only written if they are different from the ID, and the ID is not written if it can be generated from the payload based on conventions (i.e., if the payload contains the key fields, and the service supports the convention for looking indexing a set by key, such as ~/Customers('ALFKI').
Ids can also be used in place of entries in navigation links to reduce payload size, in deltas to represent relationships and deleted entries, and can be explicitly selected using $ref.
$links, on the other hand, returns a "canonical URL" for the related entity.
In order to be a better citizen of the Semantic Web, in addition to supporting the types of optimizations that we have in JSON and other uses of ids, we should state that IDs are URIs and recommend to service implementers that those URIs be dereferenceable. Then we can say that the URLs returned by $links are the same as the values returned by $id, etc.