Skip to content

Commit 62af04d

Browse files
authored
Path-aware QUIC (#151)
Prototype implementation for a library implementation of a QUIC "socket" with automatic SCION path selection and switching. Includes a sample application "boingboing", cloned from the "pingpong" test application from scionproto/scion, which has previously been demoed by @FR4NK-W. Moving forward, the plan for this library could be to replace the dumber `appquic` library and use this in all the apps. At a high level, the current model is: 0. Server always replies on path last used by client (identified by IP/port, not great!). 1. Client races dial over all paths, picks quickest to succeed - Probably a good selection for any small requests (website load, status request, etc) 2. Active RTT probing on (all) paths - At 1 second interval, pick lowest RTT path (modulo some robustness threshold) 3. On revocation or probe timeout (0.5s) of active path, change to best (other) path immediately Many, many open topics, issues and todos (not exhaustive); - reset quic congestion control whenever switching paths - server side reply path selection; currently uses path from last packet. Many options. - pre-select paths to avoid spamming the network; split paths into active set and backup set - revocation / timeout, relegate path to backup set - promote an unused path out of the backup set - implement more sophisticated path selection/switching policies, hop around to explore bandwidth on different paths, stick to best option after some time, re-evaluate periodically or if performance goes below threshold. Something with explore/exploit, multi-armed bandits, yada yada. - how to do bandwidth optimizing strategy when the client is only receiving? - better statistics for RTT and bandwidth measurements, e.g. moving average (currently only considers most recent measurement) - extract and generalize reusable components, e.g. build a socket with automatic path management _without_ quic. - tests; unit tests, integration tests that actually trigger the path switching
1 parent af13021 commit 62af04d

File tree

18 files changed

+1815
-19
lines changed

18 files changed

+1815
-19
lines changed

Makefile

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ build: scion-bat \
1919
scion-netcat \
2020
scion-sensorfetcher scion-sensorserver \
2121
scion-ssh scion-sshd \
22+
example-boingboing \
2223
example-helloworld \
2324
example-shttp-client example-shttp-server example-shttp-fileserver example-shttp-proxy
2425

@@ -35,15 +36,15 @@ setup_lint:
3536

3637
lint:
3738
@type golangci-lint > /dev/null || ( echo "golangci-lint not found. Install it manually or by running 'make setup_lint'."; exit 1 )
38-
golangci-lint run --build-tags=$(TAGS)
39+
golangci-lint run --build-tags=$(TAGS) ./... ./_examples/helloworld/ ./_examples/boingboing/ ./_examples/shttp/client ./_examples/shttp/server
3940

4041
install: all
4142
# Note: install everything but the examples
4243
mkdir -p $(DESTDIR)
4344
cp -t $(DESTDIR) $(BIN)/scion-*
4445

4546
integration: all
46-
go test -v -tags=integration,$(TAGS) ./... ./_examples/helloworld/
47+
go test -v -tags=integration,$(TAGS) ./... ./_examples/helloworld/ ./_examples/boingboing/
4748

4849
.PHONY: scion-bat
4950
scion-bat:
@@ -89,6 +90,10 @@ scion-sshd:
8990
scion-webapp:
9091
go build -tags=$(TAGS) -o $(BIN)/$@ ./webapp/
9192

93+
.PHONY: example-boingboing
94+
example-boingboing:
95+
go build -tags=$(TAGS) -o $(BIN)/$@ ./_examples/boingboing/
96+
9297
.PHONY: example-helloworld
9398
example-helloworld:
9499
go build -tags=$(TAGS) -o $(BIN)/$@ ./_examples/helloworld/

0 commit comments

Comments
 (0)