{"id":13719998,"url":"https://github.com/devsisters/goquic","last_synced_at":"2025-05-16T19:04:02.293Z","repository":{"id":25908903,"uuid":"29349685","full_name":"devsisters/goquic","owner":"devsisters","description":"QUIC support for Go","archived":false,"fork":false,"pushed_at":"2022-08-08T16:48:35.000Z","size":306865,"stargazers_count":945,"open_issues_count":29,"forks_count":100,"subscribers_count":107,"default_branch":"master","last_synced_at":"2025-05-16T19:02:30.267Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://devsisters.github.io/goquic/","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/devsisters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-01-16T13:33:09.000Z","updated_at":"2025-04-20T08:43:08.000Z","dependencies_parsed_at":"2022-08-08T08:30:49.641Z","dependency_job_id":null,"html_url":"https://github.com/devsisters/goquic","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsisters%2Fgoquic","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsisters%2Fgoquic/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsisters%2Fgoquic/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/devsisters%2Fgoquic/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/devsisters","download_url":"https://codeload.github.com/devsisters/goquic/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254592367,"owners_count":22097010,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-03T01:00:58.779Z","updated_at":"2025-05-16T19:04:02.245Z","avatar_url":"https://github.com/devsisters.png","language":"C","funding_links":[],"categories":["C"],"sub_categories":[],"readme":"goquic, QUIC support for Go\n===========================\n\n[![Docker Repository on Quay](https://quay.io/repository/devsisters/quic-reverse-proxy/status \"Docker Repository on Quay\")](https://quay.io/repository/devsisters/quic-reverse-proxy)\n\nThis is a work-in-progress QUIC implementation for Go. This is based on\n[libquic](https://github.com/devsisters/libquic) library, which is in turn based\non original QUIC implementation on [Chromium](http://www.chromium.org/quic).\n\nQUIC is an experimental protocol aimed at reducing web latency over that of TCP.\nOn the surface, QUIC is very similar to TCP+TLS+SPDY implemented on UDP. Because\nTCP is implement in operating system kernels, and middlebox firmware, making\nsignificant changes to TCP is next to impossible. However, since QUIC is built\non top of UDP, it suffers from no such limitations.\n\nKey features of QUIC over existing TCP+TLS+SPDY include\n\n  * Dramatically reduced connection establishment time\n  * Improved congestion control\n  * Multiplexing without head of line blocking\n  * Forward error correction\n  * Connection migration\n\n## Project Status\n\n*This library is highly experimental.* Although `libquic` sources are from\nChromium (which are tested), the Go bindings are still highly pre-alpha state.\n\nKnown issues:\n\n  * No support for read streaming. All request must fit in memory.\n  * Secure QUIC not fully tested. May not support ECDSA certificates.\n\nThings to do:\n\n  * Read streaming support\n\n## Preliminary Benchmarks\n\nA very primitive benchmark testing have been done. Testing environments below:\n\n| Items        | Description                                               |\n| ------------ | --------------------------------------------------------- |\n| Optimization | libquic built with `-O3` parameters                       |\n| CPU          | Intel(R) Core(TM) i7-4930K CPU @ 3.40GHz                  |\n| Server Code  | https://github.com/devsisters/goquic/blob/master/example/server.go |\n| Server Parms | `GOMAXPROCS=12 ./server -port 9090 -n 12`                 |\n| Client Code  | https://github.com/devsisters/quicbench/blob/master/quicbench.go |\n| Client Parms | `./quicbench -u=\"https://example.com:9090/\" -c 200 -r 1000` |\n\nThe server code is modified to create 30B, 1kB, 5kB, 10kB HTTP body payload.\nConcurrency is 200 and each thread requests 1,000 requests. It is designed to\nmeasure ideal throughput of the server. Naturally the throughput goes down when\nconcurrency increases.\n\nBenchmark results:\n\n| Payload Size | Requests per Second |\n| ------------ | ------------------- |\n| 30B Payload  | 12131.25 RPS        |\n| 1kB Payload  | 11835.13 RPS        |\n| 5kB Payload  | 7816.21 RPS         |\n| 10kB Payload | 5599.73 RPS         |\n\nOn 10kB case, calculating the total network throughput is `458Mbps`.\n\nHow many connections per second can this server process?\n\n`./gobench -u=\"https://example.com:9090/\" -c 200 -r 100 -qk=false`\n\nTurning off keepalive using `qk` option results in a pure new QUIC connection\nper request. The benchmark results are `2905.58 CPS`.\n\n\nGetting Started\n===============\n\n## Get source files\n\n```bash\ngo get -u -d github.com/devsisters/goquic\n```\n\n-u option is needed, because building (or downloading) static libraries is\nnecessary for building and installing goquic library.\n\n## Build static library files\n\nAlthough prebuilt static library files already exists in the repository for\nconvenience, it is always good practice to build library files from source. You\nshould not trust any unverifiable third-party binaries.\n\nTo build the library files for your architecture and OS:\n\n```bash\n./build_libs.sh (for debug build)\nGOQUIC_BUILD=Release ./build_libs.sh (for release build)\n```\n\nThis will fetch `libquic` master and build all the binaries from source. The\nC/C++ files for Go bindings will be all built too.\n\nTo build static library files, you should have cmake, C/C++ compiler, and \nninja-build system (or GNU make).\n\nCurrently Linux, Mac OS X and FreeBSD is supported.\n\n## How to build\n\nIf you are using Go \u003e= 1.5, you can build goquic binaries without any extra work.\n\n```bash\ngo build $GOPATH/src/github.com/devsisters/goquic/example/server.go\n```\n\nIf you are using Go 1.4, you should open goquic.go and manually edit ${SRCDIR}\nwith your real path (maybe /YOUR/GOPATH/src/github.com/devsisters/goquic).\n\n\n\nSPDY/QUIC support\n=================\n\nWe have a experimental SPDY/QUIC implementation as a library.\nYou can use this library to add SPDY/QUIC support for your existing Go HTTP server.\n\nSee our SPDY-QUIC server/client implementation [here](example/).\n\n## How to use server\n\nWhen running a HTTP server, do:\n\n```go\ngoquic.ListenAndServe(\":8080\", 1, nil)\n```\n\ninstead of\n\n```go\nhttp.ListenAndServe(\":8080\", nil)\n```\n\n## How to use client\n\nYou need to create http.Client with Transport changed, do:\n\n```go\nclient := \u0026http.Client{\n\tTransport: goquic.NewRoundTripper(false),\n}\nresp, err := client.Get(\"http://example.com/\")\n```\n\ninstead of\n\n```go\nresp, err := http.Get(\"http://example.com/\")\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevsisters%2Fgoquic","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevsisters%2Fgoquic","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevsisters%2Fgoquic/lists"}