qlog/qvizでQUICの可視化

# qlogとは

qlogはQUICのログのフォーマットです。

現在qlogでは3つのドラフトが提案されています。

一つ目が、プロトコルに依存しないハイレベルのスキーマを定義する、「[Main logging schema for qlog draft-ietf-quic-qlog-main-schema-00](https://datatracker.ietf.org/doc/html/draft-ietf-quic-qlog-main-schema-00)」です。

QUICに関連する定義は「[QUIC event definitions for qlog draft-ietf-quic-qlog-quic-events-00](https://datatracker.ietf.org/doc/html/draft-ietf-quic-qlog-quic-events-00)」、HTTP/3とQPACKに関連する定義は「[HTTP/3 and QPACK event definitions for qlog draft-ietf-quic-qlog-h3-events-00](https://datatracker.ietf.org/doc/html/draft-ietf-quic-qlog-h3-events-00)」にそれぞれかかてれいます。



# qvizとは
qlogを可視化するためのツールです。ソースは https://github.com/quiclog/qvis で公開されています。

また、オンラインで使える環境として、https://qvis.edm.uhasselt.be/#/files が用意されています。

# qvizでできること
qvizには、Manage Files、Sequence、Congestion、Multiplexing、qlog statsの5個のメニューが用意されています。

Manager Filesでは、可視化するファイルを読み込みます。

Sequenceでは、QUICのシーケンスを可視化します。イベントや、QUICパケットの中身などを確認することができます。

Congestionでは、送信中のデータなどの情報と、輻輳制御に関する情報を見ることができます。

Multiplexingでは、並列化されたストリームの状態を可視化できます。

qlog statsでは、統計情報を見ることができます。

# Manage Files
Manager Files では、qvizで可視化するqlogファイルを読み込みます。

## Option 1 Load a file by URL
このオプションでは `.qlog`、`.pcap`、`.pcapng` をURLからロードして使うことができます。`.json` も使えるようです。

[quant](https://quant.eggert.org/) や [aioquic](https://quic.aiortc.org/logs) はqlogのサンプルファイルを提供しているので、それらを読み込ませてみることもできます。

![option1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/e94d7c1c-16f9-b87e-261f-88abf85e7931.png)


## Option 2 Upload a file
手元にある`.qlog` をアップロードして使うことができます。

![option2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/50c7673c-df29-862c-2606-4172c9862f9b.png)


## Option 3 Load some premade demo files
用意されているいくつかのサンプルを使うことができます。

![option3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/e75fa8be-f8db-1a01-4c13-e6a8e57d97e8.png)


## Option 4 Load a massive demo file
100MBのファイルをダウンロードしたときのサンプルも提供されています。

![option4.PNG]
(https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/cc795465-a17f-7a7a-c35b-8e1b87e7daab.png)


## Option 5 Load a file by URL parameter
URLパラメータを使ってファイルを与えることができます。以下のフォーマットが適用できます。

![option5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/f31512e0-dc1e-5478-38b6-37558538a89a.png)

# Sequence
SequenceではQUICのクライアントーサーバー間のシーケンスを見ることができます

![sequence.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/7cff0b7c-8718-493b-fdf6-9c1c17f63d9d.png)

クライアントーサーバ間でやり取りされているQUICパケット毎にQUICパケットとそこに含まれるQUICフレームの情報を見ることができます。

例えば以下のように最初にクライアントからサーバーに送信されるパケットをクリックすると、以下のような情報を見ることができます。

![quic_packet.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/4b279b01-e65b-5940-1719-1d08763d855d.png)

```json
[
  "0",
  "transport",
  "packet_sent",
  "line",
  {
    "packet_type": "initial",
    "header": {
      "version": "0xff000016",
      "scid": "7e37e4dcc6682da8",
      "dcid": "36ce104eee50101c",
      "scil": "8",
      "dcil": "8",
      "payload_length": 1224,
      "packet_number": "0",
      "packet_size": 1251
    },
    "frames": [
      {
        "frame_type": "crypto",
        "offset": "0",
        "length": "284"
      },
      {
        "frame_type": "padding"
      }
    ],
    "type": "initial"
  }
]
```

他にも、クライアント、サーバーそれぞれのイベントのログも表示することができます。下記のように`connection_started` をクリックするとそのログを見ることができます。

![connection_start.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/668d963d-68b2-00c6-08e0-97c7037651e4.png)


```json
[
  "0",
  "connectivity",
  "connection_started",
  "line",
  {
    "ip_version": "4",
    "src_ip": "130.104.228.79",
    "dst_ip": "52.58.13.57",
    "transport_protocol": "UDP",
    "src_port": "40618",
    "dst_port": "4433",
    "quic_version": "0xff000016",
    "src_cid": "7e37e4dcc6682da8",
    "dst_cid": "36ce104eee50101c"
  }
]
```

クライアントとサーバーの両方のログを使った可視化も可能です。

![client-server-log.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/e40fda97-799b-dc34-74f2-878b71dd66a3.png)

# Congestion

Congestionでは、送信中のデータなどの情報と、輻輳制御に関する情報を見ることができます。報

![congestion1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/20818425-1e19-8a4c-5c68-b2565d719792.png)


前者は、Data sent (includes retransmits)、Data acknowledged、Data lost、Connection flow control limit、Sum of stream flow control limits を表示することができます。

後者は、Congestion window、Bytes in flightを表示することができます。


他には、Min RTT、Latest RTT、Smoothed RTTを見ることができます。

![congestion2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/c2e48c7b-f477-9097-285f-5790705e8d23.png)

# Multiplexing
Multiplexingでは、並列化されたストリームの状態を可視化できます。上部のwaterfallではそれぞれのストリームの生存期間が表示されます。

下部のMultiplexed data flowでは、ストリームフレームの受信を時系列に表示しているようです。

![multiplexing.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/4d9bf812-4ac2-ab55-80f6-62c09d0494ed.png)

Byterange per STREAM frameでは、Multiplexed data flowで選択したストリームのストリームフレームのbyte rangeを見ることができます。

![byterange_per_stream_frame.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/40326d89-e786-8485-e674-900407d1d612.png)


# qlog stats
qlog stats ではqlogファイルの情報や統計情報を見ることができます。

![stats1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/aa620142-9d49-d1b8-a51c-31f8e56be00c.png)


![stats2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/302126/f3bdf26e-b363-9d82-41d2-2b841f8fd947.png)