Re: where the indirection layer belongs

2003-09-02 Thread Robert Honore
Dear Keith Moore,

I do not want to seem to be ganging up on you, but your reply to Mr. 
Hain just prompts more questions.

You are missing something fundamental here - if a TCP connection breaks
(isn't closed cleanly) then the two endpoints can get out of sync
regarding how much data was delivered.  You can't fix this at higher
layers without an unacceptable amount of complexity and overhead.
This has nothing to do with the app/transport interface being a sacred
invariant - it happens any time you try to layer something on top of
transport that has to survive breakage of the transport layer.
(how many ways do I have to explain this?)

You might have to explain this really often and in simple language too. 
 But why do you assert that it will take lots of complexity and 
overhead?  Can you point to some code where they tried this?  As far as 
I know, nobody has really given this an earnest try as yet.  At least 
not with any IP protocols.

It's a lot less glue than the L4-L7 approach, and most of it has to deal
with authentication that would be needed for any kind of
remotely-originated routing update anyway, regardless of what layer it
lived at.
What specific glue do you believe it requires for the L4 to L7 approach? 
 How does that compare to what is needed in an L3 solution?

Yes you can do that but it presumes that the host knows a priori whether
or not it needs the stabilization layer.  I would make the
mechanism used to provide stable addresses a property of the network-
either the network provides "reasonably" stable addresses (i.e. plenty
of prior notice before changing them) or it provides a stabilization
layer.  That way, networks that don't need it don't pay the overhead.
But I would argue that the host or at least the application's designer 
knows whether it will need the stabilisation layer.  Making the 
mechanism that provides the stable network addresses a property of the 
network leaves the question of how.  Even if that were achieved though, 
that still does not completely or effectively address the problem of one 
application process identifying its peer across the network.

Yours sincerely,
Robert Honore.






Re: where the indirection layer belongs

2003-09-02 Thread Robert Honore
 an interface or a set of
 interfaces."
While we have regarded the node and its interface as one and the same, 
it really isn't, even though we can get away with that most of the 
times.  My point is that we haven't even considered the other half of 
the problem as far as the application is concerned.  We also need a 
higher level object which we can associate with the node itself or the 
application endpoint and with which we can associate an identifier. 
Such an association will need to remain valid at least for the duration 
of the application's run-time, I believe.


And the second question is what should be the context of that
identifier's validity?


The identifier should be unique within the entire Internet.  In some
cases (e.g. small networks without connectivity to the Internet core)
"very likely to be unique within the Internet" would probably
suffice.  That doesn't mean that you can send to any point from any
other point, because there will still be access controls.  But if an
address is advertised for a host, and you have permission to send to
that host, you should be able to use that address to send to that host.
If you accept the statement I made above, the minimum context of that 
association's validity should be the collection of nodes that are 
currently participating in that application's protocol.  I then have no 
fundamental disagreement with your assertion that such an identifier 
should be valid within the entire Internet.

The first one I explained above in slightly more detail.  The second one
should be obvious.  If an address becomes invalid because of a topology
change somewhere distant in the network, how is a layer above layer 4
going to know about it?  It doesn't have access to routing protocol
updates - those happen at layer 3 and aren't normally propagated to
hosts anyway.  When you think about it, you probably don't want hosts to
have to listen for information about distant state changes in the
network - that would place a tremendous burden on small hosts and nets
with low-bandwidth connections.
The second one becomes obvious only if you restrict the definition of 
endpoint to the interface.  If instead the definition of the endpoint is 
taken to be the process or object that is supposed to be the final 
recipient of the data that is forwarded by the IP and the transport 
layers, then it is no longer so obvious.  Sometimes I wonder if we 
aren't treating together concerns or problems that we should be treating 
separately.

I don't want *application processes* to be needing to listen for 
information about distant state changes in the network, but I do want my 
application processess to be able to adapt or recover when something 
happens that affects its communication with a peer *process* while 
neither of the cooperating processes has indicated any intention to stop 
participating in that communication.

Yours sincerely,
Robert Honore.







Re: where the indirection layer belongs

2003-09-02 Thread Robert Honore
Dear Folks,

Regarding this discussion about an indirection layer, I am thinking we 
really should propose the formation of some forum for discussion of 
these issues.  It does not seem to fit cleanly into the IPv6 working 
group, and out here in no-man's-land, I don't think it is getting the 
kind of attention it needs.

I had already made my position clear.  We need something.  Call it an 
indirection layer or a stabilisation layer or whatever you want, but we 
need a forum where we can specify the problem we are trying to solve and 
to consider the possible solutions for it.  Does anybody agree?

Yours sincerely,
Robert Honore.






Re: where the indirection layer belongs

2003-09-02 Thread Robert Honore
Dear Folks,

I have been trying to understand the problem we are trying to solve in 
this thread and trying to see if I could produce for myself something 
resembling a specific description of that problem.

I might have mentioned in passing earlier today that perhaps we are 
trying to treat as a single problem, separate problems that might be 
better treated as separate.  I am becoming more convinced of this as we 
go on.  As such, I can distinguish the following issues as aspects of 
the problem given all that was mentioned in this thread, the "solving 
the real problem" thread and the one on the IPv6 mail list about 
deprecating Site Local addresses and the usage of IPv6 Link Local 
addresses.  They are as far as I can tell the following.

*	Stable (or reliable) end-point identifiers
*	Resiliency of application (protocol) in the face of sudden IP address 
changes
*	Self-organised networks

With respect to stable end-point identifiers, we must in my opinion, 
still specify what we are calling an end-point and settle once and for 
all the question of whether an IP address is a suitable candidate for 
such an identifier.

With respect to the resiliency of applications in the face of [sudden] 
IP address changes, we need to determine if, as Keith Moore argues it 
cannot be solved in a single layer, or if it can as Tony Hain argues, as 
well as where best to situate such a layer.

The one about the self-organised networks materialises out of the 
discussion going on in the IPv6 mail list about the deprecation of Site 
Local IP addresses and the proper usage of IPv6 Link Local addresses. 
Many of the contributors to those threads were basically arguing that we 
should retain either or both of Site Local and Link Local addresses 
because of intermittently connected sites, nodes or subnetworks, as well 
as being to maintain communications between two locally adjacent when 
the local subnetwork either connects to -  or disconnects from - a 
larger network.

My question following from all that, are two.  Is it worth it to attempt 
a solution to any of the aforementioned problems?  If so, which one 
should we tackle first?

Yours sincerely,
Robert Honore.






Re: where the indirection layer belongs

2003-09-03 Thread Robert Honore
Dear Keith Moore,

Maybe I read your paper on project SNIPE too quickly, but it was not 
immediately clear that the problems you mentioned  were a specific 
result of an attempt to make the application resilient against (sudden) 
changes in IP address.  More specifically, it was not clear from that 
report that the additional complexity did come from the attempt to 
provide the kind of resilience we are seeking, or from the rather 
ambitious goals of project SNIPE.  I will re-read more slowly and 
carefully this time.

Yours sincerely,
Robert Honore.
Keith Moore wrote:
(regarding the complexity of putting a general-purpose layer to survive
address changes between L4 and L7)

 But why do you assert that it will take lots of complexity and 
overhead?  Can you point to some code where they tried this?  As far
as I know, nobody has really given this an earnest try as yet.  At
least not with any IP protocols.


I tried this in connection with a project called SNIPE that I worked on
several years ago.  SNIPE was an attempt to build a very
reliable distributed computing environment that supported, among other
things, the ability to access a computing resource via multiple
addresses (mostly in order to exploit high-bandwidth local networks
not necessarily using IP), and the ability of both hosts and processes
to migrate to other addresses.  It used a DNS-like service similar to
RESCAP (for those who remember that) to register the addresses at which
a process was accessible, and it attempted to provide TCP-like streams
on top of TCP and this registry that would survive changes in those
addresses.  Basically I found that you can get such a service to work
reasonably well and reasonably efficiently if endpoints don't move
without adequate notice.  OTOH if hosts or processes do move without
adequate notice then you end up needing to implement the mechanisms I
mentioned earlier, and that involves extra copies and extra overhead. 

The reason I am preposing that the two problems (changing addresses
with adequate notice and changing addresses without adequate notice) be
treated separately is that by trying to make a single mechanism serve
both purposes you end up with a lot of inefficiency and/or cost that
aren't needed in most cases.  And that's true (for different reasons)
regardless of whether you insert that single layer between L3 and L4 or
between L4 and L7.

What specific glue do you believe it requires for the L4 to L7
approach? 


Thought I'd said this already: buffering of data until acknowledged by
the peer, generation and processing of acknowledgements, retransmission
of lost messages due to broken connections, windowing (so you don't
degrade to stop-and-wait), duplicate suppression.  You also need to
multiplex control and data information over the same stream and to probe
for other addresses when you get a failure on the one you were using.

 How does that compare to what is needed in an L3 solution?


If you work on the problem at (or just above) L3, transport protocols
already have the code needed to recover from lost messages, so you don't
have to reimplement that.  You basically need a mechanism by which the
layer can realize it needs to start routing packets differently, and do
so.  You probably need multiple ways that the layer can get that
information because the remote address can change for a variety of
reasons and in lots of different places in the network.   (That's
equally true for the L4-L7 layer as for the L3-L4 layer, but the L4-L7
layer isn't in a position to get some of that information.  The L3-L4
layer can potentially recover from address changes more quickly but to
do that safely it has to be able to authenticate and establish a basis
for trust in a wider variety of information sources.)

Yes you can do that but it presumes that the host knows a priori
whether or not it needs the stabilization layer.  I would make the
mechanism used to provide stable addresses a property of the
network- either the network provides "reasonably" stable addresses
(i.e. plenty of prior notice before changing them) or it provides a
stabilization layer.  That way, networks that don't need it don't
pay the overhead.
But I would argue that the host or at least the application's designer
knows whether it will need the stabilisation layer. 


It can't know that reliably unless the network without the stabilization
layer has well-defined properties - e.g. the network won't change
addresses of a network without advertising those changes with a minimum
amount of advance notice.  If addresses can potentially change at
arbitrary times with no assurance of stability then every app needs the
stabilization layer (or provide its own means of recovery).

Making the 
mechanism that provides the stable network addresses a property of the
network leaves the question of how.  Even if that were achieved
though, that still does not completely or effe

Re: Solving the right problems ...

2003-08-28 Thread Robert Honore
Dear Tony Hain,

Perhaps this proposal really requires another working group or 
something.  I seem to remember someone making a similar proposal a 
several years ago on this list and it didn't seem to get a good 
reception then.  For what it is worth, though, I really do think it is 
an idea whose time has come.

It seems everyone has espoused the idea that the application *must* talk 
directly to the network transport in order to be efficient and/or 
resilient, but given the capabilities IPv6 is supposed to have, I wonder 
how much of a good idea it is to cling to that concept.

It is not worthwhile to suggest that the direct application/transport 
interface be eliminated, but it should be possible for an application to 
specify what kind of service it wants from the (transport, network) 
combination and something is there to handle that where the requested 
service is different from that natively provided by the 
(transport,network) combination.  Problem is that right now, every time 
an application needs such a service, the application programmer must 
code his own provisions for it, and none of the propositions I have seen 
discussed so far seems to deal with that.

Keith Moore's statement is quite correct, viz:
Application developers need
reasonably stable and reliable endpoint identifiers.  At present, the IP
address is the closest available approximation to such an identifier.
Two questions arise out of that though, at least as far as Keith Moore's 
statement is concerned.  The first one is how stable is stable?  That 
is, how long is that identifier supposed to remain stable.  And the 
second question is what should be the context of that identifier's validity?

Also from Keith Moore:
Disagree.  The layer needs to be between the current network and transport
layers.  If the layer were between transport and applications, many of the
services provided by transport would end up having to be re-implemented in
higher layers.
And
It would also force routing decisions to be made by layers
much more distant from the network layer that maintains reachability and state
information than the transport layer.
Does Mr. Moore care to explain a little why he believes these two 
statements?  As far as I can tell it needs not necessarily be so.

Yours sincerely,
Robert Honore.
Tony Hain wrote:
In the ongoing saga about topology reality vs. application perception of
stability, it occurs to me we are not working on the right problem. In short
we have established a sacred invariant in the application / transport
interface, and the demands on either side of that interface are the root of
conflict.
Mobile IP, and the multi6 DHT work are attempts to mitigate it through
slight of hand at the IP layer, while SCTP attempts to mask the topology
reality in the transport layer. (These are probably not the only examples,
but they are the ones that come to mind this morning.) Yet none of these
really do the job in all cases.
We all agree that applications should not be aware of topology. At the same
time,  application developers insist on the right to pass around incomplete
topology information. There are arguments that the IP address is overloaded
as an endpoint name. I don't particularly buy that, because the real
endpoint is either a protocol, or a specific port of a protocol. From one
perspective, when applications use addresses in referrals, they are
specifying that routing through a particular point in the topology will
reach the desired endpoint named 'transport/port-id'. But that is a
semantics and perception discussion which doesn't help reach the goal.
In any case, what applications need is a stable reference to other
participants in the app. Yet we know that current and projected reality says
that topology is not stable, or consistently reachable. This could be due to
technology issues of the underlying links, or simple policy. Either way, the
network as seen by the transport layer is not, and will never be stable or
consistently reachable from everywhere. Given that, the direct interface
with the transport layer creates a failure mode for an application expecting
stability. 

Where this leads us is to the sacred invariant, and the need to solve the
problem in the right place. I suggest it is time for the IETF to realize
that the protocols are no longer being used in the network of 1985, so it is
time to insert a formal stabilization layer between application & transport.
Such a layer would be responsible for managing intermittent connectivity
states and varying attachment points of the transport layers below.
Applications that interact with this layer would be insulated from the
inconsistencies being experienced by the transport layer. It would also be
reasonable for this layer to manage multiple simultaneous transport
interactions so that the application perceived a single data path to its
peer. With appropriate trust between the stack and the network policy, this
would e

Re: where the indirection layer belongs

2003-09-05 Thread Robert Honore
Dear Masataka Ohta,

 Masataka Ohta wrote:
Keith;


(regarding the complexity of putting a general-purpose layer to survive
address changes between L4 and L7)


It is not merely complex but also useless to have such a layer.

Right now I am not fully aware of all of the specifics of the issues in 
trying to implement such a layer, but the statement you make in the 
paragraph just below does not seem to support your statement that "It is 
not merely complex but also useless to have such a layer."  I will 
explain my position below.

The basic problem of the approach to have such a layer is that
only the application layer has proper knowledge on proper
timeout value to try other addresses.
If such a layer is useless as you say, then the application could see no 
benefit to being able to parametrise the transport or network layers 
with such information as the proper timeout values to try other 
addresses.  It would also be impossible for the application to benefit 
from being able to find other addresses to try.

Another objection I have to your statement:  If the application layer is 
the one that has the proper knowledge of things like timeouts (I suppose 
there are things), then it should be possible to implement something on 
the stack that is close to the application wherein it can collect that 
information and parametrise the behaviour of the rest of the lower 
layers.  If by your statement you are saying that it is impossible to 
implement such a thing, then you will have to prove it.

So, the issue can be solved only involving application layer, though
most applications over TCP can be satisfied by a default timeout of
TCP. In either case, there is no room to have an additional layer.
I agree completely with your first sentence in this paragraph.  The 
problem we have right now is that, save for the application specifying 
to the transport which peer port it wants to connect with, it has no 
further control over the behaviour of the transport or the network 
layers other than to possibly drop the connection.

I cannot as yet agree or disagree with your second sentence.  I don't 
know as yet what needs to be built.  I will say that I would prefer to 
minimise or avoid altogether any modifications to the transport or the 
network protocols.  I would also prefer not to modify any of the 
libraries or implementations of those protocols, lest we break something.

I documented it long ago (April 2000) in draft-ohta-e2e-multihoming-*.txt

   The Architecture of End to End Multihoming

(current most version is 05) that:

   To support the end to end multihoming, no change is necessary on
   routing protocols. Instead, APIs and applications must be modified to
   detect and react against the loss of connection.  In case of TCP
   where there is a network wide defact agreement on the semantics
   (timeout period) of the loss of connectivity, most of the work can be
   done by the kernel code at the transport layer, though some timing
   may be adjusted for some application. However, in general, the
   condition of "loss of connectivity" varies application by application
   that the multihoming must directly be controlled by application
   programs.
			Masataka Ohta

Having looked at draft-ohta-e2e-multihoming-05.txt, I am not convinced 
that it supports your statement that "It is not merely complex but 
useless to have such a layer", nor do I believe that the presence of 
such a layer would necessarily violate the end-to-end principle you 
advocate in draft-ohta-e2e-multihoming-05.txt.  In fact, the way I see 
it, the presence of such a layer could make it easier to achieve the 
aims of draft-ohta-e2e-multihoming-05.txt even without needing to 
designate any special kind of IPv6 address, provided we can solve the 
problem of specifying end-point identifiers and clarifying exactly what 
they should identify.

PS

Layering is abstraction and not indirection at all.

Agreed.  We should use the correct terminology.

Yours sincerely,
Robert Honore.






Re: where the indirection layer belongs

2003-09-05 Thread Robert Honore
Dear Pekka Nikander,

Please forgive the late reply.

Where can I find out more about Dave Crocker's MAST?

See the rest of my message embedded among the qoutation of your text.

Pekka Nikander wrote:
Robert,

I like your analysis very much.  Thank you for writing it up.

However, I also see a kind of causality here:  it looks to me that 
stable end-point identifiers are mainly needed to make applications 
survive IP address changes.  Dave Crocker's MAST is a good example 
how you can do that without having stable end-point identifiers.
There is more to stable end-point identifiers than just the ability to
make an application resilient.  I will argue that IP addresses *do not*
identify end-points, but node interfaces.  That is, they only specify
objects on the path to the end-points.  Applications, users and system
administrators need to specify more than node interfaces  They try to do
so by twisting IP addresses to all kinds of usages for which they were
not intended and are ill-suited in my opinion.  Indeed it is a feature
that IP addresses and their definition as an identifier for a node
interface are so flexible that it is possible to contemplate extending
their usage for those purposes.
On the other hand, security looks to me as a good reason for having 
stable end-point identifiers.  If you can securely recognize an 
end-point (with emphasis on the *re-* part of re-cognize), you can 
develop trust.  Trust, in turn, is very handy for lowering 
transaction costs.

Indeed it is, and I would add that end-point identifiers (together with
node interface identifiers) are the thing that system administrators and
system security officers want.
Even facing the danger of opening yet another rat hole, in my opinion
 we should not have a very strict definition for end-point. That is,
 IMHO end-point should and could be a fuzzy concept, somewhat like
the concept of a site is today.
From my point of view, an end-point may be a process, a group of 
processes, a host, or even a server cluster offering services as a 
unit.  To me, it looks like fate sharing and common semantics are the
 key points here.  An end-point should either work or fail, it should
 not be usual for half of an end-point fail while the other half is 
continuing.  An end-point should also be considered at the 
application level as a single unit.

The question that that raises is, whether it is reasonable to use such
an inclusive notion of an end-point, and what is the simplest kind of
structure or object we can use to implement an end-point identifier?  We
might have to restrict the notion of an end-point somewhat.
In my opinion, we clearly need solutions to all of these problems. 
Furthermore, it looks like introducing stable end-point identifiers 
to the stack almost automatically protect applications from the 
changes of IP addresses.  I also tend to believe that stable 
end-point identifiers may also help to build self-organized networks.
 However, IMHO the problem of self-organized networks is more 
researchy in nature than the other two.
With respect to the protection of applications from changes of IP
addresses, the effectiveness of that protection (or its robustness) will
depend on what the final specification of end-point identifiers is.
With respect to the problem of self-organised networks, that might be a
research problem, but I would argue that it is a here-and-now research
problem.
Now, even though I believe that we should solve the problems (and 
apparently believe that there are sensible solutions), achieving 
consensus on solutions that require architectural change may take too
long.  Hence, I also believe that we need some kind of a road map, 
with some "temporary" or intermediate solutions along the way to a 
more long-standing set of solutions.

I agree, and your statement corresponds to what Keith Moore says about 
the solutions fitting into a framework that is yet to be specified.  I 
believe specification of that framework begins with our defining what an 
end-point is.

Yours sincerely,
Robert Honore.





Re: where the indirection layer belongs

2003-09-08 Thread Robert Honore
Dear Masataka Ohta,

 I was a bit impetuous in saying that I would prefer not to modify 
libraries or implementations etc.  However, my aim so far is more to 
obtain for myself a clear understanding of the problem we are trying to 
solve, rather than trying to state requirements of the possible 
solutions to that problem.  My apologies for such a stupid statement.

I do believe that there are issues to be resolved and they are being 
currently reflected in threads like the one about deprecating site-local 
addresses and the need for provider independent addresses that is 
currently active, as well as the thread "solving the real problem" 
started by Tony Hain.  I believe the issues being discussed there are 
real.  You might not agree that they are.

If the issues are real, then we need to specify or formulate them in a 
way that is amenable to deriving solutions for them.  If the issues are 
not real, then they are likely the artifacts of wrong perceptions or 
ideas that users and engineers in the IPv6 community have.  In that 
case, we need to replace those wrong perceptions or ideas with correct 
ones.  It seems to me though, that nobody has stated clearly what those 
wrong perceptions and ideas are, much less to say what is wrong with 
them and thus replace them with correct perceptions and ideas.

Yours sincerely,
Robert Honore.
Masataka Ohta wrote:
Robert Honore;


I would also prefer not to modify any of the 
libraries or implementations of those protocols, lest we break something.


It is a wrong requirement wrong in various ways.

First of all, we must change something, which means we must change
some code.
Though the changes should better be simple, whether the changes can
be inserted as a module or not is irrelevant,
To make the changes simpler, the modification MUST be confined in
libraries or kernel. So, we should try to change libraries or kernel
to avoid changes on application code.
It, of course, is necessary to change application code for UDP
cases for address selection that it is necessary to an API
to control address selection in IP headers from applications
that IP and transport layer code MUST be modified .
Secondly, preservation of code is less important to preservation
of protocol and protocol is defined on the wire.
If you put some code below transport layer to modify packet content
visible from the transport layer, which is the case with MAST, you
change the transport layer protocol.
But, again, we must change something of the protocol.

So, the requirements are:

	to modify existing code

	to modify existing protocol

and any attempt, including but not limited to MAST, to avoid them
is not constructive only to constraing the solution space to
result in less capable and less efficient solutions.
Of course, it is desirable

	to preserve existing application code

whenever possible. But, we must be aware that it is NOT always
possible.
In addition, it is desirable

	to preserve interoperability with existing protocols

which automatically means "to preserve interoperability with existing
code of the peer". In this case, it is doable. Of course, all the
freedom to use multiple addresses is lost when the peer is a
leagacy one.
			Masataka Ohta