9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: Eris Discordia <eris.discordia@gmail.com>
To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net>
Subject: Re: [9fans] Do we have a catalog of 9P servers?
Date: Wed, 19 Nov 2008 18:31:16 +0000	[thread overview]
Message-ID: <2AB9AFC10DDFC15A2A6D27BA@[192.168.1.2]> (raw)

Thanks a lot, Nathaniel Filardo. Your clean and detailed explanation is
very much appreciated. Although, Micah Stetson did post a similar, albeit
far more concise, explanation before.

Despite the impression I seem to have made, I understand--as of a few days
ago, at least--why a Plan 9 gateway can be transparent and hassle-free. I
even pointed out on a previous post that comparable forms of transparency
are provided at different layers of the network by tunnelling protocols
such as L2TP and PPTP. I also explained why there's an oxymoronic quality
to the transparency provided in Plan 9, i.e. that network layer operations
are delegated to application layer. Many network devices, if implemented as
they ought to be, should operate at specific layers of the stack--a
full-blown network host should in principle be different from a router
which in turn should be different from a bridge. An application layer is a
luxury not always granted. Also, the delegation of a network layer
operation to higher layers has an undertone of blasphemy, of violating the
principles of layered design.

Anyhow, the issue is resolved. I believe we understand each other.

--------------------------------------------------------------------------------

Regarding two specific claims:

> ... you get the idea.  It does this with no special tools, no complex
> code, and a very minimal per-connection overhead (just the IC and G
> kernels and G's exportfs tracking a file descriptor).

I haven't seen--and even if I did I wouldn't understand--the source code
required for:

a. Plan 9's abstraction of a network into a filesystem or part of a
filesystem,
b. a UNIX-clone NAT implementation,

so I really can't comment on, or offhandedly accept the comments on, the
complexity of these codes.

On the other hand, the one unresolved issue on this thread was a factual
comparison of NAT overhead compared to the transport+application layer
overheads generated on a Plan 9 gateway. I remain rather convinced that NAT
overhead will be meaningfully smaller _if_ the implementation is sane. Why?
Because the problem solved is the same and as a rule of thumb the effort
required to solve a problem is distributed between the computer and the
programmer's mind. If the  programmer's mind does more effort to solve the
problem then the computer will be relieved of some of the effort required
to carry out the solution (I'm not taking into account "quantum leaps," by
the way, I doubt they actually exist). Apparently, NAT takes more
brainpower to implement. The other, probably more agreeable, reason for
NAT's lesser overhead is that it operates (mostly) at network layer while
things that go through a hypothetical Plan 9 gateway necessarily involve
transport and application layer interaction. Abstraction costs,
doubtlessly, but I am willing to concede that the cost may well prove
tolerable in view of the hassle of creating and deploying a more "concrete"
solution.

> There can, in fact, be multiple IP stacks on a Plan 9 box, bound to
> multiple Ethernet cards, as you claim.  (In fact, one can import another
> computer's ethernet cards and run snoopy, or build a network stack, using
> those instead.)  I don't think that's relevant to the example at hand,
> though, as should be clear from the above.

This was pointed out on another thread by Ron Minnich. I actually was
surprised by the fact that *BSDs are (normally) limited to one instance of
network stack. And I later used this same difference to justify the claim
that each /net imported from a Plan 9 gateway will necessarily require a
new copy of the gateway's protocol stack. This was rebuked and your
explanation makes it even more clear why.

Nevertheless, the same machinations that allow for transparency in Plan 9
disallow certain functions that can be naturally provided by a NAT
implementation, or any of a number of software categories that involve
packet filtering/rewriting/inspection. For example, the one I referred to
in the posting you have quoted in your response: load balancing. Add to the
list: rate control, intrusion detection, QoS earmarking, honeynetting, et
cetera ad [put you favorite -um, -am here].

--------------------------------------------------------------------------------

--On Tuesday, November 18, 2008 8:59 PM -0500 Nathaniel W Filardo
<nwf@cs.jhu.edu> wrote:

> On Sun, Nov 16, 2008 at 09:24:19PM +0000, Eris Discordia wrote:
>>> That isn't happening.  All we have is one TCP connection and one small
>>> program exporting file service.
>>
>> I see. But then, is it the "small program exporting file service" that
>> does the multiplexing? I mean, if two machines import a gateway's /net
>> and both run HTTP servers binding to and listening on *:80 what takes
>> care of which packet belongs to which HTTP server?
>
> I don't think you've quite got it yet.... also I swore I wouldn't post in
> this thread.  Oh well, here goes.
>
> First, let me draw a picture, just to introduce the characters:
>
> +----------+              +---------+
>| Internal |<--Ethernet-->| Gateway |<--Ethernet-->(Internet)
>| Computer |   ^          +---------+
> +----------+   |
>                |
> +----------+   |
>|  Other   |<--+
>| Internal |
>| Computer |
> +----------+
>
> OK.  Here, we have two internal computers (IC and OIC) and a gateway G.
> There are two Ethernet networks in flight, one connecting IC, OIC, and G,
> and the other connecting G to the internet at large, somehow (e.g. ADSL).
>
> IC and OIC both initialize somehow, say using DHCP from G, and bring their
> network stacks up using this information.  Their kernels now provide the
> services that will be mounted, by convention, at /net, again using this
> private information.  G initializes statically, bringing its IP stack up
> using two interfaces, with two routes: one for internal traffic, and one
> default route.
>
> So far, it's all very similar between Plan 9 and Linux.  Here's where
> our story diverges.
>
> In Linux, IC and OIC are both taught that they have default routes to the
> Internet At Large by sending IP datagrams to G's internal ethernet
> interface.  How this works in more detail, they don't care.  G will also
> send them corresponding IP datagrams from its interface; that's all they
> care about.  G works furiously to decode the network traffic bound for the
> internet and NA(P)T it out to its gateway, maintaining very detailed
> tables about TCP connections, UDP datagrams, etc, etc.  How could it be
> but any other way?
>
> Let's redraw the picture, as things stand now, under Plan 9, just so
> things are clear:
>
>                                                   (OIC similar to IC)
> +----Internal Computer--------------------+               |
>| bind '#I' /net                          |               |
>| # I : Kernel IP stack (192.168.1.2)      |               |
>| # l : Kernel ethernet driver             |<---Ethernet---+
> +-----------------------------------------+               |
>                                                           |
> +----Gateway------------------------------+               |
>| bind '#I' /net                          |               |
>| # I : Kernel IP stack (192.168.1.1)      |               |
>|                      (4.2.2.2)          |               |
>| # l : Kernel ethernet driver  (ether0)   |<---Ethernet---+
>|                              (ether1)   |<---Ethernet----->(Internet)
> +-----------------------------------------+
>
> In Plan 9, G behaves like any other machine, building a /net out of pieces
> exported by its kernel, including the bits that know how to reach the
> internet at large through the appropriate interface.  Good so far?
>
> Let's have G run an exportfs, exposing its /net on the internal IP
> address. This /net knows how to talk to the internal addresses and the
> external ones.
>
> Meanwhile, IC can reach out and import G's /net, binding it at /net.alt,
> let's say.  Now, programs can talk to the Internet by opening files in
> /net.alt.  These open requests will be carried by IC's mount driver, and
> then IC's network stack, to G, whereupon the exportfs (in G's userland)
> will forward them to its idea of /net (by open()ing, read()ing,
> write()ing, etc.), which is the one built on G's kernel, which knows how
> to reach the Internet.  Tada!  Picture time:
>
>                                                         (OIC)
> +----Internal Computer-------------------------+          |
>| abaco: open /net.alt/tcp/clone               |          |
>|                                              |          |
>| import tcp!192.168.1.1!9fs /net.alt (devmnt) |          |
>| bind '#I' /net                               |          |
>| # I : Kernel IP stack (192.168.1.2)           |          |
>| # l : Kernel ethernet driver                  |<---------+
> +----------------------------------------------+          |
>                                                           |
> +----Gateway------------------------------+               |
>| exportfs -a -r /net                     |               |
>|                                         |               |
>| bind '#I' /net                          |               |
>| # I : Kernel IP stack (192.168.1.1)      |               |
>|                      (4.2.2.2)          |               |
>| # l : Kernel ethernet driver  (ether0)   |<---Ethernet---+
>|                              (ether1)   |<---Ethernet----->(Internet)
> +-----------------------------------------+
>
> This works perfectly for making connections: IC's IP stack is aware only
> of devmnt requests, and G's IP stack is aware of some trafic to&from a
> normal process called exportfs, and that that process happens to be
> making network requests via #I bound at /net.
>
> The beauty of this design is just how well it works, everywhere, for
> everything you'd ever want.
>
> Now, suppose IC goes to listen on TCP:80, by opening /net.alt/tcp/clone.
> The same flow of events happen, and to a certain extent, G's network stack
> thinks that the exportfs program (running on G) is listening on TCP:80.
> exportfs dutifully copies the /net data back to its client.
>
> Naturally, if another program on G were already listening on TCP:80, or
> the same program (possibly exportfs) attempted to listen twice (if, say,
> OIC played the same game and also tried to listen on G's TCP:80), it
> would be told that the port was busy.  This error would be carried back
> along the exportfs path just as any other.
>
> So as you see, there is no need to take care of "which packet belongs to
> which server" since there can, of course, be only one server listening on
> TCP:80.  That server is running on G, and behaves like any other program.
> That it just so happens to be an exportfs program, relaying data to and
> from another computer, is immaterial.
>
> This also works for FTP, and UDP, and ESP (which are notorious problems in
> the NAT world), and for IL, and for IPv6, and for ethernet frames (!), and
> ... you get the idea.  It does this with no special tools, no complex
> code, and a very minimal per-connection overhead (just the IC and G
> kernels and G's exportfs tracking a file descriptor).
>
> There are no connection tracking tables anywhere in this design.  There
> are just normal IP requests over normal ethernet frames, and a few more
> TCP (or IL) connections transporting 9P data.
>
>> On a UNIX clone, or on Windows, because there is exactly one TCP/IP
>> protocol stack in usual setups no two programs can bind to the same port
>> at the same time. I thought Plan 9's approach eliminated that by keeping
>> a distinct instance of the stack for each imported /net.
>
> There can, in fact, be multiple IP stacks on a Plan 9 box, bound to
> multiple Ethernet cards, as you claim.  (In fact, one can import another
> computer's ethernet cards and run snoopy, or build a network stack, using
> those instead.)  I don't think that's relevant to the example at hand,
> though, as should be clear from the above.
>
> --nwf;



             reply	other threads:[~2008-11-19 18:31 UTC|newest]

Thread overview: 198+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-19 18:31 Eris Discordia [this message]
2008-11-19 20:08 ` Anant Narayanan
2008-11-20  0:00   ` Eris Discordia
2008-11-20  4:55     ` blstuart
2008-11-20  7:44       ` Eris Discordia
2008-11-20 17:34         ` Brian L. Stuart
2008-11-20 18:30           ` akumar
2008-11-20 18:36             ` erik quanstrom
2008-11-20 19:20               ` Brian L. Stuart
  -- strict thread matches above, loose matches on Subject: below --
2008-11-21  0:12 Eris Discordia
2008-11-21  0:42 ` erik quanstrom
2008-11-21  7:57   ` Eris Discordia
2008-11-20 22:28 Eris Discordia
2008-11-20 22:42 ` erik quanstrom
2008-11-20 21:35 Eris Discordia
2008-11-17  8:42 Eris Discordia
2008-11-17  7:57 Eris Discordia
2008-11-16 18:30 Eris Discordia
2008-11-16 18:08 Eris Discordia
2008-11-16 17:19 Eris Discordia
2008-11-16 16:58 Eris Discordia
2008-11-16 17:17 ` erik quanstrom
2008-11-16 18:01   ` ron minnich
     [not found] <96BA4878DB039F3DAE38CCF2@192.168.1.2>
2008-11-16 15:09 ` sqweek
2008-11-16 17:41   ` Charles Forsyth
2008-11-16 11:39 Eris Discordia
2008-11-16  7:24 Eris Discordia
2008-11-17 10:20 ` Dave Eckhardt
2008-11-17 14:01   ` Eris Discordia
2008-11-17 16:50     ` Dave Eckhardt
2008-11-17 19:45       ` Eris Discordia
     [not found] <DBCC6BB0C82C348357A14A53@192.168.1.2>
2008-11-15 11:49 ` Sergey Zhilkin
2008-11-16  4:31 ` Iruata Souza
     [not found] <FB6D5E99B294E50B901E8872@192.168.1.2>
2008-11-14 18:21 ` Tom Lieber
2008-11-14 18:59   ` erik quanstrom
2008-11-16  2:45 ` sqweek
     [not found] <906EC091083FF0C3C35F51A9@192.168.1.2>
2008-11-16  0:15 ` Felipe Bichued
2008-11-15 22:07 Eris Discordia
2008-11-16  5:27 ` Roman Shaposhnik
2008-11-16  6:19   ` Eris Discordia
2008-11-15 11:21 Eris Discordia
2008-11-15 13:38 ` Gabriel Diaz Lopez de la Llave
2008-11-15 15:30   ` hiro
2008-11-15 20:01 ` Roman Shaposhnik
2008-11-15 22:13   ` Micah Stetson
2008-11-16  5:47     ` Roman Shaposhnik
2008-11-16 19:36       ` Micah Stetson
2008-11-16  6:27     ` Eris Discordia
     [not found]     ` <1282469A8843837F996E64E1@192.168.1.2>
2008-11-16  6:57       ` andrey mirtchovski
2008-11-16 11:45         ` Eris Discordia
     [not found]         ` <D6FDC9E2D78F88C07963DBE5@192.168.1.2>
2008-11-16 12:49           ` hiro
2008-11-16 16:15             ` Eris Discordia
2008-11-16 17:38               ` lucio
2008-11-16 13:25           ` Uriel
2008-11-16 19:46       ` Micah Stetson
2008-11-16 21:24         ` Eris Discordia
2008-11-16 21:52           ` erik quanstrom
2008-11-19  1:59           ` Nathaniel W Filardo
2008-11-20  2:35             ` erik quanstrom
     [not found]         ` <D0E4FEAEC0D3FD307DE41383@192.168.1.2>
2008-11-17  5:12           ` Micah Stetson
2008-11-14 17:29 Eris Discordia
2008-11-14 16:39 Eris Discordia
     [not found] <7D122EF9133395AC4DEA0396@192.168.1.2>
2008-11-13 16:55 ` sqweek
2008-11-13 17:28   ` Brian L. Stuart
2008-11-15  4:12   ` Roman Shaposhnik
2008-11-13 14:25 gdiaz
2008-11-14 16:43 ` Eris Discordia
2008-11-14 17:00   ` erik quanstrom
2008-11-12 21:19 Eris Discordia
2008-11-12 23:11 ` erik quanstrom
2008-11-12 23:51   ` Bruce Ellis
2008-11-13  0:35     ` akumar
2008-11-13 11:58   ` Eris Discordia
2008-11-13 14:17     ` erik quanstrom
2008-11-13 16:22       ` Iruata Souza
2008-11-12 19:08 erik quanstrom
2008-11-12 13:23 Eris Discordia
2008-11-12 14:02 ` Charles Forsyth
     [not found] <ba5c9f8b914dc6c6d0b4f533d681cda2@quanstro.net>
2008-11-12  5:52 ` sqweek
2008-11-12  5:22 erik quanstrom
     [not found] <150a5464b8f389f1eb92ff001f7d391f@quanstro.net>
2008-11-12  5:17 ` sqweek
2008-11-12  4:50 erik quanstrom
2008-11-09  6:12 erik quanstrom
2008-11-09 13:52 ` Bruce Ellis
2008-11-09 20:39   ` C H Forsyth
2008-11-09 21:57     ` Bruce Ellis
2008-11-07 21:51 Roman V. Shaposhnik
2008-11-07 22:31 ` ron minnich
2008-11-07 23:19   ` Charles Forsyth
2008-11-07 23:45   ` Skip Tavakkolian
2008-11-07 23:51     ` ron minnich
2008-11-08  6:16     ` Bruce Ellis
2008-11-08  7:22       ` Lyndon Nerenberg
2008-11-08  3:43   ` Roman V. Shaposhnik
2008-11-08  3:56     ` ron minnich
2008-11-08  4:29       ` Roman Shaposhnik
2008-11-08 11:39     ` erik quanstrom
2008-11-07 22:37 ` Charles Forsyth
2008-11-07 22:38   ` C H Forsyth
2008-11-08  1:45     ` Roman V. Shaposhnik
2008-11-08 11:47       ` erik quanstrom
2008-11-08 12:11         ` Francisco J Ballesteros
2008-11-08 15:58           ` Charles Forsyth
2008-11-08 17:21             ` Skip Tavakkolian
2008-11-08 18:27               ` Brantley Coile
2008-11-08 18:32                 ` akumar
2008-11-08 18:44                   ` Russ Cox
2008-11-08 23:56                   ` LiteStar numnums
2008-11-08 19:15             ` John Barham
2008-11-08 22:16               ` Roman Shaposhnik
2008-11-08 23:11                 ` erik quanstrom
2008-11-08 23:37                   ` Roman Shaposhnik
2008-11-09 11:26                     ` Steve Simon
2008-11-10  5:50                       ` Enrico Weigelt
2008-11-10  6:17                         ` sqweek
2008-11-10  6:26                           ` Enrico Weigelt
2008-11-10 10:00                             ` Robert Raschke
2008-11-11  2:40                               ` Enrico Weigelt
2008-11-11  2:53                                 ` sqweek
2008-11-10 22:46                           ` Roman V. Shaposhnik
2008-11-10 22:54                       ` Roman V. Shaposhnik
2008-11-10  5:26                     ` Enrico Weigelt
2008-11-10  5:56                       ` Anant Narayanan
2008-11-10  6:18                         ` Enrico Weigelt
2008-11-10 12:11                           ` Charles Forsyth
     [not found]                           ` <4a3bd2fc8118cd88c5bd56605ba6d4e9@terzarima.net>
2008-11-11  2:23                             ` Enrico Weigelt
2008-11-10  6:01                       ` Skip Tavakkolian
2008-11-08 23:36                 ` Mechiel Lukkien
2008-11-08 22:13           ` Roman Shaposhnik
2008-11-08 22:19             ` Bruce Ellis
2008-11-08 22:59               ` Roman Shaposhnik
2008-11-08 23:11                 ` Bruce Ellis
2008-11-08 23:26                 ` ron minnich
2008-11-09  1:12                   ` Bakul Shah
2008-11-09  5:50               ` Skip Tavakkolian
2008-11-09 20:43                 ` C H Forsyth
2008-11-09 22:13                   ` Skip Tavakkolian
2008-11-09 22:21                     ` Bruce Ellis
2008-11-10 21:56         ` Roman V. Shaposhnik
2008-11-10 22:28           ` Anant Narayanan
2008-11-10 23:38           ` C H Forsyth
2008-11-10 23:45             ` Roman V. Shaposhnik
2008-11-11  0:14               ` Charles Forsyth
2008-11-11  1:00                 ` Roman V. Shaposhnik
2008-11-11  1:50                   ` Bruce Ellis
2008-11-11 15:37                   ` Skip Tavakkolian
2008-11-11 16:02                     ` Eric Van Hensbergen
2008-11-11 16:36                       ` Skip Tavakkolian
2008-11-11 16:52                         ` Eric Van Hensbergen
2008-11-12  2:42                           ` sqweek
2008-11-12  3:26                         ` Roman Shaposhnik
2008-11-11 19:18                       ` Bruce Ellis
2008-11-11 19:55                         ` Eric Van Hensbergen
2008-11-11 20:08                           ` Bruce Ellis
2008-11-11 16:30                     ` Uriel
2008-11-11 16:51                       ` ron minnich
2008-11-11 17:01                       ` Eric Van Hensbergen
2008-11-11 17:54                         ` sqweek
2008-11-11 19:46                           ` ron minnich
2008-11-11 20:51                             ` erik quanstrom
2008-11-11 22:33                               ` Eric Van Hensbergen
2008-11-12  0:32                                 ` Eris Discordia
     [not found]                                 ` <D06FA45F8C3E658AA29EAAFD@192.168.1.2>
2008-11-12  4:40                                   ` sqweek
2008-11-11 19:54                           ` Eric Van Hensbergen
2008-11-12  2:11                             ` sqweek
2008-11-12  2:44                               ` Eric Van Hensbergen
2008-11-12  3:51                               ` Roman Shaposhnik
2008-11-12 14:29                                 ` Charles Forsyth
2008-11-12 14:48                                 ` Eric Van Hensbergen
2008-11-12  4:58                               ` ron minnich
2008-11-12  5:20                                 ` Roman Shaposhnik
2008-11-12 17:47                                   ` ron minnich
2008-11-12 19:00                                     ` Uriel
2008-11-12 19:13                                       ` geoff
2008-11-12 19:58                                         ` Charles Forsyth
2008-11-12 19:55                                           ` Brantley Coile
2008-11-12 21:08                                             ` Gorka Guardiola
2008-11-13 16:37                                         ` Dan Cross
2008-11-14  5:52                                           ` Roman Shaposhnik
2008-11-14  8:18                                             ` Steve Simon
2008-11-14 16:35                                             ` Eric Van Hensbergen
2008-11-20 12:08                                             ` Dan Cross
2008-11-20 22:57                                               ` Roman V. Shaposhnik
2008-11-12 19:16                                       ` ron minnich
2008-11-12 19:31                                       ` Eric Van Hensbergen
2008-11-12 21:20                                     ` Roman V. Shaposhnik
2008-11-12  3:40                       ` Roman Shaposhnik
2008-11-11  0:19               ` ron minnich
2008-11-11  0:48                 ` Eric Van Hensbergen
2008-11-11  6:35                 ` Skip Tavakkolian
2008-11-11  2:19           ` Enrico Weigelt
2008-11-11  2:32             ` Lyndon Nerenberg
2008-11-11  6:54             ` Skip Tavakkolian
2008-11-11  8:45           ` Fco. J. Ballesteros
2008-11-11 15:28             ` hiro
2008-11-11 16:25               ` Gorka Guardiola
2008-11-12  1:55             ` Roman V. Shaposhnik
2008-11-12  2:48               ` sqweek

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='2AB9AFC10DDFC15A2A6D27BA@[192.168.1.2]' \
    --to=eris.discordia@gmail.com \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).