- From: Harald Alvestrand <harald@alvestrand.no>
- Date: Wed, 28 May 2014 12:44:10 +0200
- To: Tim Panton new <thp@westhawk.co.uk>
- CC: public-webrtc@w3.org
- Message-ID: <5385BDFA.6000406@alvestrand.no>
On 05/28/2014 12:35 PM, Tim Panton new wrote: > > On 28 May 2014, at 11:02, Harald Alvestrand <harald@alvestrand.no > <mailto:harald@alvestrand.no>> wrote: > >> On 05/28/2014 11:46 AM, tim panton wrote: >>> On 28 May 2014, at 10:18, Harald Alvestrand <harald@alvestrand.no >>> <mailto:harald@alvestrand.no>> wrote: >>> >>>> On 05/28/2014 10:52 AM, Wolfgang Beck wrote: >>>>> Adding another data transfer protocol on top of SCTP wll not solve >>>>> your problem. >>>>> >>>>> The Websocket-style API is the problem. >>>>> It does not allow the JS to delay reception and does not tell you >>>>> when it is apporpriate to send more data. >>>>> >>>>> Sending a chunk and wait for an ACK? That means you will spend >>>>> most of the time waiting for Acks instead of >>>>> transmitting data. Of course you can somehow negotiate how many >>>>> chunks you can send without having to >>>>> wait for an ACK. Now you have re-implemented a substantial part of >>>>> SCTP, probably with more errors and less sophistication. >>>>> >>>>> What's wrong with the Streams API? >>>> The first thing wrong about the Streams API as described in the >>>> link below is that it does not preserve message boundaries; a >>>> Stream is a sequence of bytes. >>>> >>>> Our chosen abstraction is a sequence of messages. >>>> >>>> Something like the Streams API may be a Good Thing (and applicable >>>> to websockets too), but the current proposal just has the wrong >>>> model for our purposes. >>>> >>>> If you have a suggestion to bridge the gap, please bring it forward. >>> Thinking some more about the back pressure issue, how about an >>> optional callback on send() >>> onSendSpaceAvailable(int amount) >>> which gets called whenever it is next possible to send and the block >>> size that is available. >> >> I think a lot could be done if we just defined the semantics of send(): >> >> - send either succeeds fully or fails fully. There is no partial >> success. (Needed to ensure integrity of messages.) >> - the channel should stay up after a failed send (nothing got sent, >> this is not fatal) > > I have a philosophical problem with that. Say the requested > semantics of the channel are : sequenced, reliable message delivery. > Now you have the possibility that one of the sent() messages will > never be delivered, but a subsequent one will. That's why I want the semantics of send() to be totally binary outcome: Either it's sent, or it's not. If it's not sent, it doesn't enter the sequence. > If you are sending incremental changes (think database transactions) > and one in the middle is dropped but the channel > remains operational, you have broken that semantic. Only if the sending code assumes that a failure is ignorable. Caveat emptor. (Many files have been lost to code written under the assumption that write() will always succeed... "what do you mean - disk full?") > >> - the code for "the buffer is full, try later" and "this message is >> too big to ever send" should be different (so that we can know the >> difference between "back off" and "you must be kidding") > > perhaps that works for the unreliable case, but I don't like it for > reliable. > >> >> There's a difficulty in the callback definition you suggest - I think >> it needs to say what size it is waiting for. Otherwise, we get a >> sequence like: >> >> -> send(20000) -> fail, temporary too big >> <- spaceAvailable(100) >> -> send(20000) -> fail >> <- spaceAvailable(1000) >> -> send(20000) -> fail >> >> and so on. That's not right. > > Agreed. Given that perhaps we need a bulkSend( ) which takes an array > of messages or even a function that generates messages. > bulkSend( function(avail) { return /nextmessageOfAvailBytes} ); Now we're getting complicated :-) > > T. > >> >> >>> >>> T. >>> >>>>> Wolfgang >>>>> >>>>> On 05/27/14 09:37, Stefan Håkansson LK wrote: >>>>>> This was discussed at the f2f, and the Streams API was mentioned, >>>>>> but as >>>>>> Harald pointed out yesterday the applicability of Streams with >>>>>> the data >>>>>> channel is not clear yet. >>>>>> >>>>>> But there is another option that is supported right now. The blob >>>>>> (defined in http://dev.w3.org/2006/webapi/FileAPI/) supports >>>>>> slicing up >>>>>> data chunks in smaller parts (and of course re-assembling them back). >>>>>> So, it is quite simple to split up a large chunk in smaller ones, and >>>>>> then add some simple acking on the app layer (hold back sending next >>>>>> slice until the previous one is acked). >>>>>> >>>>>> This is not elegant, but should work. >>>>>> >>>>>> The quota API >>>>>> (https://dvcs.w3.org/hg/quota/raw-file/tip/Overview.html) >>>>>> allows for a bit more sophistication, but it seems to be supported by >>>>>> Chrome only (and then only an older version of the API). >>>>>> >>>>>> Stefan >
Received on Wednesday, 28 May 2014 10:44:47 UTC