Document review blast

"Elder, Alex" <[email protected]> Mon, 22 Dec 2003 11:44:48 -0800
Newsgroups gmane.ietf.zeroconf
Message-ID <[email protected]>
The following are comments on the ZEROCONF Working group Internet
Draft document, named "draft-ietf-zeroconf-ipv4-linklocal-10.txt".

I recently corresponded directly with Erik Guttman, who suggested that
(after reviewing the latest draft and issues list and mail list archive)
I submit my comments and let them be hashed out by the group.  Some
of the following is also related to earlier correspondence I had
with Stuart Cheshire regarding address conflict detection.

I have broken my comments into three general groups:
	- General. Overall impressions
	- Technical. Suggestions/observations related to technical
details
	- Editorial. More alolng the lines of rewording suggestions,
etc.

Within the technical area, I have grouped my comments into four
subgroups:
	- Parameterization. I think the document would benefit from more
	  explicitly stating some parameters to the algorithms, even if
	  those parameter values are expected to never change
	- Probing intervals.  Yes, I dare to suggest changes to the
	  underlying protocol, despite the recent flurry of discussion
	  about "Aggressive Time-outs" (my suggestion is even more
        aggressive).
	- Multiple interfaces.
	- Other clarifications.

I don't expect to be able to participate very fully in this group, but
felt that my observations based on my recent work with the Link-Local
and address conflict detection stuff might be worth sharing.  I will
be happy to answer questions about the content of this message though.

							- Alex Elder
	
[email protected]

General
-------
- There is a huge amount of overlap between this document and the
  document "draft-cheshire-ipv4-acd.txt" which covers the more general
  problem of address conflict detection.  It would be nice if the two
  jobs (LL address selection and general conflict detection) could be
  more clearly separated, to avoid the redundancy.  The obvious problem
  with this redundancy is keeping both documents mutually consistent,
  and already details of the content of the two documents are diverging
in
  places where they should be the same.  (Example: ACD document
indicates
  specifically that the host can begin using a claimed IP address
*after*
  it sends out an announcement packet, while the LL document currently
  doesn't say this quite so specifically.)

- (Related to issues 30, 39.)  Generally, this document talks about
  support for multiple interfaces, but doesn't cover it very uniformly.
  As an example, In section 2.2.1, 4th paragraph, it's mentioned that
any
  ARP packet received which has a sender IP address matching the probe
  address indicates a conflict.  In fact, I think that should state
  that any such ARP packet received *on any of the host's interfaces*
  indicates a conflict.

Technical Feedback
------------------

a) Parameterization

- Section 2.2.1, last paragraph.  The value "10" for the number of
  collisions during the probe cycle is clearly arbitrary.  That's OK,
  but I suggest it be called out with an explicit parameter name rather
  than fixing it in stone in the text (even if in reality it is fixed
  in stone).

- Section 2.2.1, last paragraph.  Similarly, the "1 address probe
  attempt per minute" is another arbitrary selection, and there too I
  suggest this rate be defined as a named parameter, even if it ends
  up being a permanently fixed parameter.  (This one, more than the
  "10" value just mentioned, seems like it might worthy of scaling
  based on characteristics of the underlying medium someday.)

- Section 2.5, paragraph (b).  The value *ten seconds* for the
  period over which a previous ARP message should be considered "recent"
  is arbitrary.  As I have suggested for other things above, I think
  this should be defined by an explicit parameter rather than fixing it
  permanently in the text (even if its value is permanently fixed).

- All of these parameters, their values, and their meanings, should
  be explicitly listed in section 9, Constants.

b) Probing Intervals (related to issues 31, 37)

- Section 2.2.1, third paragraph. What is the purpose of delaying
  *at least* PROBE_MIN (= 1 second) *before* anything ever gets started?
  The initial delay should range from 0..<something>, not from
  <something>..<something greater>; the extra initial delay is just a
  waste of time.

- Section 2.2.1, third paragraph.  What is the benefit of having
  the delays between probes be random?  Isn't it sufficient for the
  initial delay to be random, followed by a fixed, as-small-as-possible
  (presumably PROBE_MIN) delay between probes?  I don't know that the
  subsequent random delays really improve anything with respect to
  simultaneous probes that an initial random delay wouldn't already
  mitigate.  So the suggestion is use a fixed minimum inter-probe delay
  rather than randomizing it.

- If the previous two suggestions were implemented, the range of time
  required for a successful claim of an unused address (using
PROBE_MIN=1
  and PROBE_MAX=2) could be cut about in half, changing from 4-8 seconds
  (+ 2 seconds between announcements) down to 3-4 seconds (+ 1 second
  between announcements).  (This would need to be reflected in the text
  in section 2.3.)

- Section 2.2.1, third paragraph.  I think the range of the random
  initial delay needs not to be dependent on the inter-probe delay.
  The purpose of the inter-probe delay (as I understand it) is to ensure
  at least one probe has a chance of not being lost as a result of a
known
  design constraint (which has to do with details of the 802.3 spanning
  tree protocol[?]).  The purpose of the initial randomness is to avoid
  a flood of simultaneous probes occurring in lock-step due to, e.g.,
  sudden power-on of a whole network link full of interfaces.  I suggest
  the initial delay be a parameter separate from the inter-probe delay
  (currently defined by PROBE_MIN and PROBE_MAX).  Whether it should be
  shorter or longer than PROBE_MIN or PROBE_MAX I can't answer at this
  point.

- Section 2.2.1, fourth paragraph.  If all inter-probe delays were
  PROBE_MIN (rather than the range PROBE_MIN to PROBE_MAX), I think
  the delay following the last probe and the first announcement can be
  reduced to PROBE_MIN as well.

So I guess my proposal would be something like:
	delay(random(0..INITIAL_DELAY=1 second))
	send_arp_probe(addr)           \___ repeat PROBE_COUNT=3 times
	delay(PROBE_DELAY=1 second)    /
	send_arp_annoucement(addr)     \___ repeat ANNOUNCE_COUNT=2
times
	delay(ANNOUNCE_DELAY=1 second) /    (but skip delay after the
last)

c) Multiple interfaces

- Section 2.2.1, fourth paragraph.  Do *all* interfaces on a host
  need to be monitored for ARP's indicating an address for *any/all*
  of the host's interfaces (and defend the other interface IP's when
  a conflict is seen)?  I think they do, to avoid address ambiguity.
  I.e., it shouldn't be acceptable for a host's eth1 to have the same
  LL address as a different interface reachable via that host's eth0.

- Perhaps related, should ARP probes, announcements, and defense
  announcements go out over *all* of a host's interfaces?  (I think
  so.)  Should defense packets go out only on the interface that
  received an ARP packet indicating a conflict (I think so); or on
  the interface whose LL IP conflicts (I think not); or on both, or
  on all interfaces?

- Section 2.5, first paragraph (related to issue 15). I don't understand
  why the probe case differs from the ongoing monitoring case with
  respect to the 'sender hardware address' field in a received ARP.
  While probing, an ARP containing a 'sender IP address' in conflict
with
  the probe address is considered a conflict irrespective of the sender
  hardware address.  But in the ongoing monitoring case only such ARP's
  for which the sender hardware address is not one of the host's own are
  considered indicative of conflict.  It seems to me they should both
  only "care" if the packet originates from a different host (i.e., the
  probe case should be just as specific as the ongoing monitoring case).
  Is this just to support of the idea of multiple interfaces on a host
  being handled independently (i.e., each having no knowledge of any
  other's address configuration state?)

- Section 2.5, first paragraph.  Again, I think the host probably
  needs to be monitoring *all* of its interfaces for conflicts indicated
  for *any* of its own Link-Local addresses.  So this section should
  state that "At any time, if a host receives an ARP packet (request
*or*
  reply) ***on any of its interfaces*** where the ..."

d) Other clarifications

- A situation could arise that is not currently addressed by the
  specification.  It is conceivable that a pathological rogue host
  only answers the ARP *announcements*, not the *probes*, in which
  case addresses could be claimed, then immediately (after a defense
  announcement) given up, restarting the process indefinitely, with
  no throttle action such as what exists for repeated conflicts during
  the probing phase.  Mitigating this probably requires a separate
  counter or timer that tracks how recently or how frequently *claimed*
  (not just probed) addresses are lost.

- Last paragraph of section 2.1.  When should an address be saved
  to persistent storage?  I believe it should occur only after an
  address has been successfully claimed.  The text is not so specific,
  allowing (for example) a newly selected but not yet probed address to
  be saved to persistent storage.  This difference may not matter much
  in the end, but my suggested approach could avoid some unnecessary
  saves of the information, and adds a bit of increased value to the
  address saved (i.e., not only is it an address that has been selected,
  but it's known to have been "good" at one time).

- Section 2.2.1, fourth paragraph.  It is not clear what constitutes
  "the beginning of the probing process".  I believe the probing process
  begins at the moment the initial random delay begins.  But as worded,
  it could be interpreted as, for example, beginning when the first
  probe packet is sent out.

- Section 2.2.1, fifth paragraph.  It is not clear from the
  specification at what point the failed address claim attempt counter
  gets reset to zero.  I believe it should be reset whenever an address
  gets claimed (i.e., at the point at which the first address
announcement
  gets sent).  If it isn't reset, then having "trouble" acquiring an
  address once will penalize all future attempts to acquire a new
address
  in the face of a post-claim collision.

- Section 2.2.1, last paragraph.  This paragraph indicates that
  "the host has successfully claimed the desired Link-Local IPv4
address"
  after PROBE_MAX after the last probe.  A separate draft standard
  (on address conflict detection) says more explicitly that the host
  can begin using the address once the host had sent out the first
  ARP announcement.  The part about when the host can begin using the
  address should be stated explicitly.  And the discrepancy between the
  two documents should be resolved (one way or another).

- Section 2.4, last paragraph.  This comment is really a set of
  questions, I guess rhetorical.  Why is the period between
announcements
  PROBE_MAX?  Why can't it be PROBE_MIN (is it because the maximum
  inter-probe delay is PROBE_MAX)?  Does this delay have anything to
  do with spanning tree protocol?  If not, does it have to be tied to
  PROBE_MAX or is that just an arbitrary way of reusing an existing
  parameter of the specification?  Why is this value *not* scaled by the
  shorter timeouts?  Perhaps the document could at least attempt to give
  some answers to these kinds of questions, maybe in an appendix.

- Section 2.5, paragraph (b).  It think it may be important to
  distinguish more precisely what the differences (and similarities) are
  between what happens when an interface using a LL address is shut down
  and reconfigured due to a repeated collision, and when an interface
  using a LL address is shut down to reconfigure it with a routable
  address as mentioned in section 1.7.  One difference I note is that in
  the LL->routable case the "host SHOULD continue to use the Link-Local
  IPv4 address for communications underway" while in the LL->LL case it
  "MUST immediately cease using this address."

Editorial Feedback
------------------

- The abstract, and subsequent sections repeatedly use the phrase
  "physical (or logical) link" without really describing why it is
spelled
  out this way until later.  Section 1.2 defines the phrase "on the same
  link" but never says anything about the "physical (or logical)" part.
  Suggest using something less awkward, such as "network link" until
  the more precise definition is provided.

- Abstract, second paragraph, as well as end of paragraph in section
  1.4 at the top of page 4.  The statement is made that "This document
  does not recommend that Link Local IPv4 addresses and routable
  addresses be configured simultaneously on the same interface."  Is it
  intentional to not go so far as "recommends not to" rather than "does
  not recommend?"  It's a subtle difference; maybe this phraseology is
  normal for this type of document.

- Section 1.3, last line of page 4.  Does "round-trip latency" have
  a well-defined meaning?  I know what I think is meant (i.e., twice the
  maximum time it takes for data to travel between a pair of interfaces
  on the medium), I just wondered whether "round-trip latency of at most
  one second" has the same sort of precision as "data rates of at least
  1 Mbps," for example.

- Section 1.3, top of page 5.  The sentence starting with "Link layer
  technologies..." is phrased in such a way that it seems to conflict
  the earlier statement that this specification only applies to certain
  technologies.  Suggest rewording something more like:
      "This specification could also apply to link-layer technologies
      that support ARP but operate at rates below 1 Mbps or latencies
      above one second, if different values are specified for one or
      more of the following parameters described in sections 2.2, 2.3,
      and 2.4:" ...

- Section 1.3, top of page 5.  Suggest mentioning the names of the
  parameters described here (e.g., PROBE_MIN and PROBE_MAX).  Also, some
  (most?) of these haven't been given formal names, and in those cases
  I recommend names get assigned.

- Section 1.3, top of page 5.  Other values that could be called out
  as parameters of the specification (these should probably be
considered
  technical feedback as well):
    - number of consecutive unsuccessful addresses probed before
      limiting the rate of subsequent address probes (currently 10)
    - Rate at which probes occur after that point (currently no
      more than one probe per 60 seconds)
    - Definition of "recent" with respect to defending an address.
      That is, the time period between receipt of ARP packets that
      indicate an address conflict, such that if the second arrives
      less than that time after the first the interface stops using
      its address, but greater than that time it continues using it.
      (See section 2.5(b).)  (currently 10 seconds)

- Last paragraph in section 1.3.  (Related to issue 22)  The specificity
  of the value "1300" here seems strange, at least in the way it gets
  presented.  What's seems to be happening is that an arbitrary
  threshold of 2% is being chosen as reasonable, in other words, getting
  an address the first try 98% of the time is acceptable.  Out of this
  comes the precise sounding number 1300 (i.e., 2% of a 65024 addresses
  in the IPv4 Link-Local range) as a point where network operators
  should consider partitioning their network. (In fact, they should have
  considered this long before then...) I don't have a suggested
  rewording for you, I'm just making note of the fact that it didn't
  read well.

- Section 1.7, second paragraph.  It may be possible to reword
  this so it's more clear you're talking about configuring BOTH a
routable
  AND a Link-Local address on the same interface at the same time.  As
it
  is it could be interpreted as maybe reconfiguring an interface that
has
  a routable address with a link local one instead (i.e., in its place).

- Section 2.2.1, third paragraph.  PROBE_MIN and PROBE_MAX are
  used here without any prior introduction.  Suggest introducing them
  earlier in the document (such as in section 1.3, when some parameters
  of the specification are first mentioned), or at least earlier in
  this section.

- Section 2.2.1, fourth paragraph.  The term "address collision" is
  first used here.  I know it's interchangeable with "address conflict"
  (which was first used in section 1.3).  However, I recommend a single
  term be consistently throughout the document.  I would recommend using
  "conflict," given the historical significance of the term "collision"
  in the Ethernet world.  I also would try to define the term in such
  a way that it includes the condition of finding an address being
  probed already in use by another interface, as well as an when an
  already-claimed address is found to be in use.  This way a common term
  would be meaningful in both sections of the document to mean, more or
  less, that an address you're concerned with is in use by another host.

- Section 2.3.  This whole section was obviously not updated
  at the time the PROBE_MIN and PROBE_MAX concepts were added earlier
  in the document.  The section should be reconsidered in its entirety
  so I won't really give much suggestion how to rewrite it.  But I will
  point out that the 8-10 seconds is now wrong given the assumed values
  of PROBE_MIN and PROBE_MAX and the number of probes now specified.

- Section 2.3.  It would be nice to have a more specific reference
  that explains (or refers to an explanation of) why 802.1d STP "often
  silently discard[s] all packets for several seconds."

- Section 2.5, first paragraph.  This section is only talking
  about a host's *link local* addresses, and should specify that.
  Specifically, near the middle it says "where the 'sender IP address'
  is the host's own IP address, but..." and it should read something
  more like "where the 'sender IP address' is one of the host's own IPv4
  Link-Local addresses, but...".

- Section 2.5, paragraph (b), second-to-last sentence.  Replace
  "as described above" with "using the process described in sections
  2.2 and 2.4, above" to be more clear about what is being referred to.