良いNW構成図の「理由」について考えてみる (3) - ヒモ

## はじめに

全4回の3回目です:

* [良いNW構成図の「理由」について考えてみる \(1\)](https://qiita.com/corestate55/items/cc04bfd4c0bd1bcca789)
* [良いNW構成図の「理由」について考えてみる \(2\) \- 箱](https://qiita.com/corestate55/items/0bf658c494098e143e30)
* 良いNW構成図の「理由」について考えてみる (3) - ヒモ
* [良いNW構成図の「理由」について考えてみる \(4\) \- そのほか](https://qiita.com/corestate55/items/fcf3b64a0b89bf5f5672)

ネットワークの構成要素、ノード(箱) と リンク(ヒモ) のうち、[前回は箱について解説しました](https://qiita.com/corestate55/items/0bf658c494098e143e30)。今回はヒモについてです。

## 「ヒモ」のバリエーション

### ヒモによって何を表現するか

ヒモ (リンク線) について、前注意処理される ([前回](https://qiita.com/corestate55/items/0bf658c494098e143e30)の 図3 参照) 属性としては、色(色相・強度) + 向き/共線性・長さ・幅・曲率・追加マーク というところでしょうか。ヒモ (線) といってもいろいろ考えることがあります。数量・順序・名目をエンコードする際のチャンネル ([前回](https://qiita.com/corestate55/items/0bf658c494098e143e30)の 図10 参照) では 長さ (length)・角度 (angle)・傾き (slope) とかかな。

これも Interop 2019 の図凡例から見てみましょう。

![3-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/ff972e9b-8eba-2380-f049-196c2faffbb5.png)
図1: Original: Interop 2019

帯域

* 図1 では太さでリンク帯域 (ordinal) を表現しています。太いほどよりたくさんデータを流せるという物理的イメージ (アナロジー) もあり、太さで帯域を表現するのは一般的です。とはいえ、6 種類のリンク帯域を太さだけで表現するのは難しい。もし (B) のように白黒だったとして、違いがパッと見てわかるかというのは微妙。そのため色/彩度によるコーディングを併用しているのだと思います。
* 太さをもっとはっきり変えるという手もあるでしょうが、そうすると図の中で線 (リンク) が使う面積が増えるということでもあり、図全体のレイアウトや視認性への影響を考慮する必要があります。太すぎて過度に強調されると邪魔だし、線が細すぎると視認性が悪くってしまう。

セグメントやそのほか上位の分類・グループとの対応付け

* 図1 ではリンク種別を表すために色を使っていましたが、色をセグメントの対応関係を表すのにつかうことがあります。図2 では、セグメント (VLAN) の色分けの上、単一の VLAN だけを流す物理リンク (access port) にはその VLAN の色を付けて VLAN がどこにつながっていくのかを分かりやすくしています。黒の物理リンクは複数の色が重なるところ、という意味で黒 (色を混ぜていくと黒になるというアナロジー)。これも、VLAN の用途ごとに色系統 (赤系・青系・緑系など) の使い分けを決めたりします
* ほかに、セグメントの重要度とかセキュリティレベルとかで色を変える、システム別とか管理単位別に色を分けるようなケースも考えられるでしょう (より上位の分類・グループとの対応付けを色で表現するなど) 。

![3-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/758ca327-02ce-40bb-b124-5920709dc7a3.png)

図2: VLAN(セグメント)によるヒモの色分け

リンク種別の表現: L1 (物理) では複数種類のケーブルがありますし、対応してポート(トランシーバ)にも使い分けがあります。

* Interop図ではリンクにかぶせて 図3 のポート番号ラベルを載せてリンク接続ポートを指定していますが、あわせて端点の色によるコーディングでケーブル種別 (nominal) を入れていますね。(図を描くのは大変だけど汎用的)
* ヒモ端点の書き方 (端点に●を付けたり■をつけたりする) でケーブル種別の表現をしたりすることもあります。

![3-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/4af3f79f-5d82-4b16-b386-d143c2483c08.png)
図3: Interop2019

![3-4b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/8a71a9ad-4e0f-b60d-4f16-b6156bec07ea.png)
図4: [Creating Advanced Network Diagrams \| networkdiagram101\.com](http://networkdiagram101.com/?page_id=19421), Chap.4 Laying the Foundation, p.51 (一部抜粋) & Chap.7 Draw Hierarchically  p.141 (一部抜粋)

### ヒモの色・明度/彩度(透明度)の使い分け

色によるコーディングとスケーラビリティ : 色自体は識別しやすい視覚変数なのですが、はっきり明確にわかる数には限度があります。微妙な色の違いは認識しにくいので、同系統の色を多数使わなければいけなくなる状況では色だけで違いを認識させるのは避けたほうがよいです。Interop 図のように、リンク種別やケーブル種別など、せいぜい数種類のもので、色系統が明確に分けられるもの (種別数に上限があるもの) は色によるコーディングをするのに向いています。VLAN などのように数十～数百と数が増えるものは、ひとつずつ分けないで大きなグループごとに色を設定し、ラベルなどで情報をつけるといった工夫が必要になるでしょう。

濃淡・透明度の利用 : 濃淡・透明度を使うことで、重なり合いや順序関係(重要度や優先度)などを表現することができます。「線の交差を極力避ける」というのが定石ですが、交差してしまうものをどのように処理するかについてはまたあとからも出てきます。(ヒモの交差の話は後述します。)

ヒモの色と点線・二重線などの線種の組み合わせを使うことも考えられます。そこにどういう意味を載せるか次第……というのもありますが、種類が増えれば増えるほど「見て識別」するのが難しくなっていきます。装飾的なものはなるべく必要最低限に、シンプルで識別しやすい表現を考えるべきです。

## ヒモ(リンクの線)を曲げないこと・交差を最小にすること

### 直線と折れ線

定石「ヒモを曲げない」「交差を最小にする」、について話をするまえにヒモを曲げて上に重なってしまってうまくいかないパターンを見てみましょう。

![3-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/fbae0437-620d-e319-b4a3-0df9c51d5f98.png)
図5: ヒモ交差のよくない例

この図は[私が作っている netoviz というツール](https://github.com/corestate55/netoviz)で線の描画テスト用に用意したちょっと極端なサンプルです。通常、同じノード間を 5 本もつなぐことはあまりないと思いますが、2本 LAG でメッシュにつなぐ…というのであればありうるかな……。この図はプログラムで生成しているものなので線の種類やつなぎ方がどうしても画一的になってしまって、こういう状況がどこかしらで発生してしまいます。

図5(A) でどのポートとどのポートがつながっているか、はっきりわかるでしょうか? (B) で青色にハイライトした線のようにパッと視認できましたか? ここで何がつながっているのかがわかりにくい理由は「良い連続の法則」で説明できます。良い連続の法則は切れ目や変化のない図形・滑らかにつながる図形がひとつのまとまりとして認識されるというものです。

![3-6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/ca572835-b715-49b8-8f95-087e9572701d.png)
図6: [プレグナンツの法則｜3inowayosuke｜note](https://note.com/3inowayosuke/n/n10bb3ee4e25c)

図5 はかなりきれいに (滑らかに) 複数の線が交差したり重なってしまったりしているために線をうまく分離して認識できていません。ここで「ヒモを曲げない」とどうなるかを試してみましょう。

![3-7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/d033a24c-af80-b432-38f4-519fa781f457.png)
図7: 線が重なるところを直線に置き換え (Visio)

図5 より 図7 のほうが見やすいというかパターンがわかりやすいですよね。図5 ではふたつのスイッチでたすき掛けに交差するところが水平・垂直線で全部ひとかたまりに見えてしまいますが、直線だとそれらがはっきり分離して識別できます。

### 直線と折れ線の使い分け

ではなぜ netoviz では直線ではなく折れ線 (step line) にしているのか? という疑問が出てきますよね。一部直線を使ったほうが明らかに見やすいのにそれをしていない。結論からいうと、データを基に自動的に図を描画する場合、ノードやポートの並び、図全体の配置など、線の使い分けや重なり方に影響する要素を統一したアルゴリズムで扱うことが難しいためです。これも具体的に見てみましょう。

直線と折れ線でどういう見え方になるかを試してみます。図8 の上段は直線・下段は折れ線です。[右列は入れ子表示の深さを増やして図の複雑度を上げています](https://qiita.com/corestate55/items/9a1194cdb2c54d80c08e)。

![3-8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/1fcafa33-f434-222e-49b9-5fc633efe0ea.png)
図8: ヒモのタイプによる違い : 直線と折れ線

前注意属性には向きと共線性というのがあります。また視覚変数に対する感度 (channel) では、角度や傾きはわりと識別しやすい項目になります。なので、線の向きがバラバラ (ランダム) になってくると、本来ひとつのパターン・グループとして認識されるべきものがそう見えなかったり、逆に関係のないものがまとまって見えたりしてしまいます。だからなるべく向きをそろえたい。ですが直線の場合、線自体をいじることができないんですよね。直線をいじろうとするとその始点・終点を動かすしかないわけで、つまり直線の端点になるノードやポートの配置、ひいては図のレイアウト全体をうまいこと調整できないといけない。

このように、ソフトウェアで図を作成するとき、線をつなぐふたつのノード + その線に重なるほかのオブジェクトなどを踏まえて線を使い分けるというのが非常に難しい[^1a] です。そういうときにベターな見え方になりやすいのが折れ線だったりします。折れ線 (step line) だと、線の重なりかたを線のパラメータだけで調整できる…「折れる」位置を線の端点(ノード配置)によらずに調整できる[^1b]。あと、必然的に線の向きがそろうので平均化されるというか、どれも同じ線として見える (良くも悪くも)。

[^1a]: そうした全体のレイアウトをうまく処理するアルゴリズムにまったくアテがない……。Netoviz はグリッドベースの半手動レイアウトという形ですが、位置にも意味がある以上そこを大きく変えられないし。位置をそこそこ維持しつついい感じにヒモをつなぐってどうしたらいいんだろうか。

[^1b]: 折れ線も放っておけば重なりまくるわけで、netoviz ではなるべく線が重ならないように線の中点 (折れる位置) をずらす処理が入っています。これだけでも結構面倒。

ちなみに、折れ線が重なったときに線の連続性が少しでもわかりやすくなるように、角を丸めてあります。図9(A) のように折れ線の角が直角な場合、線が重なった時に (a, b, c, d) のパターンがあるように見えてしまいます。(B)角を丸める ことで連続性が悪い (a, d) を除外できます。まあ線が重なっちゃう時点で見にくいのでそもそもこういう状況を避けるべきでなんですが、それでも角を丸めないよりは丸めたほうが、折れ線の連続性が明確になるので、相対的には見やすくなります。

![3-9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/b9174a8c-bffc-ce41-19af-6edce1f16cd3.png)
図9: 直角折れ線と角丸折れ線

もうひとつネットで目に付いた図をもとに配線パターンの話をします。

![3-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/74165e0f-3db6-296a-cb48-dea1f50049a2.png)
図10: Original: [SECURITY CCIE LAB | Tom G CCIE Blog](https://ccie4all.wordpress.com/category/security-ccie-lab/)

図10 (A) オリジナルは(ページタイトル等からするに) CCIE ラボの演習用に GNS3 で作った図のようです。これも演習の中身は見ていないのでこのネットワークがどういった意図でこうつながっているのかとかは見ていないのですが、リンクの交差が多すぎてよくわからないですね。何を狙ってどこがつながっているのか、どのルータがグループ (接続パターン) として同等なのか、これだとよくわかりません。

真ん中の四角形フルメッシュにつながったルータがどうやらコア(中核)なのと、両脇にいる FW(ASA) があることから何かしら対称性がありそうだ (左右対称であれば対称軸…上下方向に階層があるのが普通)、くらいでしょうか。これを手掛かりに整理していくと (B) のようになりました[^3]。どうやら赤いヒモ (フレームリレー?) のネットワークと黒いヒモのネットワークで二重構造で、赤いヒモのネットワークについては外周部に分離したために構造 (R3/FrameSwitch が中核になる) はちょっとわかりにくくなってしまいましたが、赤黒合わせた全体としてはこちらのほうがわかりやすいでしょう[^2]。

[^2]: こうしたふたつのネットワークを重ねたつくりは、OOB (Out-of-band) の運用・管理ネットワーク (management network) を作る場合によく出てきます。サービス用(図10では黒)と管理用(図10では赤)があって、赤・黒それぞれにコアがあるような感じ。

[^3]: ルータの配置 (階層性・対称性) をそろえる・ルータ整列と合わせて内部のコア周辺は直線でとし、ヒモのパターン (向き) をそろえる・赤いヒモは折れ線重ならないように外周を通って交差を避ける、というのをやると、全体としてだいぶ見やすくなります。

「ヒモを曲げない」と「交差を最小にする」にあたって何が言えるでしょうか?

> できるだけヒモ同士が重なる箇所が最小になるような配置を考える努力は可能です。また、一番重要なヒモから前面に置くようにします。更に、場所から場所へと大きくまたぐようなヒモがあり、それが主経路などの重要なものである場合は、箱を再配置するなどの根本的な見直しをすべきです。
>  [図面とともにあらんことを！：第二面 \- ネットワークのゲンバ\(2014\) \| Interop Tokyo 2014](https://www.f2ff.jp/interop/2014/noc/shownet-topology-map_4.php)

> 図を見やすくするために、線同士の交差が少ない配置にしたり、仮想毎に同じレベルに配置したりしているようです。 線を使う時に、線を曲げないことも目線移動を自然にする際のポイントとのことでした。
>  [Interopのネットワーク図を描くエンジニア:Geekなぺーじ](https://www.geekpage.jp/blog/?id=2010/6/10/2)

* ヒモを直線で描く場合、その端点となるノード(箱)それ自体の配置……すなわちネットワークの構成要素全体・図のレイアウト全体の調整が必要になります。これは 図8-9 のところで解説しましたし、図10 は実際にレイアウトを整理してみた例です。直線は線単体でのごまかしができないので図全体のレイアウトが重要になります。
* ヒモ曲げるかどうか・交差させるかどうかはケースバイケースで使い分けが必要です。上の引用でも「できるだけ交差させない」「重要なヒモから」となっていて、順位付けや選択性があることがわかります。何でもかんでもやってしまうと 図9(A) のようにぐちゃぐちゃになってしまいます。
  * それを整理した 図10(B) では赤いヒモだけ折れ線で、しかもかなり ad-hoc な折れ線にしています。手書きだとこういう使い分けもできるんですが、これをソフトウェア (アルゴリズム) でやるのはまあ至難の業ですね……。ソフトウェア描画の場合どうしても一様な線になってしまいます。その場合、線単体のパラメータで交差や重なりかたを変えられる折れ線のほうがコントロールしやすいです。

### 曲線を使う?

ここまで「ヒモ」とは2点をつなぐ直線または折れ線で、いずれも直線によって構成される線でした。では曲線を使うことは? あまり使わないですが、自宅図では使っているところがあります。トンネルです。

![3-10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/e3483a3d-0d26-a4d1-8153-713ee4d46958.png)

図11: 曲線の利用

曲線で「同じ形」にそろえるのが難しいので、複数の曲線を形状だけでうまくグルーピングする……類似のものだと認識させるというのも難しいです。曲線全部がひとつのグループか、あるいは全部個別のものかになる。なので色などの変数を組み合わせてで分類する。

逆に、形状から "地の線" (直線ベースの線) とは明らかに異質なものとして見せられるので、図11 のように他の線やノードをまたがるトンネルなど、重ねて書くと紛らわしいもの・別種のものに対して使う、違いを強調するのに向いています。

## ヒモの交差の処理

上でも触れましたが、Interop 図では線の縁取りと重なり合いの順序の調整で交差したところがわかりにくくならないようにしています。この辺りは、良い連続の法則をうまく使って見せ方を考えるってところですね。

> 無関係なヒモ同士が重なった時、どう処理したら見やすくなるでしょうか。ヒモの周囲を半透明の白などで縁取りして「最前面」に置いておけば、沢山重なった場所であってもバックボーンなど重要なものを埋もれさせません。
>  [図面とともにあらんことを！：第二面 \- ネットワークのゲンバ\(2014\) \| Interop Tokyo 2014](https://www.f2ff.jp/interop/2014/noc/shownet-topology-map_4.php)

![3-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/23d75649-7c71-8cae-f67b-cbc5fbe35c4c.png)
図12: Interop2019図

![3-12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/c2635612-b3d9-8bc5-1777-bb86a2bd54d8.png)
図13:  [TIP 4 \- Avoid crossing links \| networkdiagram101\.com](http://networkdiagram101.com/?page_id=158)

![3-13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/9d97d28a-5870-c585-2cf2-f09305fbe250.png)
図14: [Creating Advanced Network Diagrams \| networkdiagram101\.com](http://networkdiagram101.com/?page_id=19421), Chap.12 Technical Diagram Examples, p.263 (一部抜粋)

線が交差するところでちょっと縁取りが入るだけでも見え方が違う。

![3-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/ee2288ca-1014-4c1b-beac-d33f06c77082.png)
図15:  [Creating Advanced Network Diagrams \| networkdiagram101\.com](http://networkdiagram101.com/?page_id=19421), Chap.12 Technical Diagram Examples, p.252 (一部抜粋)

図15 は Visio ですが、Visio ではコネクタをうまく使うとこのように交差ポイントは「ジャンプ」するような形で線が描画されます。折れ線については角を丸める (連続性を高める) かどうかもポイントになってきます。

縁取り線にせよ交差ジャンプにせよ、うまくつながっているように見せる・連続性を持たせる・順序やパターンをそろえることで見えやすさ (読みやすさ) が変わってきています。

## ヒモのスケーラビリティ

箱が増えたときにヒモが密集したり重なり合ってしまう「見えにくさ」(毛玉問題) を回避するためどういった工夫があるかを見てみましょう。([前回の「アイコンとリンクのスケーラビリティ」のところも参照](https://qiita.com/corestate55/items/0bf658c494098e143e30#%E3%82%A2%E3%82%A4%E3%82%B3%E3%83%B3%E3%81%A8%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3)してください。そこではヒモの数に合わせてアイコンの大きさを変えたりするのはあまりよろしくないという話をしました。)

Interop 図ではアイコンにリンク線が集中しすぎないよう 図16 のように点線で接続を水平(垂直)に分散させる描きかたをとっています。

![3-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/cda66df6-f7d9-27aa-43b7-588d73a4d0b8.png)
図16: Original: Interop2019図

実体としては (B) のように配線されているものを (A) のように表現しているわけです。(A) はスイッチが持つ L2 セグメント (VLAN) にぶら下がるようなイメージ、バスに多数のノードがぶら下がるような描きかたになっています。(A) のように水平・垂直レイアウトにすることでラベルの配置や読みやすさが変わってきます。また、スイッチ (緑色アイコン) の下にぶら下がるノード (オレンジ色アイコン) の数が多くなればなるほど、(B) のほうはスイッチに線が集中してポートラベル等を入れるのが難しくなるでしょう。(A) のほうが多数のノードに対してレイアウトが描きやすく、読みやすい = スケーラブルな表現になっています。

同様に、冗長化されたスイッチペアに多数のノードがぶら下がる接続の例をもうひとつ見てみます。

![3-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154230/d1006796-2037-debe-b39a-858e7eff9b73.png)
図17: Original: [Creating Advanced Network Diagrams \| networkdiagram101\.com](http://networkdiagram101.com/?page_id=19421), Chap.12 Technical Diagram Examples, p.253 (一部抜粋)

図17 は抜粋したので見切れていますが、下位のデバイスが 20 台くらいあります。これを縦一列に並べるとレイアウト上縦長になりすぎるため、互い違いに並べて縦の長さを圧縮してあります。でもそうすると、(B, B') のように直線リンクではどうしてもほかのオブジェクトと被ってしまうんですよね。レイアウトや見せ方に応じてヒモの選択が必要になります。そのうえでポート番号ラベル等を含めた全体の見やすさとかを考えることになります。(読みやすさ・描きやすさ・今後メンテナンスしやすいか etc)

図17 は線の上にラベルかぶせてしまっても図が読み取れるようになっています。これくらい整理できていると、「線を追う」ではなく「順番を数える」になるんですよね。なので、おそらくある程度ヒモを重ねてしまっても意味が取れます (図10(B) の赤いヒモのようにある程度かぶせてしまう)[^4]。順序のルール・パターンが明確になることで省略したり抽象化したりできますし、そうすることでスケールさせやすくなります。

[^4]: 図10(B) も 図17 もポートラベルとかが入っていないのである程度ヒモを束ねても読み取れます。ポートやリンクごとのラベルを入れたいのだと個別に描く必要が出てくるかも。

## まとめ

ヒモに関する定石「なるべく直線」「交差を避ける」について、その理由 (良い連続の法則) と、状況別の使い分けの話をしました。計算機で描画するネットワーク図ではどうしても人が処理するような ad-hoc なリンク処理を実装するのが難しく、一様なヒモの描き方になってしまいます。そのあたりをうまいこと使い分けるのができればもうちょっと良くなるんだろうけどどうしたらいいものやら……。線を引く "だけ" の話ではあるのですが、全体のレイアウトにも影響しますし、見やすいネットワーク構成図ではかなりヒモの取り回しに時間を割いて調整しているはずです。

今回までで、箱とヒモの話をざっとふれたんですが、まだあといくつか工夫ポイントがあるのでそれは[次回](https://qiita.com/corestate55/items/fcf3b64a0b89bf5f5672)にやりましょう。