Subject: [rtcweb] 5 tuples and rmcat-cc-requirements-01

From: Dave Taht <[email-masked]>
Date: Sun, 29 Dec 2013 16:02:08 -0800

I finally had a chance to read over

http://tools.ietf.org/html/draft-ietf-rmcat-cc-requirements-01

and also work at reproducing some of the difficulties present in the
current implementation of chrome in light of the two papers presented
at the last ietf on google congestion control. I went through tons of
tests and packet captures that pretty much reproduced the legion of
problems documented in

https://speakerdeck.com/vr000m/evaluating-googles-congestion-control-for-webrtc
and the other paper presented at ietf...

and also fed webrtc traffic through the fq_codel and pie queue
management systems (with pretty good results). I have tons of captures
from each experiment if anyone wants them.

So, I have some comments on this requirements document. (I'm new to
paying attention on rmcat, so a few of my questions are probably
answered by some document I haven't read yet. Steers appreciated. for
all I know I'm on the wrong mailing lists too. Sorry)

In particular, the flows I was looking at multiplexed voice and video
on the same 5 tuple. I am curious as to the justification for this, as
voice (without silence suppression) is isochronous and video is not.
(is silence suppression used in webrtc?)

To me, multiplexing these two very different flows on the same ports
is not a good idea except under extreme port pressure, and not useful
in ipv6 or in non-natted environments at all. Even in a natted
environment, saving a single port is a false savings as (for example)
dns lookups punch dozens of holes through nat on a regular basis.

Requiring that in most or all cases these two flow types be on unique
5 tuples would give smarter queue management techniques on routers
(like sfq, or sqf (deployed at FT), or fq_codel (deployed at
free.fr)), a fighting chance. In particular it gives voice much higher
probability for drop-and-delay free behavior, and analyzing the delta
in drops and delay between a separate voice tuple and video tuple
could provide insight as to the congestion in the system.

In current implementations, is it possible to force flows onto
different tuples? What are the other flaws in suggesting or requiring
a different tuple?

(note I'm not suggesting bulk data traffic get unique 5 tuples per flow)

Some comments on section 3

        A.  If possible, it should also share information and adaptation
            with other non-RTP flows between the same endpoints, such as
            a WebRTC data channel

I might argue that looking at the traffic on the whole browser would
be good. The browser deprioritizing background web page loads while a
webrtc session is active would be useful in the presence of
congestion.

        B.  The most correlated bandwidth usage would be with other
            flows on the same 5-tuple, but there may be use in
            coordinating measurement and control of the local link(s).

As I note above you can get more congestion information from a pair of
flows than one.

        C.  Use of information about previous flows, especially on the
            same 5-tuple, may be useful input to the algorithm,
            especially to startup performance of a new flow.

A 4 tuple may also provide insight, or even two (ip to ip)

        4B.  When additional input signals such as ECN are available,
            they should be utilized if possible.

I would not mind seeing an implementation that negotiated ECN, but it
is out of scope on this document. Is it discussed elsewhere, or
implemented elsewhere? Is an ipv6 version of webrtc implemented
anywhere? I am under the impression it can be made to work in
freeswitch...

   6.   Flows managed by this algorithm and flows competed against at a
        bottleneck may have different DSCP markings depending on the
        type of traffic.  A particular bottleneck or section of the
        network path may or may not honor these markings.

And in fact, may not preserve them. It would be good to be aware
if they are being preserved in both directions and mark appropriately,
and also to probe if packets with particular classifications are being
dropped
or treated weirdly. This includes detecting for e2e ECN awareness.

        A.  In WebRTC, a division of packets into 4 classes is
            envisioned in order of priority: faster-than-audio, audio,
            video, best-effort, and bulk-transfer.  Typically the flows
            managed by this algorithm would be audio or video in that
            heirarchy, and feedback flows would be faster-than-audio.

faster-than-audio? RTCP Signalling? what?

I still have to think about RTCP signalling as it's very hard to pick
out of the data I have, if it's even in there.

   10.  The algorithm should quickly adapt to initial network conditions
        at the start of a flow.  This should occur both if the initial
        bandwidth is above or below the bottleneck bandwidth.

The algorithm I looked over has particularly bad behavior on taking
back bandwidth after it has been used up by another flow, taking many
seconds to ramp up. I like the idea of periodically probing to ratchet
up to a higher rate, with a slow-start-like burst (a higher resolution
frame sent in parallel with lower rate data).  But in terms of the
requirements, adding a

        The algorithm should quickly recover from a loss in bandwidth,
recovering voice first, if possible.

-- 
Dave Täht

Fixing bufferbloat with cerowrt: http://www.teklibre.com/cerowrt/subscribe.html

---

From: Michael Welzl <[email-masked]>
Date: Mon, 30 Dec 2013 17:59:52 +0100

Sent from my iPhone

> could provide insight as to the congestion in the system.

that's why we want to couple the congestion controllers in such cases. no need for queuing to regulate fairness, you do it in the sender!

---

From: Martin Thomson <[email-masked]>
Date: Tue, 31 Dec 2013 17:47:27 -0800

> different tuples? What are the other flaws in suggesting or requiring

There are quite a few ways to achieve this, depending on your
configuration.  All will require some fair amount of SDP cracking.

If you have browsers at both ends, try creating two RTCPeerConnection
objects on each, and treat one pair as audio and the other video.  You
can do this by telling the answerer that audio (or video) is not
wanted in the offer (set port zero for the unwanted component).
offer.sdp.replace(/m=audio \d+ /, 'm=audio 0 ') should be done before
sending the offer out (I don't know whether you can pass this to
setLocalDescription safely, so I wouldn't).

---

From: Harald Alvestrand <[email-masked]>
Date: Wed, 01 Jan 2014 07:28:12 +0100

> setLocalDescription safely, so I wouldn't).

I think it would be simpler to pass OfferToReceiveAudio=false to 
createOffer on one and OfferToReceiveVideo=false to createOffer on the 
other.

If that's a good idea. (I pursued this thread in rmcat)

---

From: Stefan Håkansson LK <[email-masked]>
Date: Wed, 1 Jan 2014 06:55:26 +0000

> setLocalDescription safely, so I wouldn't).

One way of doing it without any SDP cracking would be to create two 
different MediaStream's out of the one obtained from getUserMedia; one 
with the audio MediaStreamTrack only, and one with the video one.

Then use one of them with one PeerConnection, and the other with another 
PeerConnection, and assemble into a MediaStream with audio and video at 
the receiving end.

(And this becomes more straightforward if we move to adding tracks and 
not streams to PeerConnection)

If you want to use one PeerConnection only, I think the simplest way 
would be to remove bundle from the SDP offer - either before setLocal or 
before sending the offer to the remote endpoint.

> _______________________________________________
> rtcweb mailing list
> [email-masked]
> https://www.ietf.org/mailman/listinfo/rtcweb
>