1. Steps 1 and 2 look to me like "inside sausage factory", aka:
   trying to reverse engineer the justification for some sane service 
descriptions
   from past IETF work and real implementation knowledge on the side. I think
   it would be lovely if Step 3 could end up as a separte document thats used
   going forward, and 1.1 are for folks in historic interest (aka: separate 
them out).

   But i am sure there is all type of important IETF/TAPS reasoning why this is
   not desirable ;-)

2. Unless i am overlooking something, pass 2 and 3 do not define weell enough 
how
   the transport service endpoints work (aka: what we call sockets in BSD, but
   that really work the same logically in all OS, even those that tried not to 
call them
   sockets). And it would make the transport service description pretty useless 
if
   that was not made clearer.

    Eg: Consider someone used the transport service definitions of this drat 
randomnly,
    there is no way to figure out which would or would not succeed, because 
there is
    no definition how send/received packets are associated to transport service 
endpoints.

    Example: LISTEN.UDP:
          Pass 1 primitive: 'receive'.
          Parameters: 1 local IP address (optional); 1 destination transport 
address.
    
    If you really mean to say destination (remote) transport address, then
    this is not the listen() of the socket API, and i would not know how this
    listen would work, eg: what would happen if multiple parallel calls to this
    are made by competing apps on the same host. 

    Demultiplexing protocol (UDP) packes is obviously the key part of the 
transport service.

One approach would be to define a transport service endpoint as a packet
signature that is "owned" by this transport service endpoint:

  (LocalIP,LocalPort,Porto,DstIP,DstPort)

A "server" transport service endpoint owns (LocalIP,LocalPort,Proto*,*). This
is what you get when you do socket(Proto), bind(LocalIP,LocalPort). This could
be represented in the API as BIND(LocalAddr,LocalPort). Details here include:

- LocalAddr can be one explicit address or ANY{-AF}
  ANY{-AF} is lready quite egregious in existing socket APIs, 0.0.0.0 indicates
  only AF=IPv4 ANY, whereas :: indicates IPv4 and IPv6 ANY (AFAIK).

- LocalPort = ANY means you do get an allocation of a "free" port. Which means
  that you need some API call OR a return value showing the actually LocalPort.

  Indeed, if we wanted to define a good API, wee wanted to have some
  ANY-Range{MIN..MAX} parameter option given how we (IETF) have defined UDP
  port ranges with specific semantics.

So, The BIND API call has success/failure critera that can also be detailled.

I can do SEND/RECEIVE on this communications endpoint, this is probably what
we'd call the "unconnected" mode.

Of course there is the CONNECT paradigm for connected sockets. IMHO, it is
also crucial to worry about the local port in the API. In your writeup it looks
like you only consider that the local port is automatically assigned implicit
by CONNECT. Which is fine in many cases, but not if you want some upfront 
signaling
like ICE. In those cases, you do a BIND first to know your local port and then
do some signaling... And maybe later you do a CONNECT .

In another mail thread you asked about reraching out to ART. IMHO, a crucial 
aspect
for the application folks is the demultiplexing model. Without defining what
packets a transport endpoint has ownership of, all bets are off. Eg: If i
just had a 5-tuple ownership model, i do not own a local port, so i would have
to potentially redo a signaling that expects local port ownership for every
connection, because i could not necessarily get to every remote site with my
local port, because some other app may have it.

3. Having lamented on the above: The socket APIs are pretty good with all of the
above, i am just worried about making sure we actually capture it in our IETF
specs. BUT: The socket APIs IMHO do quite well suck on doing the same for IP
multicast. Aka: For unicast, the packet signature is well embodied in the 
socket,
aka: a socket has the right options of packet ownerships (non-connected, 
connected).
For IP multicast, that concept does not exist well, and it would be lovely if
we could have an API definition that introduces the same level of ownership.

Eg: Socket ownership is always around local port or 5-tuple connection. Which
is just the granularity useful in unicast. In IP multicast it does not make
sense. If i am application A with eg: (S,G) traffic over Port P1, i do certainly
not want some other application B to also use (S,G) traffic over port P2: In
the network, we would now get traffic for A go to all receivers of B and vice
versa. Aka: its an attack vector, albeit in most cases not intentional but by
stupidity of address selection.

So, for IP multicast, you really want to BIND (own) to (RemoteAddr) - not
Port, not Proto - for ASM, and to (LocalAddr,RemoteAddr) for SSM. And of course
in IPv6 the permissible binding could be derived from RemoteAddr (indicates ASM 
or SSM).

Now, of course, this does not help me for App B on another host to mess up
my multicast traffic trees, but the whole point is about creating a transport
service definition that is IMHO as good and logical as possible for the service
as we can make it, and right now, the APIs are really 30 years developed and
pretty good for unicast, but multicast is just an afterthought, and quite 
illogical
by just following the unicast API model and adding some *yuck* setsockopts.

Cheers
    toerless



_______________________________________________
Taps mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/taps

Reply via email to