[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Design decisions made at the interim SHIM6 WG meeting
El 27/10/2005, a las 21:37, Iljitsch van Beijnum escribió:
What RFC does is two things:
1. select source and destination addresses
2. tell application programmers to cycle through all destination
addresses
kind of agree...
i would say that rfc3484 does:
- it passes an ordered list of destiantion addresses to the app and
requires that the app should cycle through all of them until finds
one that is reachable
- it selects a source address for a given destiantion address when
the app does not select one
Actually, looking over the RFC very quickly, it doesn't look like RFC
3484 requires applications to cycle through all available
(destination) addresses.
Section 2 states that:
Well-behaved applications SHOULD iterate through the list of
addresses returned from getaddrinfo() until they find a working
address.
Most IPv4 applications don't cycle through all destination
addresses, and a significant number of IPv6 applications doesn't
either. I don't see applications cycle through all source/dest pairs
because that's very hard to do right.
not really understand what is the part that you think it is hard....
Specifying an address with bind() is of course not problematic. The
trouble is maintaining an up to date list of available addresses in
the system. Since this list is subject to change applications would
have to query all available addresses prior to any TCP session
establishments and the like. Also, when the application has this list
of addresses, it somehow needs to go back to the system to have RFC
3484 policies applied to the source/dest pairs.
right this is what rfc3484bis needs to specify how is done
I think we could have 3 approaches (which can be complementary i.e.
does not have to be one or the other)
- first approach is to let the app take care of everything
i.e. inform the app about all src and dst address and let
the app try all the possible combinations.
This is the minimum change to rfc3484 bis, i.e. state that
apps SHOULD retry with all possible src,dst pairs
A possible optimization for this, would be that the rfc3484
delivers an ordered list of address pairs (similar than current
rfc3484 delivers a ordered list of dst address, the rfc3484bis
would deliver to the app an ordered list of address pairs (based
on rules for prefering one address pair over the other)
[an alternative to this that would be more compatible with current
rfc3484 would that for a given dst address, rfc3484bis would
provide an ordered list or src addresses for this dst address]
I suppose this is possible although I don't find it very desireable.
If applications have to be changed anyway, why not come up with an API
that REALLY solves all of this?
but i think that we need to support the case where the app want to
select addresses (src and dst) that i wants to use. In this case, it
would make sense to allow rfc3484bis to provide some guidance about:
- that the app should retry using not only different dst addresses but
also different src addresses
- some guidance about which pair of src, dst address would be better to
try first i.e. an ordered list of address pairs or at least for each
dst address listed in the ordered list of dst address, provide an
ordered list of src addresses to try.
This of course is not opposed to other approaches as the ones mentioned
below. I think that we are just dealing with different scenarios, with
progressive app involvement:
- in this case, the app wants to select the address pair to use, so
let's allow rfc3484 bis to provide some guidance
- in the next case, the app will retry (i.e. determine when the packet
didn't make it) but will let rfc3484 bit to select the source address
- in the last case, rfc3484bis handles the full retrial process,
determines when a retrial is needed and selects the src address for it
- a second approach would be similar to the current case where the
app does not select the src address. In this case, the rfc3484bis
src address selection mechanism would need to use a different
src address each time the apps retries.
Yes, this is absolutely essential because consistently selecting a
non-working address is the worst possible outcome.
right, and always retrying using different dst address but always the
same non-working src address seems a bad scenario
In this case the responsible for retrying is still the app, and
the app needs to be informed that it needs to retry several
times with the same dst address, so that the rfc3484bis would
use different src address for this dst address. In order to
do this we could define an notification at the api level
to allow rfc3484bis mechanisms to inform the app that no more
src addresses are available to retry with and that we will be
recycling to ones that have already been tried (so that the
app can give up or use a different dst address)
Also API + application changes...
right
- a third approach would be to allow rfc3484bis to handle
retrials itself when the src address is left unspecified by the app
In this case, when an app tries to open a socket with an
unspecified src address, rfc3484bis would try to send packets with
different src addresses until it finds one that it is working.
Right.
And the next logical step is to do the same thing for the destination
address.
but this would imply too much changes at this stage....
i mean, you can do this by connecting by name, in which case, there
shouldn't be much problem, but if you want to support this when
connecting by address, then you will need something like the shim to be
negotiated upfront, before the communication even starts. this also
requires support from both ends. I don't think this is the goal of
rfc3484 bis, but rather the goal of the extension that we discussed in
the ams meeting about the API on steroids for the shim.
So, i see this as different issues:
-on one hand we have rfc3484bis, that provides guidance to apps about
which address pairs to use, and
- tries to select a reasonable src address when the app leave it
unpsecified and perhaps,
- it retries using different src addresses
while otoh, we have shim+API on steroids, that given a ulid pair (or an
dst ulid) it attempts to establish a connection using perhaps
alternative locators, in a transparent fashion to the app. In addition,
the shim through this API on steroids, it can inform that there are not
working locators for this dst ulid, and that it may make sense to try
with an alternative dst ulid (because the shim knows that there are
working locators for this ulid). Perhaps, we could even allow the shim
to provide an enhanced connect by name service
but i would suggest to do this separation about what is done by
rfc3484bis and what is done by the shim + API on steroids
the main difficulty is how rfc3484bis can determine that
a src address is working
For TCP it's simple: connect() fails = retry with a different address.
For UDP a packet coming back with src addr as dest addr, src port as
dst port etc is a reasonable indication that things are going well.
right, but for this second case, this may lead to erroneous
conclusions, which may be a big problem, since rfc3484 bis would be
stubbornly using a given src address while this may not be working (for
that particular app)
Now, this third approach is at best very debatable.
I think that the first two approaches make sense and that it would be
useful to incoporate information about incoming address pairs as a
hint to select outgoing address pairs that are working.
Is RFC 3484 ipv6 wg domain? In that case I think we may want to see
what that wg has to say.
right. the approach proposed in ams was for me to write a memo
describing the limitations of rfc3484 for multihoming support and a
descriptions of the possible changes to rfc3484 to produce rfc3484 bis
that deals with this.
i am on it, and i was thinking to include the points that i mention
above, that i why this feedback is so important to me
I suspect they'll be less than thrilled with API/applications.
[suppressing shim header]
As I've explained before: this can be exceedingly simple. We just
need signalling message, or a field in an existing signalling
message, so that a host can tell its correspondent that it doesn't
want to see the shim header for packets with rewritten addresses
within this context. If the sender simply honors this option then
we're done in the base spec.
i guess that the point is that we don't want to include this bit
unless we know that we know how to make this extension work in a
simple way
:-)
How about this: I'll write the draft about how this would work in
practice (i.e., when a host can demultiplex without the shim header)
and after that we make the final decision?
this works perfectly for me
Great.
(also i would be glad to work in the draft with you if you want)
Ok I'll contact you when I have my initial thoughts laid out.
* Adopt HIP parameter format for options; HIP parameter
format
defines length in bytes but guarantees 64-bit alignment.
I don't want this alignment. It wastes space, it's an
implementation headache and it buys us nothing.
i think that this is a small price to pay to allow future
convergence with hip that is anther protocol somehow related with
shim6
No, I don't see how this makes sense. It just makes the decision
making much more complex as the needs of two different mechanisms
must be aligned first.
not sure i understand what you mean here...
in the meeting we agreed that this is basically all that was to be
done in order to provide hip compatibility (no other consderations
will be made w.r.t. hip compatibility afaiu)
The problem here is that now the protocol layout is limited by the
requirements of both HIP and shim, and if either of these requires
some change, there must be extensive negotiations to maintain
compatibility.
no, we agreed that this will be the only effort to provide hip-shim
compatibility. no common option type name space nor similar will be
used
regards, marcelo