UPD: Decoy Routing is now Refraction Routing.


TapDance Client code is published under GPLv3 at our GitHub repo, so everyone, who was curious about ongoing development, is more than welcome to look at it. Achtung: the client is unsafe for real-world use yet.

Android and CLI prototypes are available.

Golang is awesome.

Censorship problem

You may want to skip this part, if you know what internet censorship is
Repressive states attempt to censor the internet, preventing their citizens from accessing certain websites. China, for instance, blocked Facebook, Twitter and YouTube, along with a range of Wikipedia articles, regarding certain political and philosophical subjects, as well as various news websites, that weren’t approved by agencies like Central Propaganda Department. This not only stops people from twitting about irrelevant details of their lives (which everyone still should be able to do, and government has no say in it), but also denies access to important information about world events.

Evidently, China is not the only country, that censors the internet:

Source: https://freedomhouse.org/report/freedom-net/freedom-net-2016

However, China is the most notorious for their usage of sophisticated censoring techniques: for instance, they’ve employed various heuristics to detect TOR traffic, followed by active probes to confirm that suspected IP is indeed a TOR node/bridge. Prevalent censorship in most of the other countries(e.g. Russia) was compensated by easiness of circumvention. Unfortunately, Russian government joined Chinese censors and started to expand China’s Great Firewall into the “Red Web”, which is quite frustrating and dangerous precedent.

Refraction Routing

Over many years, there was a cat-and-mouse game: circumventors would attempt to hide their usage of proxies(including TOR) or somehow trick the Great Firewall into not noticing the connection, and censors would try to detect them and block. Another issue along this line: how to distrubite addresses of entry proxy nodes to clients, without also disclosing these addreess to censors? (Ultimately, you can’t) Anyway, cat-and-mouse proved to be effective short-term, but unreliable in long run: the holes in Great Firewall eventually get patched and free entry nodes eventually get busted.

Fortunately, there is fundamentally different approach to this problem, which is a Refraction Routing.

The general idea of Refraction Routing is illustrated on this infographic:

Telex clients Telex station Infographic by Telex team. Please find more details at https://telex.cc/

Telex is a previous generation censorship circumvention system, that was put on hold in favor of TapDance.

Additional info and links to papers about Refraction Routing could be found at refraction.network. This website (as of today) doesn’t mention one very good paper—Slitheen—quite an elegant solution to website fingerprinting problem in Refraction Routing.


The main advantage of TapDance over all other Refraction Routing schemes: TapDance does not block the flow and just needs to passively observe the traffic, thus, greatly increasing deployabilty. In the past, when various Refraction Routing teams approached ISPs to discuss deployment, after hearing a phrase “Block the flow to inspect the traffic for steganogra…”, ISPs were immediately saying “no”.

With TapDance we managed to get deployment at real ISP and evaluate our system at 10Gbps speed (which would be discussed in more details in upcoming paper).

Needless to say, high deployabilty is paid with technical complications, as refraction server(DS) (the one, that isn’t blocked) now gets all the traffic, sent by client. If refraction server responds, not only everyone gets confused about TCP connection state (rendering connection unusable), but it also looks suspicious to the sensor. For instance, one of the cases, in which DS would respond, is when client sends more data, that could fit in DS’ TCP window size. For that reason, we have to tear down the connection just before DS’ window size is exceeded and create a new connection to it(but continue old session to Covert Website, as if nothing happened).

Client and Golang

Android Client

Native Client for Android

Warning: those are preliminary versions of the TapDance Client, the connection is highly unstable and detectable by the censor.

However, if you are curious about anticensorship, I encourage you to take a look at our application and/or code. As indicated in our GitHub repo, there are 3 versions of TapDance client:

Client logic is written in Golang, because this language is cross-platform and just awesome in general. This logic package could be(and is) in CLI version and on mobile platforms. Eventually, it will be integrated into browser plugin for Google Chrome and Mozilla Firefox(and, possibly, other browsers).

By the way, our tapdanceConn implements net.Conn interface, which means that you can simply swap any other net.Conn for tapdanceConn in your Golang application and it will just work.

type Conn interface {
        Read(b []byte) (n int, err error)

        Write(b []byte) (n int, err error)

        Close() error