[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
More random and not so random thoughts
First some things I want to clarify after this morning. Note that I am
not speaking on behalf of the design team here.
I suppose it would be a good idea to get a working definition of
"multiaddressing". I think the idea is that a host gets more than one
address. At some point this host will start emitting packets to the
network. The most basic problem that we must solve in order for this to
work is the source address selection problem. Something better than RFC
3484 for the destination address would be very useful too. I think we
can address this separately from whatever else we're going to do. So by
all means, work such as NAROS should continue.
Now if hosts have more than one address (which already happens
regularly in IPv4 and should be considered almost the norm in IPv6)
then one of three things can happen:
1. The application doesn't know about multiple addresses, so default
address selection kicks in. This doesn't reliably work today in the
presence of ISP ingress filtering. This unhappiness needs to be
resolved one way or the other, so see above. (Single homing because
multihoming is worse isn't good.)
2. The application cycles through (a reasonable subset of) all
addresses. This should work reasonably well, but it sessions can still
break because of a routine routing change. So still see above. Also,
I'm sure there are applications for which implementing all of this is
appropriate, but I don't think it's reasonable to require handling all
of this from application writers. And there are many reasons, both very
pragmatic and much more fundamental, why I think this is simply the
wrong approach for the general case.
3. Some intermediate layer handles this. This could be a special
transport (SCTP), mobility or of course the latest and greatest loc/id
stuff.
To me, all of this could be "multiaddressing" but I'll try to avoid
that word from now on. If someone can come up with some new
non-confusing terminology for all of this I promise I'll try to use it.
So here is my reasoning on where the handling of multiple addresses
should happen:
Applications: not a good idea:
- there are many applications, doing the same work many times
- application writers usually don't understand network stuff so they
are likely to get some of it wrong
- applications can have a surprisingly long shelf life while OSes
_usually_ get updated at some point, and supporting legacy apps is hard
enough as it is
- limited to things that can be done on one end most of the time
Each OS for itself: not a great idea
- makes porting applications harder
- little useful tradition in interoperation here
- again duplication of effort and often limited to doing stuff on one
end
Transport: good and bad
- making TCP address agile would have a very siginificant benefit: TCP
already keeps track of important end-to-end information that can be
reused to good effect.
- doing a lot of stuff for each individual session is inefficient as
many applications use very short-lived sessions
- doing this for each transport protocol is infeasible as protocols
like UDP don't have the necessary hooks to do this
IP: not so bad and not so good
- this can be a general mechanism, do it once, solve the problem forever
- possibility of offloading processing to middlebox for policy,
efficiency or speedy deployment
Ideally, we could start by implementing this in middleboxes. Yes,
middleboxes suck but doing multihoming in the face of restrictive RIR
policies and strange filters in far away networks isn't much fun either.
Then everything is implemented in the OSes. Now there is a tradition in
Unix where TCP and IP are in practice completely comingled. So even
though we define this mechanism to work at the IP layer, TCP
implementations could easily incorporate this and start doing *really*
interesting things such as load balancing a single session over
multiple paths.
And if we're careful when defining all of this, it should be possible
to drop in a new namespace if and when this is considered desirable.
Christian says implementing this would turn OSes upside down. But I
simply don't see this. It seems to me that this could be entirely
contained to the (TCP/)IP stack. Applications simply revert to IPv4
behavior where they connect to a single address and if it is possible
to set up the session, it will happen, and if not, the connection
fails. No need to do anything complex.
Now obviously we can define one or more more advanced APIs that let
smart applications look deeper inside the network. This would be more
work than in the situation where we don't change anything, but I don't
think smart applications really get to do what they need to do now
anyway.
About the roadmap/more desing teams thing: I'm afraid of a situation
where a good core idea doesn't take some limitations in consideration
so the resulting proposal is flawed. It looks like this is already the
case with e2e/lin6, but I have to read a bit more about those before I
can say anything conclusive here. Hopefully the chairs can figure out a
way to avoid this from happening.
Iljitsch