Exploiting Heterogeneity In Peer-To-Peer Systems