JANOG55 NETCON 現地問題2

## はじめに
JANOG55（京都）で行われたNETCONの現地問題２の解説です。
現地問題2では、ixia（Keysight）のテスターを使用してパケットを送出、L2スイッチ側でラベリングするというものでした。

## 問題文
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/47813514-357e-ee4d-e091-65a39e2fea05.png)

上司：今度、QoSで帯域制御をする予定にしているので、スイッチの1番ポートに入ったパケットのDSCPを56になるよう設定いれておいて
私：はい。入れました。
上司：ちょうどスループットを測定するテスターがあるので、これでパケット送出して確認してみよう
私：スイッチの2番ポートをテスターの受信側に接続しました。どうすればDSCPの値を確認できますか？
上司：UTPのタップを入れてテスターの受信側に戻ってくるパケットをキャプチャしてみよう
私：接続できました。
上司：それではパケットを送出して、確認してみよう。ちゃんとDSCPフィールドに56の値が入っているかな？
私：・・・

#### 達成条件
テスターのeth2に入ってくるパケットをキャプチャし、IPヘッダのDSCP値が何番になっているか確認する
スイッチの設定を変更して、DSCP値が56になるようにする
#### 制約
特になし

## 解答
パケットキャプチャをすると、IPヘッダのDSCPフィールドに48（Class6）が設定されていました。
```
RT-01# config terminal
RT-01# interface ethernet1/1/1
RT-01# no ip dscp-remark 48
RT-01# ip dscp-remark 56
```

## 解説
そもそもDSCPって何なのか・・・。
QoSで優先制御するためには、パケットに優先度の決めるために必要な値を持たせる必要があります。
そこで、まず考えられたのはIPヘッダの中のToS（Type of Service）に優先度をつけることです。
ToSは8ビットあり、この中の3ビットを使って優先度を区分しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/4d80b6c2-ca2f-a79f-fa32-3d8f57d98f70.png)

しかし、3ビットでは0-7までの優先度区分しかできないため、DSCP（Differentiated Services Code Point）はToSのうち6ビットを使って優先度を区分します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/d7e9a97f-4d23-6b8b-056c-92112e19ae08.png)

これにより、0-63まで優先度を区分することができる。
なお、DSCPは上位3ビットを優先度、下位3ビットで破棄レベルを示し、46（101 110）が最も優先度が高い特別な値に指定されています。
56（111 000）がClass 7、48（110 000）がClass6、40（101 000）がClass5というように対応付けされています。スイッチやルータはこの優先度の値を使って、帯域制限やキューの優先度制御を行います。

ということで、せっかくUTPタップを使ってパケットキャプチャしているので、パケットを見ていきましょう。
初期状態のパケットを見ると、

![wshark001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/25c81eda-7d3b-76b1-4526-3cc1d8ac349a.png)

IPヘッダの中のDifferentiated Service Fieldに（1100 00..（下2ビットは未使用））が設定されていて、Class Selector 6でDSCPが48であることがわかります。
問題文から設定したいDSCP値は56であることから、スイッチ側の設定を変更します。
スイッチの設定を見ると、
```
interface ethernet 1/1/1
 ip dscp-remark 48
 trust dscp
```
とあるので、この部分の設定を変更します。
なお、この機種では一度ip dscp-remark 48の設定を削除しないと設定変更できません。
そのため、
```
RT-02(config)# interface ethernet 1/1/1
RT-02(config)# no ip dscp-remark 48
RT-02(config)# ip dscp-remark56
```
再度、パケットをキャプチャして確認します。

![wshark002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/50f0cd96-b2a1-7c43-ef15-a95a1037932f.png)

IPヘッダを確認すると、先ほど48だった部分がClass Selector 7でDSCP値が56に変更されました。
先ほど、説明に書いたようにDSCP値を46に設定すると最優先（Expedited Forwarding）に設定されます

![wshark003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/9babcce6-e002-6284-2b1c-29aae25ca77a.png)

なお、今回はethernet1/1/1のインターフェイスを通過したパケットにDSCP値をヘッダに付与するように設定しました。そのため、ethernet1/1/2に入っていくパケットにはDSCP値が入りません。
次のパケットは、ethernet1/1/2につながっている機器からethernet1/1/1につながっている機器宛に送出したパケットをethernet1/1/2側でキャプチャしたものです。DSCP値が0になっているのがわかります。

![wshark004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/f37f469d-fc42-2637-5443-6032fd1c5c7d.png)

## おわりに
いかがでしたか？今回は、QoS制御に必要な情報をヘッダに付与するだけでしたが、スイッチやルータはこのヘッダの値を用いて帯域制御や優先キューの設定をaccess-listやPolicy mapなどを使って行います。
今回は、パケットの生成にixiaのテスタを使っています。

![ixia.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/133769/0fc61828-91aa-8caf-41f3-2e9711159208.png)

生成したパケットはUDP512バイトのパケットを10多重（10個の仮想IPから）でワイヤレートの10%送出で設定しています。それでも、スループット1.5Gbpsで6.1nsのレイテンシーでした。
結構なパケットを生成して送出していたので、Wiresharkを途中で停めないとバッファがいっぱいになって正常に停止しなくなりました。
問題としては、そんなに難しいものではありませんが、ちょっと変わった機械を使って、ちょっと変わった手法でデバッグできるような問題でした。