From 3caaddf8f8dd33511700e46d2af998a696f7d6d4 Mon Sep 17 00:00:00 2001 From: Larry Peterson Date: Fri, 19 Jun 2026 15:04:58 -0700 Subject: [PATCH 1/4] llp pass + p2p Signed-off-by: Larry Peterson --- overlay.rst | 1 + overlay/cdn.rst | 80 ++++---- overlay/conference.rst | 75 +++++--- overlay/figures/f09-29-9780123850591.png | Bin 0 -> 86798 bytes overlay/p2p.rst | 230 +++++++++++++++++++++++ 5 files changed, 325 insertions(+), 61 deletions(-) create mode 100644 overlay/figures/f09-29-9780123850591.png create mode 100644 overlay/p2p.rst diff --git a/overlay.rst b/overlay.rst index bbdf1eb..0083ba1 100644 --- a/overlay.rst +++ b/overlay.rst @@ -56,3 +56,4 @@ available to applications. .. include:: overlay/design.rst .. include:: overlay/cdn.rst .. include:: overlay/conference.rst +.. include:: overlay/p2p.rst diff --git a/overlay/cdn.rst b/overlay/cdn.rst index 87c59c1..8a5c853 100644 --- a/overlay/cdn.rst +++ b/overlay/cdn.rst @@ -40,8 +40,7 @@ There’s not a lot anyone except you or your local service provider can do about the first-mile problem, but it is possible to use content replication to address the remaining problems. Content distribution networks are the systems that manage the process of replicating -content and delivering it to clients, which has a few more moving -parts than first meet the eye. Akamai was one of the first operators +content and delivering it to clients. Akamai was one of the first operators of a CDN and today there are a number of large CDN operators with global footprints. @@ -51,11 +50,11 @@ of *backend servers*. Thus, rather than having millions of users wait forever to contact when a big news story breaks—such a situation is known as a *flash crowd*—it is possible to spread this load across many servers. Moreover, rather than having to traverse multiple ISPs -to reach ``www.cnn.com``, if these surrogate servers happen to be +to reach a popular site, if these surrogate servers happen to be spread across all the backbone ISPs, then it should be possible to reach one without having to cross a peering point. Clearly, maintaining thousands of surrogate servers all over the Internet is -too expensive for any one site that wants to provide better access to +too expensive for most sites that wants to provide better access to its web pages. Commercial CDNs provide this service for many sites, thereby amortizing the cost across many customers. @@ -68,9 +67,12 @@ also the case that only static pages, as opposed to dynamic content, are distributed across the surrogates. Clients have to go to the backend server for any content that either changes frequently (e.g., sports scores and stock quotes) or is produced as the result of some -computation (e.g., a database query). +computation (e.g., a database query).\ [#]_ -.. TODO -- need to check - can't code run in modern CDN nodes? +.. [#] CDN operators sometimes offer a complementory service that + allows their customers to dynamically generate certain content + at the surrogates, but that raises its own set of technical issues. + We focus here on static content. .. _fig-cdn: .. figure:: overlay/figures/f09-30-9780123850591.png @@ -155,25 +157,26 @@ rather than transparent, proxy). .. sidebar:: Are CDNs Overlays? - Many of the early overlays built on top of the Internet use some + *Many of the early overlays built on top of the Internet use some sort of tunneling to create virtual point-to-point links, and created a virtual topology between the overlay nodes to offer some function not yet implemented in the Internet, such as multicast of IPv6 support. CDNs don't quite conform to this model, since they - don't generally build tunnels between the CDN nodes. We would - argue, however, that they have enough in common with other types of - overlay to qualify. They offer functionality not natively provided - by the Internet—caching—while using the Internet to interconnect - the nodes in the CDN. A redirector makes an application-level - routing decision, much like other types of overlay nodes. Rather - than forward a packet based on an address and its knowledge of the - network topology, it forwards HTTP requests based on a URL and its - knowledge of the location and load of a set of servers. The - complete collection of redirectors and surrogate servers that make - up a CDN are effectively an application-specific network that - leverages the underlying connectivity of the Internet bring - additional functionality to the Internet: efficient delivery of - content to clients. + don't generally build tunnels between the CDN nodes.* + + *We would argue, however, that they have enough in common with + other types of overlay to qualify. They offer functionality not + natively provided by the Internet—caching—while using the Internet + to interconnect the nodes in the CDN. A redirector makes an + application-level routing decision, much like other types of + overlay nodes. Rather than forward a packet based on an address + and its knowledge of the network topology, it forwards HTTP + requests based on a URL and its knowledge of the location and load + of a set of servers. The complete collection of redirectors and + surrogate servers that make up a CDN are effectively an + application-specific network that leverages the underlying + connectivity of the Internet bring additional functionality to the + Internet: efficient delivery of content to clients.* |Overlay|.2.2 Policies @@ -203,13 +206,13 @@ output. So what makes for a good hashing scheme? The classic *modulo* hashing scheme—which hashes each URL modulo the number of servers—is not -suitable for this environment. This is because should the number of -servers change, the modulo calculation will result in a diminishing -fraction of the pages keeping their same server assignments. While we do -not expect frequent changes in the set of servers, the fact that the -addition of new servers into the set will cause massive reassignment is -undesirable. An alternative is to use the a *consistent hashing* -algorithm. +suitable for this environment. This is for a simple reason: should the +number of servers change, the modulo calculation will result in a +diminishing fraction of the pages keeping their same server +assignments. While we do not expect frequent changes in the set of +servers, the fact that the addition of new servers into the set will +cause massive reassignment is undesirable. An alternative is to use +the a *consistent hashing* algorithm. .. _fig-unitcircle: @@ -301,13 +304,14 @@ measurement as the “server load” parameter in the preceding algorithm. This strategy tends to prefer nearby/lightly loaded servers over distant/heavily loaded servers. A second approach is to factor proximity into the decision at an earlier stage by limiting the -candidate set of servers considered by the above algorithms (*S*) to -only those that are nearby. The harder problem is deciding which of -the potentially many servers are suitably close. One approach would be -to select only those servers that are available on the same ISP as the -client. A slightly more sophisticated approach would be to look at the -map of autonomous systems produced by BGP and select only those -servers within some number of hops from the client as candidate -servers. Finding the right balance between network proximity and -server load has been the subject of considerable research and we -assume that the CDN operators continue to fine-tune their algorithms. +candidate set of servers considered by the above algorithms (set *S* +in the pseudocode) to only those that are nearby. The harder problem +is deciding which of the potentially many servers are suitably +close. One approach would be to select only those servers that are +available on the same ISP as the client. A slightly more sophisticated +approach would be to look at the map of autonomous systems produced by +BGP and select only those servers within some number of hops from the +client as candidate servers. Finding the right balance between +network proximity and server load has been the subject of considerable +research and we assume that the CDN operators continue to fine-tune +their algorithms. diff --git a/overlay/conference.rst b/overlay/conference.rst index 3ca44ea..ff0d696 100644 --- a/overlay/conference.rst +++ b/overlay/conference.rst @@ -15,17 +15,54 @@ terms of the overlay is that rather than being a generic IP multicast overlay, each video conferencing application has its own application-specific overlay. +.. sidebar:: IP Multicast: A Case Study + + *We have mentioned IP Multicast and the MBone multiple times in + this chapter. That they are primarily of historical interest makes + for an an interesting case study of how the Internet has evolved. + IP Multicast is the core feature, and as explained in an earlier + section, a block of the IPv4 address space was set aside for + multicast addresses. The idea was that you could assign one of + these address to a multicast group, users could request to join + that group (technically, they added their host to the group), and + then any IP packet set to that multicast address would be + delivered to every host in the group.* + + *The data plane part of multicast IP is easily solved: switch + forwarding pipelines are able send an incoming packets to multiple + outgoing queues. What proved hard is the control plane part of + the problem, that is, propagating "join requests" to those routers + that needed to know about any particular multicast address. This + is a effectively a routing problem, and when you take both scale + and AS autonomy into account, the resulting protocol turned out to + be as complex as BGP, if not more so.* + + *The MBone was an overlay used to gain experience with multicast, + with the goal of eventually pushing the solution down into + commercial routers so it could be widely deployed. IP Multicast + was never widely deployed (with one main exception), but this + wasn't a problem that could be overcome, even by limiting the + solution to an overlay. A general-purpose multicast mechanism + just does not return enough value to offset the corresponding + complexity (at least for video conferencing). One exception where + IP Multicast pays off is when delivering live TV over the last hop, + from the "video head" to cable set-top boxes (or Smart TVs) in + homes. Last-hop multicast easily beats N-way unicast, and the + control overhead is manageable.* + +.. TODO -- Could say more, but maybe this is enough of a summary. + An overlay is an optimization in the sense that you can run a video conferencing application without one. Indeed, if there are only two participants in the conference, no optimization is needed. Each participant can just send video and audio streams to the other participant directly. There are still some issues to be solved, including what to do if one or both participants is behind a firewall -or NAT, as we discussed in Section |Virt|.3.3. The broader issues that -multimedia applications face are the topic of Chapter |Stream|. But -optimizing the delivery of media to a large -number of conference participants is a job usually performed by an -overlay. +or NAT, as we discussed in Section |Virt|.3.3. The real-time +challenges that multimedia applications face are the topic of Chapter +|Stream|, but optimizing the delivery of media to *multiple* +conference participants—i.e., the multicast part of the solution—is +usually performed by an overlay. Consider the simple case of a 3-party video conference. You can obviously treat this as 3 pair-wise connections: each participant @@ -38,19 +75,12 @@ multicast at the IP layer, some way to replicate the traffic upstream from the participants is needed, and this is the role normally performed by an application-specific overlay. -.. _fig-sfu: -.. figure:: overlay/figures/sfu.png - :width: 600px - :align: center - - Media Distribution Using Selective Forwarding Unit. - The typical solution to media replication is for each participant to send their media to a replication device, which is likely to be located in some cloud datacenter and operated by the company running the conferencing service. One class of replication devices are known as "selective forwarding units" (SFUs). In :numref:`Figure %s -` we've shown the very simple case where there is a single +` we've shown the simplest case where there is a single SFU. All participants send their media to the SFU, and it sends a set of media streams out to all the participants. The "selective" part means that the SFU does not necessarily send every stream to every @@ -60,6 +90,13 @@ participants, while other clients could receive all streams and render them appropriately on their screens. SFUs also forward media streams rather than modifying them. +.. _fig-sfu: +.. figure:: overlay/figures/sfu.png + :width: 600px + :align: center + + Media Distribution Using Selective Forwarding Unit. + There is an alternative approach, in which a *Multipoint Control Unit* (MCU) combines the incoming streams into a single outgoing stream, such as by tiling four videos into a 2x2 grid. This is more @@ -69,8 +106,8 @@ Of course, a single replication device is both a bottleneck from the perspective of scaling, and a potential single point of failure. So what we typically see in practice is a complete overlay network of SFUs, with some SFUs capable of picking up the load from others in the -event of a failure, and SFUs arranged in a mesh so that replication -can be distributed amount the nodes in the mesh rather than all the +event of a failure. The SFUs are arranged in a mesh so that replication +can be distributed amoung the nodes in the mesh rather than all the work falling on a single node. A simple example of this using three SFUs in a tree structure is shown in :numref:`Figure %s `. @@ -90,11 +127,3 @@ the overlay. This is how most video conferencing solutions on today's Internet work, using overlays to scale the performance of the application without any assistance beyond basic packet transport from the core of the Internet. - -.. sidebar:: IP Multicast: A Case Study - - There's an opportunity to say a bit more about IP multicast, - including what made it hard: the routing protocol, which provided - a means to join a multicast group. Then link 6E section for more - info. Also note where it is used today: last mile into the home - (for live streams). diff --git a/overlay/figures/f09-29-9780123850591.png b/overlay/figures/f09-29-9780123850591.png new file mode 100644 index 0000000000000000000000000000000000000000..3205ed81912cee3dcea0c9bb459b719147235378 GIT binary patch literal 86798 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 V+@qHYjKu&ya`. + +.. _fig-bitTorrentSwarm: +.. figure:: overlay/figures/f09-29-9780123850591.png + :width: 500px + :align: center + + Peers in a BitTorrent swarm download from other peers that may not yet + have the complete file. + +If the file remains in high demand, with a stream of new peers +replacing those who leave the swarm, the swarm could remain active +indefinitely; if not, it could shrink back to include only the +original peer until new peers join the swarm. + +Now that we have an overview of BitTorrent, we can ask how requests +are routed to the peers that have a given piece. To make requests, a +would-be downloader must first join the swarm. It starts by +downloading a file containing meta-information about the file and +swarm. The file, which may be easily replicated, is typically +downloaded from a web server and discovered by following links from +Web pages. It contains: + + * Target file’s size + * Piece size + * SHA-1 hash values precomputed from each piece + * URL of the swarm’s *tracker* + +A tracker is a server that tracks a swarm’s current membership. We’ll +see in a moment that BitTorrent can be extended to eliminate this +point of centralization, with its attendant potential for bottleneck +or failure. + +The would-be downloader then joins the swarm, becoming a peer, by +sending a message to the tracker giving its network address and a peer +ID that it has generated randomly for itself. The message also carries +a SHA-1 hash of the main part of the file, which is used as a +swarm ID. + +Let’s call the new peer P. The tracker replies to P with a partial +list of peers giving their IDs and network addresses, and P +establishes connections, over TCP, with some of these peers. Note that +P is directly connected to just a subset of the swarm, although it may +decide to contact additional peers or even request more peers from the +tracker. To establish a BitTorrent connection with a particular peer +after their TCP connection has been established, P sends P’s own peer +ID and swarm ID, and the peer replies with its peer ID and +swarm ID. If the swarm IDs don’t match, or the reply peer ID is not +what P expects, the connection is aborted. + +The resulting BitTorrent connection is symmetric: Each end can +download from the other. Each end begins by sending the other a bitmap +reporting which pieces it has, so each peer knows the other’s initial +state. Whenever a downloader (D) finishes downloading another piece, +it sends a message identifying that piece to each of its directly +connected peers, so those peers can update their internal +representation of D’s state. This, finally, is the answer to the +question of how a download request for a piece is routed to a peer +that has the piece, because it means that each peer knows which +directly connected peers have the piece. If D needs a piece that none +of its connections has, it could connect to more or different peers +(it can get more from the tracker) or occupy itself with other pieces +in hopes that some of its connections will obtain the piece from their +connections. + +How are objects—in this case, pieces—mapped onto peer nodes? Of course +each peer eventually obtains all the pieces, so the question is really +about which pieces a peer has at a given time before it has all the +pieces or, equivalently, about the order in which a peer downloads +pieces. The answer is that they download pieces in random order, to +keep them from having a strict subset or superset of the pieces of any +of their peers. + +The BitTorrent described so far utilizes a central tracker that +constitutes a single point of failure for the swarm and could +potentially be a performance bottleneck. Also, providing a tracker can +be a nuisance for someone who would like to make a file available via +BitTorrent. Newer versions of BitTorrent additionally support +“trackerless” swarms that use consistent hashing, as described in +Section |Overlay|.2. BitTorrent client software that is trackerless +capable implements not just a BitTorrent peer but also what we’ll call +a *peer finder* (the BitTorrent terminology is simply *node*), which +the peer uses to find peers. + +Peer finders form their own overlay network, using their own protocol +over UDP to implement the consistent hash. Furthermore, a peer finder +network includes peer finders whose associated peers belong to +different swarms. In other words, while each swarm forms a distinct +network of BitTorrent peers, a peer finder network instead spans +swarms. + +Peer finders randomly generate their own finder IDs, which are the +same size (160 bits) as swarm IDs. Each finder maintains a modest +table containing primarily finders (and their associated peers) whose +IDs are close to its own, plus some finders whose IDs are more +distant. The following algorithm ensures that finders whose IDs are +close to a given swarm ID are likely to know of peers from that swarm; +the algorithm simultaneously provides a way to look them up. When a +finder F needs to find peers from a particular swarm, it sends a +request to the finders in its table whose IDs are close to that +swarm’s ID. If a contacted finder knows of any peers for that swarm, +it replies with their contact information. Otherwise, it replies with +the contact information of the finders in its table that are close to +the swarm, so that F can iteratively query those finders. + +After the search is exhausted, because there are no finders closer to +the swarm, F inserts the contact information for itself and its +associated peer into the finders closest to the swarm. The net effect +is that peers for a particular swarm get entered in the tables of the +finders that are close to that swarm. + +The above scheme assumes that F is already part of the finder network, +that it already knows how to contact some other finders. This +assumption is true for finder installations that have run previously, +because they are supposed to save information about other finders, +even across executions. If a swarm uses a tracker, its peers are able +to tell their finders about other finders (in a reversal of the peer +and finder roles) because the BitTorrent peer protocol has been +extended to exchange finder contact information. But, how can a newly +installed finder discover other finders? The files for trackerless +swarms include contact information for one or a few finders, instead +of a tracker URL, for just that situation. + +An unusual aspect of BitTorrent is that it deals head-on with the +issue of fairness, or good “network citizenship.” Protocols often +depend on the good behavior of individual peers without being able to +enforce it. For example, an unscrupulous Ethernet peer could get +better performance by using a backoff algorithm that is more +aggressive than exponential backoff, or an unscrupulous TCP peer could +get better performance by not cooperating in congestion control. + +The good behavior that BitTorrent depends on is peers uploading pieces +to other peers. Since the typical BitTorrent user just wants to +download the file as quickly as possible, there is a temptation to +implement a peer that tries to download all the pieces while doing as +little uploading as possible—this is a bad peer. To discourage bad +behavior, the BitTorrent protocol includes mechanisms that allow peers +to reward or punish each other. If a peer is misbehaving by not nicely +uploading to another peer, the second peer can *choke* the bad peer: It +can decide to stop uploading to the bad peer, at least temporarily, +and send it a message saying so. There is also a message type for +telling a peer that it has been unchoked. The choking mechanism is +also used by a peer to limit the number of its active BitTorrent +connections, to maintain good TCP performance. There are many possible +choking algorithms, and devising a good one is an art. + +We conclude by noting that despite the explosion of centrally managed +content delivery services, for everything from music to video to +gaming updates to software distribution, BitTorrent remains in wide +use. This has to partly be attributed to is decentralized design, +which is elegantly self-sustsaining: more demand is naturally coupled +with more resources. That this also makes it difficult to shut-down +doesn't hurt. + +.. admonition:: Further Reading + + `BitTorrent Statistics in 2026 + `__. + EarthWeb, 2026. From 4dd76e43df6f117fce0a6e1cd2a4499e2e043e76 Mon Sep 17 00:00:00 2001 From: Larry Peterson Date: Sat, 20 Jun 2026 15:33:33 -0700 Subject: [PATCH 2/4] typo & wordsmithing Signed-off-by: Larry Peterson --- overlay/p2p.rst | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/overlay/p2p.rst b/overlay/p2p.rst index 3d13a6a..1fd78f6 100644 --- a/overlay/p2p.rst +++ b/overlay/p2p.rst @@ -215,13 +215,12 @@ also used by a peer to limit the number of its active BitTorrent connections, to maintain good TCP performance. There are many possible choking algorithms, and devising a good one is an art. -We conclude by noting that despite the explosion of centrally managed -content delivery services, for everything from music to video to -gaming updates to software distribution, BitTorrent remains in wide -use. This has to partly be attributed to is decentralized design, -which is elegantly self-sustsaining: more demand is naturally coupled -with more resources. That this also makes it difficult to shut-down -doesn't hurt. +We conclude by noting that while centrally managed (commercial) music +streaming services are now commonplace, BitTorrent remains in wide use, +delivering everything from music to video, game updates, and software +releases. This is, at least in part, due to its decentralized design, +which is both self-sustaining (more demand naturally results in +more resources) and difficult to shut down. .. admonition:: Further Reading From 6d23510a1b55c460952dec6454a8bc0760b72947 Mon Sep 17 00:00:00 2001 From: Bruce Davie <3101026+drbruced12@users.noreply.github.com> Date: Mon, 22 Jun 2026 11:16:28 +1000 Subject: [PATCH 3/4] light edit, typos Signed-off-by: Bruce Davie <3101026+drbruced12@users.noreply.github.com> --- overlay/cdn.rst | 6 +++--- overlay/conference.rst | 27 ++++++++++++++------------- overlay/p2p.rst | 26 +++++++++++++++++--------- 3 files changed, 34 insertions(+), 25 deletions(-) diff --git a/overlay/cdn.rst b/overlay/cdn.rst index 8a5c853..4428a0e 100644 --- a/overlay/cdn.rst +++ b/overlay/cdn.rst @@ -55,7 +55,7 @@ spread across all the backbone ISPs, then it should be possible to reach one without having to cross a peering point. Clearly, maintaining thousands of surrogate servers all over the Internet is too expensive for most sites that wants to provide better access to -its web pages. Commercial CDNs provide this service for many sites, +their web pages. Commercial CDNs provide this service for many sites, thereby amortizing the cost across many customers. Although we call them surrogate servers, in fact, they can just as @@ -69,7 +69,7 @@ server for any content that either changes frequently (e.g., sports scores and stock quotes) or is produced as the result of some computation (e.g., a database query).\ [#]_ -.. [#] CDN operators sometimes offer a complementory service that +.. [#] CDN operators sometimes offer a complementary service that allows their customers to dynamically generate certain content at the surrogates, but that raises its own set of technical issues. We focus here on static content. @@ -212,7 +212,7 @@ diminishing fraction of the pages keeping their same server assignments. While we do not expect frequent changes in the set of servers, the fact that the addition of new servers into the set will cause massive reassignment is undesirable. An alternative is to use -the a *consistent hashing* algorithm. +a *consistent hashing* algorithm. .. _fig-unitcircle: diff --git a/overlay/conference.rst b/overlay/conference.rst index ff0d696..901ea43 100644 --- a/overlay/conference.rst +++ b/overlay/conference.rst @@ -20,8 +20,8 @@ application-specific overlay. *We have mentioned IP Multicast and the MBone multiple times in this chapter. That they are primarily of historical interest makes for an an interesting case study of how the Internet has evolved. - IP Multicast is the core feature, and as explained in an earlier - section, a block of the IPv4 address space was set aside for + IP Multicast is the core feature, and as explained in + Section |Overlay|.1, a block of the IPv4 address space was set aside for multicast addresses. The idea was that you could assign one of these address to a multicast group, users could request to join that group (technically, they added their host to the group), and @@ -29,7 +29,7 @@ application-specific overlay. delivered to every host in the group.* *The data plane part of multicast IP is easily solved: switch - forwarding pipelines are able send an incoming packets to multiple + forwarding pipelines are able to send an incoming packets to multiple outgoing queues. What proved hard is the control plane part of the problem, that is, propagating "join requests" to those routers that needed to know about any particular multicast address. This @@ -40,15 +40,16 @@ application-specific overlay. *The MBone was an overlay used to gain experience with multicast, with the goal of eventually pushing the solution down into commercial routers so it could be widely deployed. IP Multicast - was never widely deployed (with one main exception), but this - wasn't a problem that could be overcome, even by limiting the - solution to an overlay. A general-purpose multicast mechanism - just does not return enough value to offset the corresponding - complexity (at least for video conferencing). One exception where - IP Multicast pays off is when delivering live TV over the last hop, - from the "video head" to cable set-top boxes (or Smart TVs) in - homes. Last-hop multicast easily beats N-way unicast, and the - control overhead is manageable.* + was never widely deployed in the Internet (with one main + exception), but this wasn't a problem that could be overcome, even + by limiting the solution to an overlay. A general-purpose + multicast mechanism just does not return enough value to offset + the corresponding complexity (at least for video + conferencing). One exception where IP Multicast pays off is when + delivering live TV over the last hop, from the "video head" to + cable set-top boxes (or Smart TVs) in homes. Last-hop multicast + easily beats N-way unicast, and the control overhead is + manageable.* .. TODO -- Could say more, but maybe this is enough of a summary. @@ -107,7 +108,7 @@ perspective of scaling, and a potential single point of failure. So what we typically see in practice is a complete overlay network of SFUs, with some SFUs capable of picking up the load from others in the event of a failure. The SFUs are arranged in a mesh so that replication -can be distributed amoung the nodes in the mesh rather than all the +can be distributed among the nodes in the mesh rather than all the work falling on a single node. A simple example of this using three SFUs in a tree structure is shown in :numref:`Figure %s `. diff --git a/overlay/p2p.rst b/overlay/p2p.rst index 1fd78f6..f65db10 100644 --- a/overlay/p2p.rst +++ b/overlay/p2p.rst @@ -4,7 +4,7 @@ Music-sharing applications like Napster and KaZaA introduced the term “peer-to-peer” into the popular vernacular. But what exactly does it mean for a system to be “peer-to-peer”? Certainly in the context of -sharing MP3 files it means not having to download music from a central +sharing files it means not having to download music from a central site, but instead being able to access music files directly from whoever in the Internet happens to have a copy stored on their computer. More generally then, we could say that a peer-to-peer network allows a @@ -17,14 +17,14 @@ Quite often, attributes like *decentralized* and *self-organizing* are mentioned when discussing peer-to-peer networks, meaning that individual nodes organize themselves into a network without any centralized coordination. If you think about it, terms like these could be used to -describe the Internet itself. Ironically, however, Napster was not a +describe the Internet itself. Ironically, Napster was not a true peer-to-peer system by this definition since it depended on a central registry of known files, and users had to search this directory to find what machine offered a particular file. It was only the last step—actually downloading the file—that took place between machines that belong to two users, but this is little more than a traditional client/server transaction. The only difference is that the server is -owned by someone just like you rather than a large corporation. +owned by some other Internet user rather than a large corporation. So we are back to the original question: What’s interesting about peer-to-peer networks? One answer is that both the process of locating @@ -39,7 +39,7 @@ these nodes represent the sequence of machines that you have to visit to track down the object you want. This description will become clearer after we look at a popular example: BitTorrent. -BitTorrent is a file sharing protocol devised by Bram Cohen. It is +BitTorrent is a file-sharing protocol devised by Bram Cohen. It is based on replicating the file or, rather, replicating segments of the file, which are called *pieces*. Any particular piece can usually be downloaded from multiple peers, even if only one peer has the entire @@ -49,7 +49,7 @@ useful when you consider that any given computer has a limited speed at which it can serve files over its uplink to the Internet, often quite a low limit due to the asymmetric nature of most broadband networks. The beauty of BitTorrent is that replication is a natural -side effect of the downloading process: As soon as a peer downloads a +side effect of the downloading process: as soon as a peer downloads a particular piece, it becomes another source for that piece. The more peers downloading pieces of the file, the more piece replication occurs, distributing the load proportionately, and the more total @@ -148,10 +148,10 @@ potentially be a performance bottleneck. Also, providing a tracker can be a nuisance for someone who would like to make a file available via BitTorrent. Newer versions of BitTorrent additionally support “trackerless” swarms that use consistent hashing, as described in -Section |Overlay|.2. BitTorrent client software that is trackerless -capable implements not just a BitTorrent peer but also what we’ll call -a *peer finder* (the BitTorrent terminology is simply *node*), which -the peer uses to find peers. +Section |Overlay|.2. BitTorrent client software that is +trackerless-capable implements not just a BitTorrent peer but also +what we’ll call a *peer finder* (the BitTorrent terminology is simply +*node*), which the peer uses to find peers. Peer finders form their own overlay network, using their own protocol over UDP to implement the consistent hash. Furthermore, a peer finder @@ -215,6 +215,14 @@ also used by a peer to limit the number of its active BitTorrent connections, to maintain good TCP performance. There are many possible choking algorithms, and devising a good one is an art. +Because BitTorrent traffic can consume a lot of the uplink bandwidth +on a typical residential Internet connection, it provided inspiration +for work on congestion control algorithms that are less +aggressive than those of TCP, yielding to competing traffic when delay +increases. This led to an experimental RFC on "Low Extra Delay +Background Transport (LEDBAT)" and ongoing research on similar +algorithms. + We conclude by noting that while centrally managed (commercial) music streaming services are now commonplace, BitTorrent remains in wide use, delivering everything from music to video, game updates, and software From 980a657eede1729dd51054f473f1eadddd6c2214 Mon Sep 17 00:00:00 2001 From: Bruce Davie <3101026+drbruced12@users.noreply.github.com> Date: Mon, 22 Jun 2026 11:26:08 +1000 Subject: [PATCH 4/4] whitespace Signed-off-by: Bruce Davie <3101026+drbruced12@users.noreply.github.com> --- overlay/conference.rst | 2 +- overlay/p2p.rst | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/overlay/conference.rst b/overlay/conference.rst index 901ea43..914093f 100644 --- a/overlay/conference.rst +++ b/overlay/conference.rst @@ -20,7 +20,7 @@ application-specific overlay. *We have mentioned IP Multicast and the MBone multiple times in this chapter. That they are primarily of historical interest makes for an an interesting case study of how the Internet has evolved. - IP Multicast is the core feature, and as explained in + IP Multicast is the core feature, and as explained in Section |Overlay|.1, a block of the IPv4 address space was set aside for multicast addresses. The idea was that you could assign one of these address to a multicast group, users could request to join diff --git a/overlay/p2p.rst b/overlay/p2p.rst index f65db10..b527b9b 100644 --- a/overlay/p2p.rst +++ b/overlay/p2p.rst @@ -221,7 +221,7 @@ for work on congestion control algorithms that are less aggressive than those of TCP, yielding to competing traffic when delay increases. This led to an experimental RFC on "Low Extra Delay Background Transport (LEDBAT)" and ongoing research on similar -algorithms. +algorithms. We conclude by noting that while centrally managed (commercial) music streaming services are now commonplace, BitTorrent remains in wide use,