久しぶりにGNS3（その16：QoS Part1）

# QoS
帯域制御にトライ。

## 環境
![topology.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/7c8f160a-fa68-c86b-281f-f91e17c29869.png)
上図のように、GNS3上で2つのVM（xubuntuとLubuntu）をルーターR1を介して通信させ、ルーターR1のf0/1インターフェース外側のトラフィックをQoSによりコントロールする。両側のVMで、iperf（xubuntuからLubuntuへの通信）を同時に複数実行させることにより、帯域制御の効果を検証する。

## 準備
### QoS制御未実施時の帯域
まずは、QoS制御がないときのEnd-to-Endの帯域をおおよそ把握する。
```
$ iperf -u -c 192.168.2.11 -b 10m

[ ID] Interval       Transfer     Bandwidth
....
[  3]  0.0-10.0 sec  11.9 MBytes  10.0 Mbits/sec   1.908 ms    0/ 8504 (0%)
```
上記の「10m」（送信時の指定帯域:10Mbit/s）を変化させたときの実行速度とパケットドロップ率は下記のとおり。

|UDP|10M|14M|15M|16M|20M|
|---|---|---|---|---|---|
|実行速度(Mbps)|10.0|14.0|15.0|14.8|15.1|
|drop(%)|0|0|0|5.4|24|

本環境のEnd-to-Endの帯域は、約15Mbpsと判断。なお、TCPでも実施したが、ほぼ同じような結果が得られている。

## ルーターR1の設定
### 共通
関連するところのみ記載。
```
ip dhcp excluded-address 192.168.1.1 192.168.1.10
ip dhcp excluded-address 192.168.2.1 192.168.2.10
!
ip dhcp pool P1
 network 192.168.1.0 255.255.255.0
 default-router 192.168.1.1 
!
ip dhcp pool P2
 network 192.168.2.0 255.255.255.0
 default-router 192.168.2.1 

interface FastEthernet0/0
 ip address 192.168.1.1 255.255.255.0

access-list 101 permit udp any any eq 2000
access-list 102 permit tcp any any eq 3000
```
- xubuntuおよびLubuntuがDHCPによりIPアドレスを取得
- インターフェースf0/0へのIPアドレスアサイン
- QoS対象とするUDP通信のポート番号指定（2000）
- QoS対象とするTCP通信のポート番号指定（3000）

### ケース１：CBWFQ(Class Based Weighted Fair Queue) - ％指定
CBWFQはよく使われるものらしい。ポリシーマップ内にQoS対象（アクセスリストで指定）を記述し、適用するインターフェースを指定するもの。次のサイトを参考にした。
- [Cisco QoS CBWFQとLLQの違い説明とコンフィグ](https://start-nw.com/netwrok/cbwfqllq/)
- [QoSの具体的な設定　CBWFQ帯域保証＋シェーピング](https://kokoro-nfe.tokyo/archives/10240)

ケース１では、帯域を％で指定。
```
class-map match-all cm-udp
 match access-group 101
class-map match-all cm-tcp
 match access-group 102
!
policy-map pm-list
 class cm-udp
  bandwidth percent 50 
 class cm-tcp
  bandwidth percent 30 
policy-map pm-cbwfq
 class class-default
  shape average 10000000
   service-policy pm-list
!
interface FastEthernet0/1
 ip address 192.168.2.1 255.255.255.0
 service-policy output pm-cbwfq
```
- アクセスリスト101（UDPポート2000）の帯域50%
- アクセスリスト102（TDPポート3000）の帯域30%
- あえて、最大帯域（shape average）を10Mbit/s
- インターフェースf0/1へのIPアドレスアサイン
- インターフェースf0/1へポリシーマップpm-cbwfqの適用

### ケース２：CBWFQ(Class Based Weighted Fair Queue) - 数値指定
ケース２では、帯域に具体的な数値を指定。
```
class-map match-all cm-udp
 match access-group 101
class-map match-all cm-tcp
 match access-group 102
!
policy-map pm-list2
 class cm-udp
  bandwidth 6000
 class cm-tcp
  bandwidth 5000
policy-map pm-cbwfq2
 class class-default
  shape average 15000000
   service-policy pm-list2
!
interface FastEthernet0/1
 ip address 192.168.2.1 255.255.255.0
 service-policy output pm-cbwfq2
```
- アクセスリスト101（UDPポート2000）の帯域6Mbit/s
- アクセスリスト102（TDPポート3000）の帯域5Mbit/s
- 最大帯域（shape average）を15Mbit/s
- インターフェースf0/1へのIPアドレスアサイン
- インターフェースf0/1へポリシーマップpm-cbwfq2の適用


### ケース３：CAR(Committed Access Rate)
CARは、物理インターフェースに直接的に制約を設けるようなものらしい。次のサイトを参考にした。
- [CAR ( Commited Access Rate )](https://www.infraexpert.com/study/qos18.htm)
- [Cisco 帯域制御計算式(rate-limit)とコマンド設定](https://genchan.net/it/network/cisco/1276/)

```
interface FastEthernet0/1
 ip address 192.168.2.1 255.255.255.0
 rate-limit output access-group 101 6000000 1125000 2250000 conform-action transmit exceed-action drop
 rate-limit output access-group 102 5000000 937500 1875000 conform-action transmit exceed-action drop
```
- インターフェースf0/1へのIPアドレスアサイン
- アクセスリスト101（UDPポート2000）の帯域6Mbit/s
- アクセスリスト102（TCPポート3000）の帯域5Mbit/s

## 検証
iperfサーバー側（Lubuntu）で、下記コマンドを実行。
```
iperf -s -u -p 2000 >> ./2000.log &
iperf -s -p 3000 >> ./3000tcp.log &
iperf -s -u -p 1245 >> ./1245.log &
iperf -s -p 8821 >> ./8821tcp.log &
```
iperfクライアント側（xubuntu）で、下記コマンドを実行。
```
iperf -p 2000 -u -c 192.168.2.11 -b 10m >> ./2000m_udp.log &
iperf -p 3000 -c 192.168.2.11 -b 10m >> ./3000m_tcp.log &
iperf -p 1245 -u -c 192.168.2.11 -b 10m >> ./1245m_udp.log &
iperf -p 8821 -c 192.168.2.11 -b 10m >> ./8821m_tcp.log &
```

### ケース１（CBWFQ:％指定、全体10Mpbs、UDPポート2000:50%、TCPポート3000:30%）
期待値的には下記となる。
||UDPポート2000|TCPポート3000|UDPポート1245およびTCPポート8821|
|---|---|---|---|
|帯域(Mbps)|5|3|2|

10回実施した平均値は下記である。
||UDPポート2000|TCPポート3000|UDPポート1245|TCPポート8821|
|---|---|---|---|---|
|帯域(Mbps)|5.025|3.083|2.011|0.2253|

ほぼ期待どおりの結果となっている。また、UDPポート1245およびTCPポート8821の結果から、トラフィックが大きいときに、UDP dominantな状況が発生していることがわかる。

### ケース２（CBWFQ:数値指定、全体15Mpbs、UDPポート2000:6Mbps、TCPポート3000:5Mbps）
期待値的には下記となる。
||UDPポート2000|TCPポート3000|UDPポート1245およびTCPポート8821|
|---|---|---|---|
|帯域(Mbps)|6|5|4|

10回実施した平均値は下記である。
||UDPポート2000|TCPポート3000|UDPポート1245|TCPポート8821|
|---|---|---|---|---|
|帯域(Mbps)|5.933|4.926|3.918|0.2394|

こちらも、ほぼ期待どおりの結果。UDP dominantについても同様。

### ケース３（CAR、全体15Mpbs、UDPポート2000:6Mbps、TCPポート3000:5Mbps）
||UDPポート2000|TCPポート3000|UDPポート1245およびTCPポート8821|
|---|---|---|---|
|帯域(Mbps)|6|5|4|

10回実施した平均値は下記である。
||UDPポート2000|TCPポート3000|UDPポート1245|TCPポート8821|
|---|---|---|---|---|
|帯域(Mbps)|5.76|0.7455|8.26|0.7149|

CAR(rate-limit)では、TCPの帯域確保が適切に行われていない。理由は不明。（設定が不適切？？）

## おわりに
一部ではあるが、Qos設定が機能していることを理解。QoSは奥が深いようだ。Part2にトライしたい。