Subject: draft-roy-v6ops-v6onbydefault-01.txt

From: "Bound, Jim" <[email-masked]>
Date: Mon, 14 Jul 2003 17:07:23 -0400

Roy, Alain, and Jim,

Do you perceive this work as BCP?  Or Info RFC?  If accepted and worked
on?

This work is asking very good deployment and implementation questions.

Comments in line.

> Abstract
> 
>    This document discusses problems that can occur when dual 
> stack nodes
>    that have IPv6 enabled by default are deployed in IPv4 or 
> mixed IPv4
>    and IPv6 environments.  The problems include application connection
>    delays, poor connectivity, and network security.  Its purpose is to
>    raise awareness of these problems so that they can be 
> fixed or worked
>    around.

Do you mean dual stack or dual IP layer.  Most implementations I am
aware of are dual IP layer.  There is a huge difference.  This is
important for clarity for the rest of the document.  

> 
>
> 1. Introduction
> 
>    This document specifically addresses operating system 
> implementations
>    that implement the dual stack IPv6 model, and would ship with IPv6

We and others have implemented a dual IP layer not a dual stack.  So
this does not apply to us and others (yes wearing my HP hat on this
comment)???  We don't have tcp4 and tcp6 is the bottom line.  

I am just trying to make a point we have this error throughout the IETF
and other forums dealing with standards and deployment. Not many did a
pure dual stack at all.

>    enabled by default.  It addresses the case where such a system is
>    installed and placed in an IPv4 only or mixed IPv4 and IPv6
>    environment, and documents potential problems that users on such
>    systems could experience if the IPv6 connectivity is 
> non-existent or
>    sub-optimal.

So this work does not apply to a network where IPv6 is robust and
dominant?  

Or even equivalent with IPv4?

Meaning it only applies when a few subnets are doing IPv6 in a large
IPv4 cloud or network?

> 2. No IPv6 Router
> 
>    Consider a scenario in which a dual stack system has IPv6 
> enabled and
>    placed on a link with no IPv6 routers.  The system is using IPv6
>    Stateless Address Autoconfiguration [AUTOCONF], so it only has a
>    link-local IPv6 address configured.  It also has a single IPv4
>    address that happens to be a private address as defined in
>    [PRIVADDR].
> 
>    An application on this system is trying to communicate with a
>    destination whose name resolves to public and global IPv4 and IPv6
>    addresses.  The application uses an address resolution API that
>    implements the destination address selection mechanism described in
>    Default Address Selection for IPv6 [ADDRSEL].  The application will
>    attempt to connect to each address returned in order until one
>    succeeds.  Since the system has no off-link IPv6 routes, 
> the optimal
>    scenario would be if the IPv4 addresses returned were 
> ordered before
>    the IPv6 addresses.  The following sections describe where 
> things can
>    go wrong with this scenario.

I agree that the optimization above for this case would be useful or
order IPv4 is wise.
This points to tools we need for transiton I think as a note and a
failing in ADDRSEL.

> 
> 2.1 Problems with Default Address Selection for IPv6
> 
>    The Default Address Selection for IPv6 [ADDRSEL] 
> destination address
>    selection mechanism could save the application a few useless
>    connection attempts by placing the IPv4 addresses in front of the
>    IPv6 addresses.  This would be desired since all IPv6 
> destinations in
>    this scenario are unreachable (there's no route to them), and the
>    system's only IPv6 source address is inadequate to communicate with
>    off-link destinations even if it did have an off-link route.

Anyone who implements ADDRSEL should permit it to be configurable.  This
could be an additional configuration correct?  Thus problem solved right
?  But the default rules are up for debate again I think?

.
> 
> 2.2 Neighbor Discovery's On-Link Assumption Considered Harmful
> 
>    Let's assume that the application described in Section 2 is
>    attempting a connection to an IPv6 address first, either 
> because the
>    destination address selection mechanism described in Section 2.1
>    returned the addresses in that order, or because the application
>    isn't trying the addresses in the order returned.  Regardless, the
>    user expects that the application will quickly connect to the
>    destination.  It is therefore important that the system quickly
>    determine that the IPv6 destination is unreachable so that the
>    application can try the IPv4 destination.
> 
>    Neighbor Discovery's [ND] conceptual sending algorithm 
> dictates that
>    when sending a packet to a destination, if a host's default router
>    list is empty, then the host assumes that the destination 
> is on-link.

Note this is a conceptual algorithm not a standards requirement. This is
important to note to all.  I don't assume this at all fyi.

> 
>    For an IPv6 enabled host deployed on a network that has no IPv6
>    routers as is the case in this scenario, the result is that
>    link-layer address resolution must be performed on all 
> IPv6 addresses
>    to which the host sends packets.  The Application will not receive
>    acknowledgment of the unreachability of destinations that are not
>    on-link until at least address resolution has failed, which is no
>    less than three seconds (MAX_MULTICAST_SOLICIT * 
> RETRANS_TIMER), plus
>    any transport layer connection timeouts which could be 
> minutes in the
>    case of TCP.  The delay with respect to TCP is discussed later in
>    Section 2.3.

But what is your point here or just setting up assumptions?  If there is
not router on the link and one sends to send to global an implementation
should catch that and simply not send the packet.  Of course I advocate
smart hosts for v4 or v6 and don't agree with dumb hosts. The code to do
this is trivial even on sensor device with low real estate for the
stack.

> 
>    On a network that has no IPv6 routing and no IPv6 neighbors, making
>    the assumption that every IPv6 destination is on-link will be a
>    costly and incorrect assumption.  If an application has a list of
>    addresses associated with a destination and the first 15 are IPv6
>    addresses, then the application won't be able to 
> successfully send a
>    packet to the destination until the attempts to resolve each IPv6
>    address have failed (45 seconds), which could be compounded by any
>    transport timeouts associated with each connection attempt.

Same comment as above.  But it is good to document this and I don't
agree.  I guess to me this is common sense networking 101 or IPv6 for
dummies.  Maybe an IPv6 for Dummies book would be good to write to cover
many of these cases.  And vendors who don't protect users from this will
die anyway and may not even pass the IPv6 Logo requirements via the IPv6
Forum...............

> 
>    If IPv6 hosts don't assume that destinations are on-link 
> as described
>    above, then communication with destinations that are not 
> on-link and
>    unreachable will immediately fail.  The IPv6 
> implementation should be
>    able to immediately notify applications that it has no 
> route to such
>    IPv6 destinations, and applications won't waste time waiting for
>    address resolution to fail.
> 
>    If hosts need to communicate with on-link destinations, then then
>    they need to be explicitly configured to have on-link routes for
>    those destinations.

This is something I agree with but that will not fly in the IETF is my
input to you. Any smart implementation does this now.  To not do it is
stupid.  The prevailing view in the IETF is that hosts are stupid and
that is the first thing to fix and that is the IETF prevailing view that
hosts are stupid.  Nice theory but will not work in practice. Must have
been router vendors that pushed this view :--) (thats a joke).

> 
> 2.2.1 Other Problems with the On-Link Assumption
> 
>    The on-link assumption is problematic in ways not directly 
> related to
>    the scenario described, but they should still be briefly mentioned
>    here.
> 
>    One problem is that default routes are not special.  The on-link
>    assumption as stated in [ND] would have a host assume that all
>    destinations are on-link when its default router list is empty.
>    Clearly it shouldn't make this assumption if it has an 
> off-link route
>    that covers the destination and that route isn't a default route.
>    The absence of a default route does not mean that destinations are
>    not reachable through more specific routes.

I do not make that assumption if the onlink prefix is set is the only
time I assume that as code developer reading the spec.  That is bad read
of the specification and I don't see this assumption at all.  But I see
your point.

> 
>    Another problem is that the on-link assumption behavior is 
> undefined
>    on multi-homed hosts.  When such a host has no default 
> routers and it
>    is trying to reach a destination to which it has no route, 
> should it
>    try NUD on all interfaces at once?  Should it simply 
> realize that the
>    destination is unreachable?  The latter is the simplest solution.
>    Determining that a destination is unreachable when there 
> is no route
>    to that destination is the simple solution for all cases, not just
>    the multi-homed case.

Same comment as above.

> 
> 2.3 Transport Protocol Robustness
> 
>    Making the same set of assumptions as Section 2.2, 
> regardless of how
>    long the network layer takes to determine that the IPv6 destination
>    is unreachable, the delay associated with a connection 
> attempt to an
>    unreachable destination can be compounded by the transport 
> layer.  In
>    order for our application to quickly fail from an 
> unreachable address
>    to a potentially reachable one, the transport layer should 
> notify the
>    application by failing a connection attempt, or passing 
> ICMPv6 errors
>    up to the application, etc...

Nothing should go over IP layer in v4 or v6 that don't have a route if
not on link and mulltiple ways to test if node is onlink anyway in any
stack implementation.

> 3.1 IPv6 Network of Smaller Scope
> 
>    A network that has a smaller scope of connectivity for IPv6 as it
>    does for IPv4 could be a problem in some cases.  If 
> applications have
>    access to name to address mapping information that is of greater
>    scope than the connectivity to those addresses, there is obvious
>    potential for suboptimal network performance.  Hosts will 
> attempt to
>    communicate with IPv6 destinations that are outside the 
> scope of the
>    IPv6 routing, and depending on how the scope boundaries 
> are enforced,
>    applications may not be notified that packets are being dropped at
>    the scope boundary.

Clearly a low end IPv6 network in IPv4 cloud has to be configured
wisely.  Would it not be better to have INFO or BCP on configuring IPv6
in the particular cases you reference in this specification?

> 3.1.1 Alleviating the Scope Problem
> 
>    To allow applications to correctly fall back to IPv4 when IPv6
>    packets are destined beyond their allowed scope, the devices
>    enforcing the scope boundary should send ICMPv6 Destination
>    Unreachable messages back to senders of such packets.  The sender's
>    transport layer should act on these errors as described in Section
>    2.3.

This should be an entire draft and subject by itself IMO.  The scope is
to large to even be in a spec as just a paragraph and some minor text.
Needs its own draft. 

> 
> 3.2 Poor IPv6 Network Performance
> 
>    By default in dual stack nodes, applications will try IPv6
>    destinations first.  If the IPv6 connectivity to those destinations
>    is poor while the IPv4 connectivity is better (i.e., the 
> IPv6 traffic
>    experiences higher latency, lower throughput, or more lost packets
>    than IPv4 traffic), applications will still communicate 
> over IPv6 at
>    the expense of network performance.  There is no information
>    available to applications in this case to advise them to 
> try another
>    destination address.

But any good IPv6 implementation will give the user the option of
configuring these mechanisms over time with deployment.

> 3.2.1 Dealing with Poor IPv6 Network Performance
> 
>    There are few options from the end node's perspective.  One is to
>    configure each node to prefer IPv4 destinations over IPv6. 
>  If hosts
>    implement the Default Address Selection for IPv6 [ADDRSEL] policy
>    table, IPv4 mapped addresses could be assigned higher precedence,
>    resulting in applications trying IPv4 for communication first. This
>    has the negative side-effect that these nodes will almost never use
>    IPv6 unless the only address published in the DNS for a 
> given name is
>    IPv6, presumably because of this phenomenon.

This is my entire issue with ADDRSEL and why I do not advocate
implementing it at this time in pre-production or production IPv6
networks (fine for research test beds).  It is not baked yet and did not
consider all the issues this draft points to clearly.  I applaud this
draft bringing this out and we need to think about the effect of ADDRSEL
as a default too.  

I think this work can spawn at least 3 drafts (and more) that we need to
work on.

1. Configuring IPv6 nodes in variant IPv4 and IPv6 networks.
2. Things to watch out for when deploying IPv6.
3. Smart things IPv6 implementations should do when no IPv6 router
exists.

Good brainstorming on deployment issues too.

Thanks
/jim