Re: [Taps] Review of draft-trammell-taps-post-sockets-03

Tommy Pauly <tpauly@apple.com> Mon, 13 November 2017 00:07 UTC

Return-Path: <tpauly@apple.com>
X-Original-To: taps@ietfa.amsl.com
Delivered-To: taps@ietfa.amsl.com
Received: from localhost (localhost [127.0.0.1]) by ietfa.amsl.com (Postfix) with ESMTP id BEBA4126C25 for <taps@ietfa.amsl.com>; Sun, 12 Nov 2017 16:07:29 -0800 (PST)
X-Virus-Scanned: amavisd-new at amsl.com
X-Spam-Flag: NO
X-Spam-Score: -4.3
X-Spam-Level:
X-Spam-Status: No, score=-4.3 tagged_above=-999 required=5 tests=[BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HTML_MESSAGE=0.001, RCVD_IN_DNSWL_MED=-2.3, SPF_PASS=-0.001] autolearn=ham autolearn_force=no
Authentication-Results: ietfa.amsl.com (amavisd-new); dkim=pass (2048-bit key) header.d=apple.com
Received: from mail.ietf.org ([4.31.198.44]) by localhost (ietfa.amsl.com [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id rv1kgp7GdcSb for <taps@ietfa.amsl.com>; Sun, 12 Nov 2017 16:07:28 -0800 (PST)
Received: from mail-in1.asia.apple.com (mail-out.asia.apple.com [17.82.254.63]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ietfa.amsl.com (Postfix) with ESMTPS id 6A5341200C5 for <taps@ietf.org>; Sun, 12 Nov 2017 16:07:27 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; d=apple.com; s=mailout2048s; c=relaxed/simple; q=dns/txt; i=@apple.com; t=1510531645; h=From:Sender:Reply-To:Subject:Date:Message-id:To:Cc:MIME-version:Content-type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-reply-to:References:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=aVegTsdvXB8yKJ2j8YXj9bwYdLOEVvsMIWH5ZPBZMr8=; b=oeEj8EWhHRSe/Lb91cRT/6jrGS3dQ5N+dcoJCICJhQBgUClxTSw1ZPuBQDHQCRF7 pZTF7fGOJaimTkR6hZCKN8O3lZXTPxUzB6NN8hZVjwlkPYaje7Z2BJG+ZpJOdIi7 cPw2KJOdykqSWbuCDlGszspvUauGXnriwJtSpTobsz8ZWqHpBhuZeQQFrRPiGaQZ gqilaPCe9/x/2KBKvnXQoGHywUoNWrmfH+zlvTm7mjxbkxXpkbszB2mFRlnW3Cfo hIfIPGY8gUCrLha3o4MwDVBdmo/XkqdC1SVWQG/rHUFa5dQ7qOPUQIoiHIfbKppe IHzPne3gIaE1H3j3q5BpQw==;
Received: from relay2.asia.apple.com ( [17.82.200.16]) (using TLS with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mail-in1.asia.apple.com (Apple Singapore Mail Gateway) with SMTP id 21.93.07591.D32E80A5; Mon, 13 Nov 2017 08:07:25 +0800 (MYT)
X-AuditID: 1152fe11-8b3ff70000001da7-b2-5a08e23da9b4
Received: from echium.asia.apple.com ( [17.84.80.65]) by relay2.asia.apple.com (Apple Singapore relay) with SMTP id E5.FC.31851.D32E80A5; Mon, 13 Nov 2017 08:07:25 +0800 (MYT)
MIME-version: 1.0
Content-type: multipart/alternative; boundary="Boundary_(ID_MhHKMV8zJ59LeOanbVQlPA)"
Received: from [17.235.154.204] by echium.asia.apple.com (Oracle Communications Messaging Server 8.0.1.3.20170825 64bit (built Aug 25 2017)) with ESMTPSA id <0OZB0053TXOCLE60@echium.asia.apple.com>; Mon, 13 Nov 2017 08:07:25 +0800 (SGT)
Sender: tpauly@apple.com
From: Tommy Pauly <tpauly@apple.com>
Message-id: <9E765BA0-5A2A-47CD-A13F-1ED379F235EB@apple.com>
Date: Mon, 13 Nov 2017 08:07:24 +0800
In-reply-to: <B543F7E4-2327-4CAE-8707-0F61BE6DD655@ifi.uio.no>
Cc: "taps@ietf.org" <taps@ietf.org>
To: Michael Welzl <michawe@ifi.uio.no>
References: <CF0546DA-422B-4AA3-A593-1BC133AD730D@ifi.uio.no> <A19AC4F5-1A56-4F9B-A5C2-3643CD57FBC1@apple.com> <7F6D4FB0-3D41-4E06-BD11-54D897FA5345@ifi.uio.no> <3702C080-9EEA-441C-96C3-5A2A1FCC7ABA@apple.com> <B543F7E4-2327-4CAE-8707-0F61BE6DD655@ifi.uio.no>
X-Mailer: Apple Mail (2.3445.5.5)
X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrMLMWRmVeSWpSXmKPExsUiGHRCQNf2EUeUwc/lqhY/zu5ktbgT48Dk sWTJTyaP1asfMgcwRXHZpKTmZJalFunbJXBlPJv8m61g2gfGiokXetgaGC+eYOxi5OSQEDCR eHrgLXMXIxeHkMBKJokJa9awwiT6prcwQiQ2MkrMP/qVBSTBKyAo8WPyPTCbWSBM4uH0uVBF nxglvm2aCdTNwSEsICGxeU8iSA2bgIrE8W8bmCF6bSQ6Lx9kB7GFBRwlzn+YwghSziKgKtE+ gwMkzClgJ3F11TxWiPHKEo9nNYKtEhFQkzixfDUbxKpuJolfO3eyQxyqKPFwUxcrSEJCYAGb xKUP0xgnMArNQnLrLCS3zgLaxyygLjFlSi5EWFviybsLrBC2msTC34uYkMUXMLKtYhTPTczM 0c3MM9RLLM5M1EssKMhJ1UvOz93ECI6Kf4I7GKcuNDzEKMDBqMTDK3ycI0qINbGsuDL3EKME B7OSCO+R+0Ah3pTEyqrUovz4otKc1OJDjNIcLErivH2RnyKFBNITS1KzU1MLUotgskwcnFIN jAHXFyRH2E+0XrEo4umP7ffrV2i/aM5rM2a+YRIz2aKwbFZgwa6G7Q0FHAb7z/sdrra0ibkR fDBPNVA6UO27ofVWvkY55sN7Tlddt9MKSzmrUbi0f+7Txxkukg1tPtzftil/Xii55ffGt/+W VPhvnMK06FXm9YAb3q4GXyalfvypqlmydlbzDyWW4oxEQy3mouJEAF45uL2GAgAA
X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrNLMWRmVeSWpSXmKPExsUiGBLgqGv7iCPK4P19KYsfZ3eyWtyJcWDy WLLkJ5PH6tUPmQOYorhsUlJzMstSi/TtErgynk3+zVYw7QNjxcQLPWwNjBdPMHYxcnJICJhI 9E1vAbK5OIQENjJKzD/6lQUkwSsgKPFj8j0wm1kgTOLh9LlQRZ8YJb5tmsnaxcjBISwgIbF5 TyJIDZuAisTxbxuYIXptJDovH2QHsYUFHCXOf5jCCFLOIqAq0T6DAyTMKWAncXXVPFaI8coS j2c1gq0SEVCTOLF8NRvEqm4miV87d7JDHKoo8XBTF+sERv5ZSM6bheS8WUArmAXUJaZMyYUI a0s8eXeBFcJWk1j4exETsvgCRrZVjKJFqTmJlUZ6icWZiXqJBQU5qXrJ+bmbGEFBHHRCYAfj rEMGhxgFOBiVeHgZj3NECbEmlhVX5h5ilOBgVhLhPXIfKMSbklhZlVqUH19UmpNafIhRmoNF SZxXM+pTpJBAemJJanZqakFqEUyWiYNTqoHRruzQn3PSTtmW4T/qpvRfnuWrNH1R6C/PZe9j l+lrPXzRHLbGkL+56O/t5qW7AtS7/5hbNyw99WAS70UXrtUZuU1mvP8q1s9sTzx4Q+aZVJXq y2pm7pdHnm2SSfH2Elo24Vpbn+0/3p6j85ecEn0ackSolT8x6oH+iQsHJucLX5niuymjzfK9 EktxRqKhFnNRcSIAsmu7fV4CAAA=
Archived-At: <https://mailarchive.ietf.org/arch/msg/taps/27vBFQY0qbGey6CPaiIj0vqZhqc>
Subject: Re: [Taps] Review of draft-trammell-taps-post-sockets-03
X-BeenThere: taps@ietf.org
X-Mailman-Version: 2.1.22
Precedence: list
List-Id: "IETF Transport Services \(TAPS\) Working Group" <taps.ietf.org>
List-Unsubscribe: <https://www.ietf.org/mailman/options/taps>, <mailto:taps-request@ietf.org?subject=unsubscribe>
List-Archive: <https://mailarchive.ietf.org/arch/browse/taps/>
List-Post: <mailto:taps@ietf.org>
List-Help: <mailto:taps-request@ietf.org?subject=help>
List-Subscribe: <https://www.ietf.org/mailman/listinfo/taps>, <mailto:taps-request@ietf.org?subject=subscribe>
X-List-Received-Date: Mon, 13 Nov 2017 00:07:29 -0000


> On Nov 11, 2017, at 2:09 PM, Michael Welzl <michawe@ifi.uio.no> wrote:
> 
> Hi,
> 
> In line:
> 
>> On Nov 11, 2017, at 11:58 AM, Tommy Pauly <tpauly@apple.com <mailto:tpauly@apple.com>> wrote:
>> 
>> 
>> 
>>> On Nov 11, 2017, at 10:36 AM, Michael Welzl <michawe@ifi.uio.no <mailto:michawe@ifi.uio.no>> wrote:
>>> 
>>> 
>>>> On Nov 11, 2017, at 10:06 AM, Tommy Pauly <tpauly@apple.com <mailto:tpauly@apple.com>> wrote:
>>>> 
>>>> Hi Michael,
>>>> 
>>>> Just a couple initial notes that may help:
>>>> 
>>>> - The version diff you should look at is between -01 and -03. -02 is the same as -03, but had a typo.
>>>> 
>>>> - You've mentioned previously that you thought that Post requires both peers to use that API. That is absolutely not the case in any way. Having implemented Post myself, I am only communicating to "legacy" servers that know nothing about Post. I think this fundamental understanding needs to be cleared up before coming to any conclusions. We can discuss during the WG.
>>> 
>>> Oh?!  That would be fantastic!!  But I stumbled over a number of things that require a system on the other side, or they just couldn’t happen (like the “carrier forking” notification I quoted below - but there were more). If you say you can talk to a “legacy” server that knows nothing about Post, WHAT does that server speak? Legacy which protocol?  Maybe it’s just a matter of me thinking TCP, and you thinking TLS… dunno! Tell me   :)
>> 
>> So, since Post (and TAPS in general) isn't defining any new protocol features, we need to of course be compatible with all existing protocols. Certainly, some functionality is a bit degenerate in some cases.
>> 
>> Whatever the server speaks, the client needs to conform to. So, we use our Post implementation for raw TCP, raw UDP, TLS over TCP, HTTP/2 Streams over TLS over TCP, QUIC streams over UDP, etc. These are all standard server configurations, but Post offers a client application a single set of APIs to talk over any of these protocols.
> 
> Oh, great!  But then you can’t guarantee that a message arrives as a message in case of raw TCP, or you assume application-level framing. This is what I’ve been proposing, but the post-sockets draft reads entirely different from that.

Messages do indeed "always work", but they may be degenerate. There's no new protocols here, just ways of looking at them:

- UDP: One message per datagram
- TCP: Entire stream is one big message that only ever ends when that half of the stream closes
- TLS: Generally viewed like TLS, but can view one record as one message 
- HTTP/QUIC: One message per request/response (so, framing)
- Length-value framing on streams, as used by some protocols (like IKEv2 over TCP): one message per L-V frame
Etc, etc.

That is what the draft does say in Section 2.2. Note how a TCP stream is the message in some cases.

A Message is the unit of communication between applications.
   Messages can represent relatively small structures, such as requests
   in a request/response protocol such as HTTP; relatively large
   structures, such as files of arbitrary size in a filesystem; and
   structures of indeterminate length, such as a stream of bytes in a
   protocol like TCP.


> 
> 
>> In the case of "Carrier Forking", that's essentially what you say to the protocol stack when you want to open a new stream to the same place. So, when I call "fork Carrier", it turns into:
>> - For raw UDP/TCP or TLS (or anything that is mono-streamed), open a new five-tuple to the same remote endpoint
>> - For HTTP/2 and QUIC, open a new stream on the same connection
> 
> Sure, that’s what I thought it would. Now, with SCTP, you wouldn’t get a “fork request” equivalent on the other side: the client would just start using a new stream, and that’s it.  (“request” also indicates the possibility to say no, which also doesn’t exist in SCTP AFAIK, at least not in the API - this would be a “stream reset”).  Now, in QUIC, I don’t know exactly how that is, but I would have thought it’s the same - you just go ahead and use a new stream. No “fork request” on the other side - just a new stream (in post, carrier) being used.

The term "fork-request" is misleading, yes. It really should just say: "forking a carrier creates a new flow to the same Remote, which may be a new stream on a multiplexing protocol. The protocol will handle any required signaling to the remote to open a new stream, based on the protocol".

> 
> 
>>>> - The point of the API is to give the shape of the application interaction, which is why you find it general. I believe that many of the protocol-specific options like you mention (disabling Nagle, retransmissions, etc) don't belong to this main abstract API draft, but to a different document that goes into how to configure options that can be used for setups like TCP/UDP. Again, in my implementation of Post, all of these options exist as part of the Configuration object mentioned in the draft. However, as I'll discuss in the WG, I believe that the general shape of the API needs to be defined to be more-forward looking than just what we've specified with the minset for TCP/UDP/SCTP. Essentially, these become a set of Configuration options that can be used, but as transport protocols continue to evolve (and when we need more protocol-specific options), we need to be able to expand. Certain aspects of the minset, like the connection state management, are of course general and common enough to be part of the highest level of API description.
>>> 
>>> It’s clear to me that we want a higher abstraction level than what the list from minset has - e.g., rather than a DSCP value, it would be better to specify general requirements (low latency or such) for a carrier. Rather than saying “disable Nagle”, we could also say “ low latency, even if it comes at the cost of some overhead” - we do such things in the NEAT API too. You’re focused on the interaction with the application (e.g. callback-based instead of traditional socket-style) - which is fine, but I think doesn’t have much to do with the actual protocol choice.
>>> 
>>> As for being more forward-looking, I wonder what the new transport features are that we’re missing out on (things that apps really see). I follow QUIC from a slightly too large distance (I simply run out of cycles there :(  ), but so far I’m not sure there’s anything we’d be missing  (but that’s maybe also because I’m not an HTTP/2 expert either). Except security of course, but there the argument is perhaps that it’s enough to consider falling back to TLS?
>> 
>> QUIC is using TLS 1.3, so it can give equivalent security properties to HTTP/2. Doing fallback between these is definitely an important feature. I think this flexibility is why the API needs to allow per-protocol configs.
> 
> Sure, but I think (and that was my point) this doesn’t change anything about the stuff above (security is in your separate document) - so what exactly are the “more forward looking” requirements except for these security needs?

I'm trying to distinguish certain aspects of the minset that are:
a) fundamental to all transports, that we have reason to believe will be the case for all future transports in some fashion
	CONNECT, SEND, RECEIVE, CLOSE, etc
b) derived from the protocols we happened to survey or based on current semantics (sockets), based on what exists
	Things I see in the NEAT draft like SET_MIN_CHECKSUM_COVERAGE, SET_TTL, SET_LOW_WATERMARK. Important to have, but often the values the application needs to set relate to which protocol might be used, and may have different requirements for future protocols.

So, there's a set of things in category (a) that should be stable as the main API go forward for quite a while, while things in category (b) may belong as configuration properties, in a list that may shrink or expand over time as new developments are made.

> 
> 
>>> As for how you represent Nagle etc. in your code, that sounds good to me, but I see an issue in that so much transport functionality is simply not covered by the draft. E.g., the packet sizes / fragmentation thing is important too … yes that’s lower level stuff, but UDP-based applications will only get inefficient if they don’t get this information exposed, which risks having app programmers move to the old ways again IMO.
>> 
>> A Post API definitely allows access to IP-packet level configuration and metadata. However, you're right that the draft doesn't specify this in detail now. I still think that may be a separate doc, but yeah.
> 
> I wouldn’t mind that (though it’s not up to me to decide), but —
> 
> 
>>> So, the general design approach of post-sockets is IMO fine, but what I’m missing is a long section with the nitty-gritty details on how such a system would really be implemented (not the happy eyeballing bit, this is fine to be elsewhere - but “how would this work with current protocols”). If I was to implement it from the current draft, I’d have a ton of question marks - e.g. the draft convinced me that there must be a system on both sides (this issue is also not discussed in the draft).
>> 
>> Getting feedback on how to clarify this for the implementer will be really important, so thanks for this feedback! I'd also like to discuss with the WG the scope of various documents that we want to produce. If you have one document that does the abstract connection-management and I/O API and all the protocol options and the racing/fallback strategy, that would be a very long and complex doc.
> 
> Great - I’m happy that this is constructive!  Regarding the requests I’m making about post sockets, a reason I think more of these implementation level considerations need to be in the draft is that this gave me so many hiccups of the sort “but then you need it on both sides”, “but then you need to add a lot more protocol functionality”, “but do you think you could do that?” … etc.
> I guess no matter if there are multiple docs or one, any document for charter item 3 should leave its reader with the warm feeling of understanding how this could be implemented.
> 
> To figure out these details, I’d like to mention that the minset is here to help  :-)    (that’s what it’s meant for). Yes it’s too low-level to be a good API proposal in its own right, but that’s also not the point - it tells you what can and can’t be done. Every decision in it can be traced back to specific reasoning based on the original RFCs; even if you end up disagreeing with reasoning X about a mechanism Y from a RFC Z, at least you know precisely what you’re doing in relation to the TCP, MPTCP, SCTP, UDP, UDP-Lite and LEDBAT specs).
> 
> Cheers,
> Michael