github.com/GeniusesGroup/libgo@v0.0.0-20220929090155-5ff932cb408e/tcp/README.md (about) 1 # TCP on UserSpace 2 In services as API era, almost all services call transfer under two TCP packets, So many logics that consume both memory (e.g. Go just use [2KB for each goroutine](https://go.dev/doc/go1.4#runtime)) and computing resources (e.g. many [context switch](https://en.wikipedia.org/wiki/Context_switch) between kernel and userspace) to handle these few packets are not acceptable anymore. 3 4 Some suggestion such as [change net package](https://github.com/golang/go/issues/15735) or using [epoll](https://en.wikipedia.org/wiki/Epoll) or [kqueue](https://en.wikipedia.org/wiki/Kqueue) and discard net package at all like [this](https://github.com/xtaci/gaio), [this](https://github.com/lesismal/nbio), [this](https://github.com/eranyanay/1m-go-websockets) or [this](https://github.com/panjf2000/gnet) has many other problems: 5 - Go internally use this mechanism in runtime package, So it is easier to just worker mechanism to limit max number of goroutine like [FastHTTP](https://github.com/valyala/fasthttp). We know in this case first Read() on any connection cause to two or more unneeded context-switch on some OS like linux to check if any data ready to read before schedule for future until get read ready state. 6 - OS depend on implementation can very tricky tasks 7 - OS depend optimization need to change such as the number of the active and open file in UNIX based OSs known as ulimit 8 - Balance between the number of events and timeout(milliseconds) in high and low app load isn't easy. 9 - Need some runtime adaptors, because other packages not being ready for this architecture even the Go net library. 10 11 ## Why (OS Kernel level disadvantages) 12 - The Linux or other OSs networking stack has a limit on how many packets per second they can handle. When the limit is reached all CPUs become busy just receiving and routing packets. 13 - 14 15 ## Goals 16 - Improve performance by reducing resource usage. e.g. 17 - No context switch need (L3 as IP, ... need context switch but not as much as kernel-based logics) 18 - No need for separate files for each TCP stream (L3 as IP, ... need some mechanism to take packets from OS) 19 - Just have one buffer and no huge memory copy need more. 20 - Just have one lock mechanism for each stream 21 - Just have one timeout mechanism for a stream of any connections, not many in kernel and user-space to handle the same requirements. 22 - Mix congestion control with rate limiting 23 - Keep-alive a stream for almost free. Just store some bytes in RAM for a stream without impacting other parts of the application 24 - Track connections and streams metrics for any purpose like security, ... 25 - Easily add or changed logic whereas upgrading the host kernel is quite challenging. e.g. add machine learning algorithms, ... 26 - Have protocol implementation in user space to build applications as unikernel image without need huge os kernel. 27 28 ## Non-Goals (Non Considering that can be treated as disadvantages) 29 - Don't want to know how TCP packets come from. So we don't consider or think about how other layers work. 30 31 ## Still considering 32 - Support some protocols like [PLPMTUD - Packetization Layer Path MTU Discovery](https://www.ietf.org/rfc/rfc4821.txt) for bad networks that don't serve L3 IP/ICMP services? 33 - Why [tcp checksum computation](https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Checksum_computation) must change depending on the below layer!!?? 34 35 ## RFCs 36 - https://www.iana.org/assignments/tcp-parameters/tcp-parameters.xhtml 37 - https://datatracker.ietf.org/doc/html/rfc7805 38 - https://datatracker.ietf.org/doc/html/rfc7414 39 - https://datatracker.ietf.org/doc/html/rfc675 40 - https://datatracker.ietf.org/doc/html/rfc791 41 - https://datatracker.ietf.org/doc/html/rfc793 42 - https://datatracker.ietf.org/doc/html/rfc1122 43 - https://datatracker.ietf.org/doc/html/rfc6298 44 - https://datatracker.ietf.org/doc/html/rfc1948 45 - https://datatracker.ietf.org/doc/html/rfc4413 46 47 ## Similar Projects 48 - https://github.com/search?l=Go&q=tcp+userspace&type=Repositories 49 - https://github.com/Xilinx-CNS/onload 50 - https://github.com/mtcp-stack/mtcp 51 - https://github.com/tass-belgium/picotcp/blob/master/modules/pico_tcp.c 52 - https://github.com/saminiir/level-ip 53 - https://github.com/google/gopacket/blob/master/layers/tcp.go 54 - https://github.com/Samangan/go-tcp 55 - https://github.com/mit-pdos/biscuit/blob/master/biscuit/src/inet/ 56 57 ## Resources 58 - https://en.wikipedia.org/wiki/OSI_model 59 - https://en.wikipedia.org/wiki/Transmission_Control_Protocol 60 - https://man7.org/linux/man-pages/man7/tcp.7.html 61 - https://github.com/torvalds/linux/blob/master/net/ipv4/tcp.c 62 - https://github.com/torvalds/linux/blob/master/net/ipv6/tcp_ipv6.c 63 64 ## Attacks 65 - https://www.akamai.com/blog/security/tcp-middlebox-reflection 66 67 ## Articles 68 - https://ieeexplore.ieee.org/document/8672289 69 - https://engineering.salesforce.com/performance-analysis-of-linux-kernel-library-user-space-tcp-stack-be75fb198730 70 - https://tempesta-tech.com/blog/user-space-tcp 71 - https://blog.cloudflare.com/kernel-bypass/ 72 - https://blog.cloudflare.com/why-we-use-the-linux-kernels-tcp-stack/ 73 - https://blog.cloudflare.com/path-mtu-discovery-in-practice/ 74 - https://www.fastly.com/blog/measuring-quic-vs-tcp-computational-efficiency 75 - https://stackoverflow.com/questions/8509152/max-number-of-goroutines 76 - https://developpaper.com/deep-analysis-of-source-code-for-building-native-network-model-with-go-netpol-i-o-multiplexing/ 77 78 # Abbreviations 79 - L3 >> layer 3 OSI 80 - IP >> Internet Protocol