Twitterで見かけたChromeにあるNetwork Quality Estimator サービス(NQE)の紹介のスライドです。
ページのロードの最適化のために、ネットワークの状態を計測するサービスが含まれているそうです。
developerも、RTT estaimate, Download bandwidth estimate, EffectiveConnectionType の3つを使うことが可能らしいです。
以下はスライドを読んでいるときに書いた自分用のメモです
続きを読むfacebook AI researchが発表した強化学習の手法を輻輳制御に適用する論文を読んでみました。
非同期に行動の決定を実行することで帯域を有効に使えるようにした論文です。ただし、複数のネットワークを一緒に学習させると高いスループットが出せないという課題があります。
https://arxiv.org/pdf/1812.04823.pdf
中国鉄路高速の上海北京間で、TCP over LTEの性能を計測した論文。300km/h以上の速度で運行しているときの、車内Wi-FiからLTEで通信する実ユーザーの計測データをもとに議論をしています。
主な内容は以下の4点です
LTEのハンドオーバーによる性能への影響が興味深かったので、少し取り上げます
続きを読むBBR、CUBIC、NewRenoの3つに絞って調べています。
各実装のレポジトリを、BBR、CUBIC、Reno、congestion、でキーワード検索して、出てきた情報から判断しています。詳細な実装を確認したわけではないので、実際には実装されていてもキーワード検索時に引っかからなかった場合は見落としている可能性がありますのでご注意ください。
もし間違っていたらご連絡いただけると助かります。
implementation | language | 実装されている輻輳制御アルゴリズム | コメント |
---|---|---|---|
aioquic | python | ? | コードとissueを検索してみましたが、何が実装されてるかまではわかりませんでした |
AppleQUIC | C, Objective-C | ? | closed sourceのため詳細不明 |
ats | c++ | NewReno | このコミットログを見ると draft-19にあわせたと書いているので、NewRenoの可能性が高いと思います |
f5 | c | ? | closed sourceのため不明 |
kwik | java | NewReno | ソースコードを検索したら、NewRenoCongestionController.java というのがありました |
lsquic | c | BBR, CUBIC | ソースコードを検索したら、BBRとCUBICの実装がありました |
msquic | c | ? | closed sourceのため不明 |
mvfst | c++ | BBR, CUBIC, NewReno, COPA | BBR, CUBIC, NewNewRenoに加え、昨年論文が発表されたCOPAまで実装されていました。参考情報: COPAの論文 FaceBookの記事 |
Neqo | Rust | ? | コードとissueを検索してみましたが、何が実装されてるかまではわかりませんでした |
ngtcp | c | ? | コードとissueを検索した限りでは、何が実装されてるかまではわかりませんでした |
nginx_quic | c | ? | quicheの拡張なので、quicheと同じだと思います |
Pandora | c | ? | closed sourceのためわかりませんでした |
picoquic | c | CUBIC, NewReno | ソースコードを検索したら、CUBICとNewRenoの実装がありました |
quant | c11 | ? | コードとissueを検索した限りでは、何が実装されてるかまではわかりませんでした |
quiche | Rust | NewReno | このissueによると 今はNewRenoしか実装していないようです |
quicker | TypeScript | ? | コードとissueを検索してみましたが、何が実装されてるかまではわかりませんでした |
quicly | c | Reno | コードを検索した限りでは、Renoが実装されているようでした |
Quincy | Java | ? | コードとissueを検索してみましたが、何が実装されてるかまではわかりませんでした |
quinn | Rust | ? | コードとissueを検索してみましたが、何が実装されてるかまではわかりませんでした |
sora_quic | Erlang/OTP | ? | closed sourceのためわかりませんでした |
quic-go | Go | CUBIC | コードを検索した限りでは、CUBICが実装されているようでした |
単純なキーワード検索のみだと、不明なものが多かったです。個人的な予想ですが、そういう場合は、IDに従ってNewRenoを実装しているのではないかと思います。
もし、QUICのライブラリを実際に利用する場合は、ネットワークエミュレータなどで挙動を確認して、どの輻輳制御アルゴリズムを使っているか推定するのもありだと思います。
go のQUICライブラリのquic-goを使った開発したときのtipsの備忘録です。
についてメモしておきます。
↓で説明があるように、wiresharkでQUICの復号を行うためには、該当通信のKEYLOGファイルが必要になります。
quic-goでKeylogファイルを書きだすためには、quic.DialAddr
を呼び出すときに、tls.Config
に、KeylogWriterを持たせることで実現できます。
TLS ConfigにKeylogWriterを持たせる例は、goのdocumentから確認することができます
例えば、以下のように実装すると、
w, err := os.Create("./keylog.log") tlsConf := &tls.Config{ InsecureSkipVerify: true, NextProtos: []string{"hogehoge"}, KeyLogWriter: w, } config := &quic.Config{ KeepAlive: true, } session, err := quic.DialAddr(addr, tlsConf, config)
keylog.logというファイルが生成されます。
中身は↓のようなフォーマットになっています。
CLIENT_HANDSHAKE_TRAFFIC_SECRET ... ... SERVER_HANDSHAKE_TRAFFIC_SECRET ... ... CLIENT_TRAFFIC_SECRET_0 ... ... SERVER_TRAFFIC_SECRET_0 ... ...
環境変数 QUIC_GO_LOG_LEVEL=loglevel
を設定して、プログラムを実行するとログの出力ができます。
例えば、QUIC_GO_LOG_LEVEL=debug
と設定すると、QUICパケットの送信時に、QUICパケットとその内部に含まれるフレームのログが見たり
18:13:25.216025 client -> Sending packet 0x5 (26 bytes) for connection 0x39abd2c4bae665f6062f, 1-RTT 18:13:25.216028 client Short Header{DestConnectionID: 0x0d76cf58, PacketNumber: 0x5, PacketNumberLen: 2, KeyPhase: 0} 18:13:25.216031 client -> &wire.StreamFrame{StreamID: 6, FinBit: true, Offset: 0x15, Data length: 0x0, Offset + Data length: 0x15}
受信したQUICパケットを見たるすることが出来ます。
18:13:25.241739 client Short Header{DestConnectionID: (empty), PacketNumber: 0x5, PacketNumberLen: 2, KeyPhase: 0} 18:13:25.241742 client <- &wire.AckFrame{LargestAcked: 0x5, LowestAcked: 0x2, DelayTime: 25.504ms}
これ以外にも、接続シーケンスや切断したときの情報などを確認することが出来ます。
コードを動かして規格の中身を確認したいときに便利かもしれないです。
OpenLiteSpeedとnginx の実装を比較している記事
163バイトのindex file、そこからリンクを張られている1MB、10MB、1GB のファイルのダウンロードを比較している。
index fileに対しては、同時に複数アクセスして毎秒どれくらいのリクエストをさばけるのかを確認しています。
1MB、10MB、1GBのファイルに対しては、ダウンロード時間を比較しています。
すべての結果でOpenLiteSpeedのほうが良い結果が出ていました。nginxはCPU使用率やメモリ使用量が多いらしいです。
主張したいのは
nginx’s HTTP/3 is not ready for production use. It delivers poor performance and, at the same time, uses too much CPU and memory.
のようです。
以下のツイッターのスレッドで議論が続いているようです。
Our #HTTP3 benchmarks reveal that #OpenLiteSpeed beats @nginx handily in throughput and scalability. At the same time, @litespeedtech #QUIC stack uses 50% less CPU and a fraction of memory that #quiche uses.
— Dmitri Tikhonov (@dmitri_tikhonov) November 25, 2019
/cc @Cloudflare @centminmod @loadtester https://t.co/CHarezYm3D