[udp-encap rev2] discussion/comments

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Please find below the transcript of a discussion I sent to Gorry regarding
revision 2 of the udp-encap draft. 

As per Gorry's comments, I may have missed parts of the discussion, so please
ignore or correct where I am erring.

The main point I did not understand is whether the aim is to 
 * encapsulate DCCP as a user-space protocol or
 * encapsulate DCCP as an in-kernel protocol?

If the latter is the main aim, then it would be great not to make changes to
the encapsulated data (DCCP header + DCCP payload), since this would require
a separate implementation for generating the DCCP-UDP payload data.

Even if the DCCP checksum should break as a result of NAT-ing some of the
IP adresses - the DCCP checksum can easily be recomputed at the UDP endpoint.


General questions and remarks
=============================
  a. It would be good to specify how UDP ICMP errors are translated into DCCP
     semantics, in particular the "administratively prohibited" variants of
     Destination Unreachable (RFC 1122, 3.2.2.1), and how these options are
     to be passed on to UDP.

GF>  Agree, something is needed to specify at the sender to say the procedure for generating errors
and processing then at the receiver.

  b. Are network-layer options (e.g. setting TOS) which may be set with DCCP-STD
     simply to be transferred to DCCP-UDP (same question for PMTUD - is the
     DCCP-UDP MTU the same the UDP_MTU - 8 ?).

  c. Why does there need to be an IANA-assigned default port for DCCP
     encapsulation? The benefit of a well-known for current-generation NAT boxes
     is not clear (it would not help NAT traversal). For future-generation NAT
     boxes might give the wrong impression to implementors that DCCP-UDP is the
     only feasible way of supporting DCCP.
     For out-of-band signalling SDP has already been specified by the document.

GF>  This is debatable - I can see pros and cons, at the moment I'd favour using
a well known port. The document should say WHY the method is chosen.

  d. The document specifies that both endpoints shall be listening on the given
     UDP port, while DCCP distinguishes active and passive (client/server) parts
     of the connection. I wonder whether it is necessary or would be good to
     inform about which side is the active one in the SDP protocol, since how
     shall the endpoint otherwise know what to do with the UDP tunnel? If both
     endpoints listen, nothing happens, if both connect there is simultaneous
     open (discussed in RFC 5596).

GF>  This, to me, refers to both stacks at the hosts, rather than per-socket connection
endpoints. I agree the wording should better.


  e. I can see no point for the extra rule that DCCP packets contained in UDP
     encapsulation should not have their own checksums. First it alters and
     restricts the use of DCCP so that encapsulated DCCP behaves differently
     from unencapsulated DCCP. Second, it makes the specification more complicated,
     by adding exceptions. Furthermore, the Internet checksum is cheap to compute,
     the other endpoint is known (and hence pseudo-header is already implicit).
     The restriction of not being able to use partial checksums limits usability
     if e.g. DCCP-UDP is employed on a path where on the "last mile" partial
     checksums are of interest (e.g. wireless links). It is also conceivable
     that there may be a "tunneling server" which transparently wraps DCCP in UDP;
     for such mode of operation it could simply just prepend the 8 bytes of header,
     checksum the resulting packet, no need to alter its payload. The peering
     endpoint would strip off the UDP header and could forward the enclosed DCCP
     datagram without having to peek into the packet in order to recompute the
     checksum. Hence the recommendation is to keep DCCP as originally specified
     in DCCP, and to not introduce extra checksumming rules.

GF>  This comes from the NAT behaviour where the module modifies the IP (and port
values for NAPT) of the outer headers. The encaps document doesn't say how
this works, and I expect a NAPT would re-write the "emphemeral" port anyway.
So, I am guessing the encaps receiver should bind to ANY src port and the
standard DCCP_UDP dst port by default. The document should say WHY the method was chosen.

Abstract
--------
  * the term 'alternative' encapsulation is a bit misleading, since there is
    alternative, both DCCP-STD and DCCP-UDP are encapsulated in IPv4/6 headers;
  * it would be clearer to refer to the technique as something like "DCCP-in-UDP"
  * "without modification of those middleboxes"
    =>  suggest e.g. 'modification of their software stacks' since "middleboxes"
       otherwise is repeated in the same sentence

1. Introduction
---------------
  * 'According to [RFC 4340], DCCP packets are directly encapsulated ...'
    =>  this is clear from the definition of transport protocol, could be omitted

GF>  I disagree: This was instead in the last review, to make clear the NORMAL
behaviour was standard RFC 4340 encaps.

  * 'For convenience, the [RFC 4340] encapsulation (updated by [RFC 5596])'
    =>  as above, perhaps one could refer to RFC 4340 as "native packetization of
       DCCP within IP" or something similar;
    =>  the remark that RFC 4340 is updated by RFC 5596 is not relevant, referencing
       it would only make sense if there were discussion comparing the pros and cons
       of the two approaches, which does not seem to be the aim of this specification.
       Since this document introduces a fix for current-generation NAT devices, it
       could e.g. be said that current generation NAT devices also do not support
       RFC 5596 (hopefully Linux will soon), or the RFC reference could be dropped.

>  I recommended adding this: The rationale was we need to be able to transition
firewalls AND NATs and the same behaviour can not be expected at all middleboxes.
Therefore, I argued that the encaps MUST support both RFC 4340 and the extension
in 5596 to allow it to operate in the wild, especially with multiple NATs/Firewalls.

  * "The DCCP-UDP encapsulation specified here supports all of the features
    contained in DCCP-STD except for partial checksums."
    =>  Please see (e) above, it would be best not to introduce new assumptions
       about DCCP and support the checksum by treating the encapsulated packet
       as opaque payload data of UDP. This would not restrict application scenarios
       ("sorry you can't use partial checksums because we are tunneling you").

GF>  The intention was to allow applications to use the same partial-checksum code,
but they wouldn't get benefit with UDP encaps. If they were to use UDP-Lite encaps
they would, but that is a corner case...


3. DCCP-UDP
-----------
  * "(default port awaiting IANA action)"
    sorry I don't understand why it is necessary to define a default port?
  * "The basic format of a DCCP-UDP packet is"
    =>  Drawing could perhaps be simplified by referring from 'DCCP Generic
       Header' downwards simply as "DCCP packet, possibly with header options,
       as specified in RFC 4340, section 5".

  * section 3.1, "(normally both are the default port to be assigned by IANA)"
    =>  meaning that 'Source Port' == 'Dest Port'?
    =>  again, please, I don't understand why a default port is required?

  * Checksum:
    - the specification (reference) of the UDP pseudo-header is missing;
    - as per (e) above it is better not to introduce assumptions about the
      contained payload, which would also simplify the specification, i.e.
      * checksums are to be used and computed as specified in RFC 4340,
      * the DCCP pseudo-header uses the DCCP port numbers and the UDP
        endpoint IP addresses (i.e. from the point of DCCP the encapsulating
        UDP header does not exist);
      * the DCCP-UDPv4 checksum computation then proceeds according to
        RFC 768 with the UDP checksum field set to zero and using as
        UDP length the length of the contained DCCP packet including the
        DCCP header and DCCP header options;
      * the DCCP-UDPv6 checksum computation uses the pseudo-header
        from RFC 2460, 8.1 with the Upper-Layer packet length set to the
        length of the contained DCCP packet including the DCCP header and
        options.

  * section 3.2 could be omitted, since this is already specified in
    RFC 4340 and as far as I understand the inner DCCP packet semantics
    are opaque for the purpose of NAT traversal;

  * section 3.3, checksum computation
    - as per (e) above, this section could be omitted
    - with regard to checksum validity it could be simplified by
      referring validate DCCP-UDP packets according to RFC 768, with
      the restriction that the checksum MUST NOT be disabled (zero csum)
    - (The term 'DCCP-NAT' has not been introduced in this document.)

  * section 3.3.1
    - s/Chesksums/Checksums/
    - same comment as per (e), section could be omitted

  * section 3.5
    - would be good to clarify the use of UDP fragmentation:
      UDP implementations support fragmentation, UDPv6 in addition supports
      jumbograms (RFC 2675), hence need clarification whether to
      a) bump the maximum inner MTU of DCCP to exploit the limits of UDP or
      b) completely disallow fragmentation of DCCP-UDP packets (since possibly
         not supported by hardware)
    - how shall section 14 of RFC 4340 be interpreted in this context:
      * is DCCP's MPS simply the UDP PMTU minus 8?
      * apply RFC 5405 for UDP MTU fallback values?

  * section 3.6
    I don't understand the purpose of specifying the service code of an
    encapsulated protocol. Service code and encapsulation seem not related,
    a connection could have any service-code value and still need UDP
    encapsulation, but why not leaving this transparent to DCCP?
    In particular, if assuming a "DCCP tunnelling service" or a type of
    overlay network, it would be difficult to alter the contained service
    code. Also, like the checksums, this again introduces new assumptions
    into DCCP and complicates the specification. My personal view is to
    allow DCCP to pick whatever service code is appropriate for the type
    of service used, and not to add additional rules restricting this use
    because the protocol ends up being "tunneled".


5. Signaling the Use of DCCP-UDP
--------------------------------
  * "listening for DCCP-UDP connections on the indicated UDP port (if
    udp-port-num is included)
    -->  suggest to make the use of `udp-port-num' mandatory ('MUST') and
        not to require an IANA-assigned well-known port

GF>  Don't agree.

7. IANA Considerations
----------------------
  * same comment as earlier, perhaps I am missing something, but I fail
    to see the need for a default well-known port for DCCP encapsulation




[Index of Archives]     [Linux Kernel Development]     [Linux DCCP]     [IETF Annouce]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [DDR & Rambus]

  Powered by Linux