The conventional client-server architecture lacks scalability because a bottleneck is likely to form on the server side when there are a large number of clients requesting content. Given the low adoption rate of multicast within the Internet infrastructure, peer-to-peer networks, for their theoretically greater throughput, have become the top choice when it comes to real-time stream sharing.
A peer-to-peer network configured to provide streaming service normally comprises a plurality of nodes or peers. Segment by segment, these nodes download data from each other or from a content source, and upload data to other nodes when requested to do so. In particular, each node maintains a scheduling window; as the segments of a stream are downloaded, processed (e.g. a frame of a video stream being played), and discarded (or removed from the buffer for downloaded data), the scheduling window continuously slides forward, instructing the node to request certain segments. In practice, however, the nodes often make their scheduling windows as large as possible to cover the latest segments, while each node tends to obtain all the data it needs from one node, resulting in the overloading of a handful of nodes (usually including the content source) and even the tragedy of the commons, wherein the network is paralyzed and as inefficient as the client-server architecture.