

Experiments with WebSocket Performance (for HTML5 games) - statico
http://blog.artillerygames.com/2012/06/websocket-performance.html

======
ajross
The description of the retransmission timeout is kinda wrong. All modern TCP
stacks (at least Linux and Windows, not sure about OS X) implement the
selective acknowledgement ("SACK", see RFC 2018) option by default[1]. The
receiver will notice the out of order sequence numbers and immediately push a
SACK package back to let the sender know about the drop.

And if you look at the charts, that seems to be exactly what happens. At low-
but-nonzero packet loss rates, the maximum delay is never more than one or two
RTTs. With high packet loss rates, you start to see a long tail of longer
times due to double-loss events, I suspect.

[1] "By default" becuase it can be turned off. SACK can be used as a DoS
vector by forcing the sender of a large transmission to buffer and reprocess
essentially all of it repeatedly by pretending it "lost" a packet.

~~~
ehsanu1
Thanks, I spent some time trying to figure out how I could configure this
retransmission timeout. The SACK solution you describe sounds like a great
idea.

Is that the optimum solution though? Could one, say, have two TCP connections
and send the same data on both? This way, maybe when one connection
experiences packet loss, the other can carry on. This probably doesn't
actually work due to high packet loss correlation or something (I have no idea
about networking), so it would be interesting to hear what experts think.

Are there any other relevant parameters to tweak in order to make TCP's
performance slightly more like that of UDP? Working on an MMO game myself (for
fun), so would be great to know.

~~~
ajross
It's a complex subject, but don't think about it as TCP being "low
performance". In fact TCP will _vastly_ outperform basically any hand-written
UDP protocol at large sequential transfers over fat networks (or I guess it
would be better stated that any hand-cooked protocol that performed as well as
TCP would be isomorphic to TCP).

The characteristic you want from UDP is out of order sequencing: you want to
see the most recent packet as soon as it arrives, even if some got missed
before. No version of TCP does that, because TCP is a reliable protocol which
presents a stream metaphor. Packet loss will always show up as latency burps,
though as I point out generally that burp is one extra RTT.

~~~
ehsanu1
Thanks for the reply. Yeah, I understand TCP enforces packet order and works
really well for large transfers etc.

But when writing a game where people interact in "real time" through their
browser via websockets, anything to get TCP latency down is a plus in my book.

While packet loss is bound to cause some latency issues, I just want to
minimize the latency hit for packet loss as much as possible. For instance, in
a high packet loss situation, to overcome double loss (where a retried packet
gets lost, causing 2xRTT of extra latency), perhaps TCP can send multiple
retries at once after a single lost packet. For all I know, maybe this is a
standard configuration parameter that I just have to set appropriately.

------
paulgb
Will WebRTC alleviate this at all? Looking over the spec[1] it seems that
there is a "reliable" flag on the DataChannel, although the implementation of
the underlying transport is not specified.

[1] <http://dev.w3.org/2011/webrtc/editor/webrtc.html>

~~~
vr000m
Yes, it may work but this is yet to be implemented or standardized.

~~~
cmwelsh
WebRTC is available in developer versions of Google Chrome. There are some
demos listed here: <http://www.webrtc.org/running-the-demos>

~~~
vr000m
I have been playing with WebRTC but the API for the data channel is yet to be
implemented or available in any of the browser. Currently only MediaStream and
PeerConnection has been implemented in Chrome.

------
joering2
No later than yesterday I spent couple hours researching Websocket servers to
no avail. I want to run it on Apache/Windows with PHP (there is some python
implementation, but I wish it would be as simple as mod_websocked and opening
concurrent port). Unfortunately solutions like Heroku are tremendously
expensive in my opinion, if you want to build something that will have 1,000
websocket connections at the same time. Could not find anything reliable. This
and fact IE/Opera do not have websocket implemented, makes me come back to
good old Flash technology - building a simple socket module that will trigger
Javascript functions inside a webpage.

~~~
moderation
Opera does support Websocket -
<http://www.opera.com/docs/specs/presto27/websocket/>

As will IE10 -
[http://html5labs.interoperabilitybridges.com/prototypes/webs...](http://html5labs.interoperabilitybridges.com/prototypes/websockets/websockets/info)

Full matrix at <http://caniuse.com/#feat=websockets>

~~~
joering2
I stand corrected in regards to Opera. I have 9.8 (which I downloaded not so
long ago) which does not support Websocket.

