marketplace-2014/Concepts.html

103 lines
24 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"/><title>1&nbsp;Concepts</title><link rel="stylesheet" type="text/css" href="scribble.css" title="default"/><link rel="stylesheet" type="text/css" href="footnote.css" title="default"/><link rel="stylesheet" type="text/css" href="racket.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-style.css" title="default"/><link rel="stylesheet" type="text/css" href="manual-racket.css" title="default"/><script type="text/javascript" src="scribble-common.js"></script><!--[if IE 6]><style type="text/css">.SIEHidden { overflow: hidden; }</style><![endif]--></head><body id="scribble-racket-lang-org"><div class="tocset"><div class="tocview"><div class="tocviewlist tocviewlisttopspace"><div class="tocviewtitle"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_0&quot;);">&#9660;</a></td><td></td><td><a href="index.html" class="tocviewlink" data-pltdoc="x">Marketplace:<span class="mywbr"> &nbsp;</span> Network-<wbr></wbr>Aware Programming</a></td></tr></table></div><div class="tocviewsublisttop" style="display: block;" id="tocview_0"><table cellspacing="0" cellpadding="0"><tr><td align="right">1&nbsp;</td><td><a href="Concepts.html" class="tocviewselflink" data-pltdoc="x">Concepts</a></td></tr><tr><td align="right">2&nbsp;</td><td><a href="high-level-interface.html" class="tocviewlink" data-pltdoc="x">High-<wbr></wbr>level interface</a></td></tr><tr><td align="right">3&nbsp;</td><td><a href="low-level-interface.html" class="tocviewlink" data-pltdoc="x">Low-<wbr></wbr>level interface</a></td></tr><tr><td align="right">4&nbsp;</td><td><a href="Drivers.html" class="tocviewlink" data-pltdoc="x">Drivers</a></td></tr><tr><td align="right">5&nbsp;</td><td><a href="Management_and_Monitoring.html" class="tocviewlink" data-pltdoc="x">Management and Monitoring</a></td></tr><tr><td align="right">6&nbsp;</td><td><a href="Examples.html" class="tocviewlink" data-pltdoc="x">Examples</a></td></tr></table></div></div><div class="tocviewlist"><table cellspacing="0" cellpadding="0"><tr><td style="width: 1em;"><a href="javascript:void(0);" title="Expand/Collapse" class="tocviewtoggle" onclick="TocviewToggle(this,&quot;tocview_1&quot;);">&#9658;</a></td><td>1&nbsp;</td><td><a href="Concepts.html" class="tocviewselflink" data-pltdoc="x">Concepts</a></td></tr></table><div class="tocviewsublistbottom" style="display: none;" id="tocview_1"><table cellspacing="0" cellpadding="0"><tr><td align="right">1.1&nbsp;</td><td><a href="Concepts.html#%28part._.What_is_a_process__what_are_event_handlers_%29" class="tocviewlink" data-pltdoc="x">What is a process, what are event handlers?</a></td></tr><tr><td align="right">1.2&nbsp;</td><td><a href="Concepts.html#%28part._.What_is_a_.V.M_%29" class="tocviewlink" data-pltdoc="x">What is a VM?</a></td></tr><tr><td align="right">1.3&nbsp;</td><td><a href="Concepts.html#%28part._.Endpoints__.Subscription_and_.Advertisement%29" class="tocviewlink" data-pltdoc="x">Endpoints:<span class="mywbr"> &nbsp;</span> Subscription and Advertisement</a></td></tr><tr><td align="right">1.4&nbsp;</td><td><a href="Concepts.html#%28part._messages-and-topics%29" class="tocviewlink" data-pltdoc="x">Messages and Topics</a></td></tr><tr><td align="right">1.5&nbsp;</td><td><a href="Concepts.html#%28part._.Presence%29" class="tocviewlink" data-pltdoc="x">Presence</a></td></tr><tr><td align="right">1.6&nbsp;</td><td><a href="Concepts.html#%28part._.Nesting__relaying__and_levels_of_discourse%29" class="tocviewlink" data-pltdoc="x">Nesting, relaying, and levels of discourse</a></td></tr></table></div></div></div><div class="tocsub"><div class="tocsubtitle">On this page:</div><table class="tocsublist" cellspacing="0"><tr><td><span class="tocsublinknumber">1.1<tt>&nbsp;</tt></span><a href="#%28part._.What_is_a_process__what_are_event_handlers_%29" class="tocsubseclink" data-pltdoc="x">What is a process, what are event handlers?</a></td></tr><tr><td><span class="tocsublinknumber">1.2<tt>&nbsp;</tt></span><a href="#%28part._.What_is_a_.V.M_%29" class="tocsubseclink" data-pltdoc="x">What is a VM?</a></td></tr><tr><td><span class="tocsublinknumber">1.3<tt>&nbsp;</tt></span><a href="#%28part._.Endpoints__.Subscription_and_.Advertisement%29" class="tocsubseclink" data-pltdoc="x">Endpoints:<span class="mywbr"> &nbsp;</span> Subscription and Advertisement</a></td></tr><tr><td><span class="tocsublinknumber">1.4<tt>&nbsp;</tt></span><a href="#%28part._messages-and-topics%29" class="tocsubseclink" data-pltdoc="x">Messages and Topics</a></td></tr><tr><td><span class="tocsublinknumber">1.5<tt>&nbsp;</tt></span><a href="#%28part._.Presence%29" class="tocsubseclink" data-pltdoc="x">Presence</a></td></tr><tr><td><span class="tocsublinknumber">1.6<tt>&nbsp;</tt></span><a href="#%28part._.Nesting__relaying__and_levels_of_discourse%29" class="tocsubseclink" data-pltdoc="x">Nesting, relaying, and levels of discourse</a></td></tr></table></div></div><div class="maincolumn"><div class="main"><div class="versionbox"><span class="version">6.0.0.1</span></div><div class="navsettop"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="index.html" title="backward to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="high-level-interface.html" title="forward to &quot;2 High-level interface&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div><h3>1<tt>&nbsp;</tt><a name="(part._.Concepts)"></a>Concepts</h3><p>Marketplace integrates ideas from both distributed systems and
virtualized operating system designs to obtain an architecture of
nested <span style="font-style: italic">virtual machines</span> (VMs). Each nested layer is equipped
with its own publish/subscribe network that also propagates
<span style="font-style: italic">presence</span> information about the (dis)appearance of services.</p><p>Throughout this manual, diagrams such as the following will illustrate
various process structures:</p><blockquote class="SCentered"><p><img src="pict.png" alt="image" width="389" height="207"/></p></blockquote><p>Rectangular boxes represent VMs. The processes running within each VM
are placed atop its box. The narrow rectangular strip at the top of
each VM&rsquo;s box represents the network connecting all the VM&rsquo;s processes
to each other; it will frequently contain a short description of the
protocols used for communication across the represented network.</p><p>A central feature of Marketplace is that VMs are nothing more than
regular processes, making them recursively nestable. Each VM supports
a collection of processes all its own, and its internal IPC medium
carries a VM-specific protocol that is often different from the
protocol spoken by its containing VM.</p><p>The outermost VM is called the <span style="font-style: italic">ground VM</span>. The protocol spoken
by processes running within the ground VM is a simple protocol
relating Racket&rsquo;s <font class="badlink"><span class="techoutside"><span class="techinside">synchronizable events</span></span></font> to Marketplace network
messages. See <a href="Drivers.html" data-pltdoc="x">Drivers</a> for
information on using Racket events from Marketplace programs.</p><h4>1.1<tt>&nbsp;</tt><a name="(part._.What_is_a_process__what_are_event_handlers_)"></a>What is a process, what are event handlers?</h4><p>A Marketplace <a name="(tech._proces)"></a><span style="font-style: italic">process</span> is a collection of <a name="(tech._event._handler)"></a><span style="font-style: italic">event
handlers</span>, plus a piece of private <a name="(tech._process._state)"></a><span style="font-style: italic">process state</span>. Every
process<span class="NoteBox"><span class="NoteContent">The exception to this rule is the Ground VM, which plays
a special role.</span></span> runs within a containing VM.</p><p>When an event occurs that is relevant to a process, one of its event
handlers is called with the process&rsquo;s current state and a description
of the event. The handler is expected to return an updated state value
and a collection of actions for the containing VM to perform. An event
handler, then, has the following approximate type:</p><blockquote class="SCentered"><p><span style="font-style: italic">State</span> &#215; <span style="font-style: italic">Event</span> &#8594; <span style="font-style: italic">State</span> &#215; (Listof <span style="font-style: italic">Action</span>)</p></blockquote><p>Event handlers are registered with the VM by creating <a href="Concepts.html#%28tech._endpoint%29" class="techoutside" data-pltdoc="x"><span class="techinside">endpoints</span></a>
using the <span class="RktSym">endpoint</span> macro (described in <a href="high-level-interface.html#%28part._endpoint-dsl%29" data-pltdoc="x">Creating endpoints</a>) or
the low-level <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._add-endpoint%29%29" class="RktValLink" data-pltdoc="x">add-endpoint</a></span> structure (described in
<a href="low-level-interface.html#%28part._endpoints-and-messages%29" data-pltdoc="x">Endpoints and Messages</a>).</p><p><a name="(tech._event)"></a><span style="font-style: italic">Events</span>, passed to event handlers, describe the results of
actions from the outside world, neighbouring processes in the VM, or
the VM itself. They are implemented as <span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span>s. See
<a href="low-level-interface.html#%28part._endpoint-events%29" data-pltdoc="x">Endpoint Events</a> for a description of the available event
structures.</p><p><a name="(tech._action)"></a><span style="font-style: italic">Actions</span>, passed back to the VM by event handlers, describe
actions the process wishes to perform. See <a href="low-level-interface.html#%28part._.Actions%29" data-pltdoc="x">Actions</a> for the
possible actions a process can take.</p><p>Note that the result of an event handler function is actually a
<span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Transition%29%29" class="RktValLink" data-pltdoc="x">Transition</a></span> structure; the actual Typed Racket type of event
handlers is <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Trap.K%29%29" class="RktValLink" data-pltdoc="x">TrapK</a></span>, defined in <a href="low-level-interface.html#%28part._handler-functions%29" data-pltdoc="x">Handler Functions</a>.</p><h4>1.2<tt>&nbsp;</tt><a name="(part._.What_is_a_.V.M_)"></a>What is a VM?</h4><p><a name="(tech._vm)"></a><span style="font-style: italic">Virtual Machines (VMs)</span> are simply a collection
of processes, plus a shared medium of communication that the contained
processes use to communicate with each other. VMs offer access to both
their own <span style="font-style: italic">internal</span> network as well as to the <span style="font-style: italic">external</span>
network owned by the VM&rsquo;s own containing VM.<span class="NoteBox"><span class="NoteContent">Again, the only
exception here is the Ground VM, which interfaces to the underlying
Racket system and so has no containing VM.</span></span></p><h4>1.3<tt>&nbsp;</tt><a name="(part._.Endpoints__.Subscription_and_.Advertisement)"></a>Endpoints: Subscription and Advertisement</h4><p>The Marketplace operating system&rsquo;s inter-process communication
facility is structured around <a name="(tech._pub/sub)"></a><span style="font-style: italic">publish/subscribe (pub/sub)</span> messaging.<span class="NoteBox"><span class="NoteContent">For a survey
of pub/sub messaging, see
<a href="http://www.cs.ru.nl/~pieter/oss/manyfaces.pdf">"The Many
Faces of Publish/Subscribe"</a>, ACM Computing Surveys, Vol. 35, No. 2,
June 2003, pp. 114&#8211;131. There&rsquo;s also plenty out there on the Internet;
a good starting point is to google for
<a href="https://www.google.com/search?q=pub/sub message-oriented middleware">pub/sub message-oriented middleware</a>.</span></span></p><p><a name="(tech._endpoint)"></a><span style="font-style: italic">Endpoints</span> are the representation of a process&rsquo;s engagement
in some protocol. They pair a description of the process&rsquo;s <a href="Concepts.html#%28tech._role%29" class="techoutside" data-pltdoc="x"><span class="techinside">role</span></a>
in a conversation with an <a href="Concepts.html#%28tech._event._handler%29" class="techoutside" data-pltdoc="x"><span class="techinside">event handler</span></a> that responds to events
relating to that role.</p><p>A <a name="(tech._role)"></a><span style="font-style: italic">role</span> describes the role some process is playing in a
conversation. Concretely, roles are represented by <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Role%29%29" class="RktValLink" data-pltdoc="x">Role</a></span>
structures. A role can be used by the currently-running process to
describe some role it wishes to play, or can be carried in some
<span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Endpoint.Event%29%29" class="RktValLink" data-pltdoc="x">EndpointEvent</a></span> to describe the role some <span style="font-style: italic">peer</span> process
is playing in a conversation.</p><p>Roles have three parts:</p><ul><li><p>An <a name="(tech._orientation)"></a><span style="font-style: italic">orientation</span> (type <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Orientation%29%29" class="RktValLink" data-pltdoc="x">Orientation</a></span>) describes
whether this role is concerned primarily with <span style="font-style: italic">producing</span> or
<span style="font-style: italic">consuming</span> messages.</p></li><li><p>A <a name="(tech._topic)"></a><span style="font-style: italic">topic</span> is a <a name="(tech._pattern)"></a><span style="font-style: italic">pattern</span> over messages. Topics
perform double duty: they both scope conversations and filter
incoming messages. More on topics below.</p></li><li><p>An <a name="(tech._interest._type)"></a><span style="font-style: italic">interest-type</span> (type <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._.Interest.Type%29%29" class="RktValLink" data-pltdoc="x">InterestType</a></span>)
determines whether the endpoint playing the given role is genuinely
a participant in matching conversations or is simply observing the
real participants. See <a href="high-level-interface.html#%28part._endpoint-dsl%29" data-pltdoc="x">Creating endpoints</a> for more on
interest-types.</p></li></ul><h4>1.4<tt>&nbsp;</tt><a name="(part._messages-and-topics)"></a>Messages and Topics</h4><p><a name="(tech._message)"></a><span style="font-style: italic">Messages</span> are simply Racket data structures. They can be any
value for which <span class="RktSym"><a href="http://docs.racket-lang.org/reference/booleans.html#%28def._%28%28quote._~23~25kernel%29._equal~3f%29%29" class="RktValLink" data-pltdoc="x">equal?</a></span> is defined, any <span class="RktPn">#:prefab</span>
structure, most <span class="RktPn">#:transparent</span> structures, or any non-object
structure for which <span class="RktSym">prop:struct-map</span> can be defined.</p><p>As mentioned above, topics are simply patterns over messages. They are
represented as normal data structures <span style="font-style: italic">with embedded wildcards</span>.
Use <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span> or <span class="RktPn">(</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._wild%29%29" class="RktValLink" data-pltdoc="x">wild</a></span><span class="RktPn">)</span> to construct a wildcard. For
example, given the following definition,</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span><span class="hspace">&nbsp;</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">speaker</span><span class="hspace">&nbsp;</span><span class="RktSym">text</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">#:transparent</span><span class="RktPn">)</span></p></blockquote><p>we can not only create instances that might be used with
<span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._send-message%29%29" class="RktValLink" data-pltdoc="x">send-message</a></span>,</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktVal">"Tony"</span><span class="hspace">&nbsp;</span><span class="RktVal">"Hello World!"</span><span class="RktPn">)</span></p></blockquote><p>but also create topic patterns using <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span>. For example, this
pattern matches anything said by <span class="RktVal">"Tony"</span>:</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktVal">"Tony"</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></p></blockquote><p>This pattern matches chat-messages sent by anyone saying "Hello":</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</span><span class="RktVal">"Hello"</span><span class="RktPn">)</span></p></blockquote><p>And finally, this pattern matches any chat-message at all:</p><blockquote class="SCodeFlow"><p><span class="RktPn">(</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span></p></blockquote><p>Patterns can be nested. For instance, given the above definition of
<span class="RktSym">chat-message</span>, the following pattern matches any chat message
greeting anybody at all:</p><blockquote class="SCodeFlow"><table cellspacing="0" class="RktBlk"><tr><td><span class="RktPn">(</span><span class="RktSym"><a href="http://docs.racket-lang.org/reference/define-struct.html#%28form._%28%28lib._racket%2Fprivate%2Fbase..rkt%29._struct%29%29" class="RktStxLink" data-pltdoc="x">struct</a></span><span class="hspace">&nbsp;</span><span class="RktSym">greeting</span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">target</span><span class="RktPn">)</span><span class="hspace">&nbsp;</span><span class="RktPn">#:transparent</span><span class="RktPn">)</span></td></tr><tr><td><span class="RktPn">(</span><span class="RktSym">chat-message</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="hspace">&nbsp;</span><span class="RktPn">(</span><span class="RktSym">greeting</span><span class="hspace">&nbsp;</span><span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-untyped..rkt%29._~3f%29%29" class="RktValLink" data-pltdoc="x">?</a></span><span class="RktPn">)</span><span class="RktPn">)</span></td></tr></table></blockquote><h4>1.5<tt>&nbsp;</tt><a name="(part._.Presence)"></a>Presence</h4><p><a name="(tech._presence)"></a><span style="font-style: italic">Presence</span> (respectively its opposite, <a name="(tech._absence)"></a><span style="font-style: italic">absence</span>) is
an indication that a matching conversational partner exists (resp. no
longer exists) in the network. Presence can be used to synchronize
conversations, setting up a conversational context before messages are
sent.</p><p>The term "presence" itself is lifted from Instant Messaging protocols
like XMPP, where it describes the online/offline status of one&rsquo;s chat
buddies. Here, it describes the online/offline status of peer
processes, in terms of which conversations they are willing to engage
in.</p><p>The system derives presence information from the set of active pub/sub
subscription and advertisement endpoints a process has created.
Creating a new endpoint with a topic pattern that matches some other
process&rsquo;s endpoint and an orientation <span style="font-style: italic">opposite</span> to the other
process&rsquo;s endpoint causes <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._presence-event%29%29" class="RktValLink" data-pltdoc="x">presence-event</a></span>s to be sent to both
endpoints, informing them of the presence of the other. When a process
crashes, or an endpoint is withdrawn with <span class="RktSym"><a href="high-level-interface.html#%28def._%28%28lib._marketplace%2Fsugar-values..rkt%29._delete-endpoint%29%29" class="RktValLink" data-pltdoc="x">delete-endpoint</a></span>, a
corresponding <span class="RktSym"><a href="low-level-interface.html#%28def._%28%28lib._marketplace%2Fmain..rkt%29._absence-event%29%29" class="RktValLink" data-pltdoc="x">absence-event</a></span> is sent to the remaining
endpoint.</p><h4>1.6<tt>&nbsp;</tt><a name="(part._.Nesting__relaying__and_levels_of_discourse)"></a>Nesting, relaying, and levels of discourse</h4><p>Because VMs can be nested, and each VM has an IPC network of its own
for the use of its processes, information sometimes needs to be
relayed from a VM&rsquo;s external network to its internal network and vice
versa.</p><p>In general, the protocol messages sent across a VM&rsquo;s internal network
may be quite different in syntax and meaning from those sent across
the same VM&rsquo;s external network: consider the case of the
<a href="Examples.html#%28part._chat-server-example%29" data-pltdoc="x">TCP chat server</a>, which employs a nested VM to separate
out TCP-related messages from higher-level, application-specific chat
messages:</p><blockquote class="SCentered"><p><img src="pict_2.png" alt="image" width="355" height="214"/></p></blockquote><p>Each VM&rsquo;s network corresponds to a distinct <span style="font-style: italic">level of discourse</span>.
The nesting of VMs is then roughly analogous to the layering of
network protocol stacks. For example (and purely hypothetically!) the
TCP-IP/HTTP/Webapp stack could perhaps be represented as</p><blockquote class="SCentered"><p><img src="pict_3.png" alt="image" width="241" height="260"/></p></blockquote><div class="navsetbottom"><span class="navleft">&nbsp;&nbsp;</span><span class="navright">&nbsp;&nbsp;<a href="index.html" title="backward to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">&larr; prev</a>&nbsp;&nbsp;<a href="index.html" title="up to &quot;Marketplace: Network-Aware Programming&quot;" data-pltdoc="x">up</a>&nbsp;&nbsp;<a href="high-level-interface.html" title="forward to &quot;2 High-level interface&quot;" data-pltdoc="x">next &rarr;</a></span>&nbsp;</div></div></div><div id="contextindicator">&nbsp;</div></body></html>