http://jvns.ca/blog/2016/06/30/why-do-we-use-the-linux-kernels-tcp-stack/