通信についてちょっと詳しく(物理寄り)


[株式会社ラクス Advent Calender](https://qiita.com/advent-calendar/2018/rakus "ラクス Advent Calendar 2018") 
12/22(土)を担当することになった、某インフラエンジニアです。よろしくお願いいたします。

# はじめに
皆さんは機器同士の通信について深く掘り下げてみたことはありますでしょうか？

たとえば、サーバAにapacheをインストールしてwebサーバを立ち上げます。
このwebに自分のPC端末からブラウザでアクセスし、ホームページを開きます。


__・さて、このPC端末とサーバAの間ではどのような通信が行われているのでしょうか？__


雑に言うと、「httpプロトコルで通信が行われています」。
wiresharkなどで分析したことのあるエンジニアに詳細を聞くと、「TCPで3ウェイハンドシェイクが行われコネクション確立、HTTPプロトコルでGETリクエストが・・」などという回答が返ってくるでしょう。
httpのヘッダの中身について詳しく語ってくれる人も居るかもしれません。

ということで、今回はこの通信をwiresharkを使って詳細に見ていきましょう！

__・・・というのは、さすがに面白くない。__

ゲームやアニメに例えるならば、転校して入った高校がなぜか女の子が多いハーレム状態。
なぜか武道に自信満々のヒロインとぶつかり戦いになる。
しかし古流武術の使い手の主人公はヒロインに勝ってしまい「お前はいったい・・・何者なんだ・・・！？」
ってなる学園モノの導入くらい、ありふれた内容だからだ。

なので、今回はここから少しだけ通信を__「物理的な視点に寄せて考えてみたらどうか？」__ということを記事にしてみます。

# もくじ
- OSI参照モデルと物理層について
- 通信の流れ
- 通信ケーブルの種類
- 端末が日本、サーバが海外の場合、物理的にはどこを通っているの？
- 端末が携帯だった場合はどうなの？

# OSI参照モデルと物理層について
まずはOSI参照モデルあたりから復習していこう。気になるのはやはり、最下層の物理層あたり。
![OSI7.png](https://qiita-image-store.s3.amazonaws.com/0/118968/9612e233-dd91-fd0c-4849-15a0aaa89a3c.png)
OSI参照モデル自体はコンピュータの持つべき通信機能を階層構造に分割したモデルで、
異機種間でも通信できるように、みんな統一された仕様の元で色々作ろうぜって感じでモデリングされたもの。
通信の流れを理解するのに一番手っ取り早く、かつ、有名なモデルである。

インフラ界隈ではL3（レイヤ3、つまりネットワーク層）やらL2（レイヤ2、つまりデータリンク層）、
といった用語が一般的に使われているように、もはやOSI参照モデルが共通言語化している風潮があるので、
通信に関連するエンジニアであればこれを知らない人はいないレベルである。

エンジニアは通信を学ぶ際にまず「IPアドレス」から入ることがほとんどで、
それが故にネットワーク層/トランスポート層あたりの技術については明るい人が多い。
ググっても多数の記事が出てきて簡単に多くの情報を得ることができる。
冒頭で語ったwiresharkを取り上げた記事なんかも、だいたいこの辺の処理にフォーカスしたものが多い。

一方で、データリンク層まで下った話となると、
イーサネットなどネットワークエンジニアあたりのディープなテリトリーに踏み込み始めるため、
記事の割合としては急激に少なくなってくる印象がある。
ましてや、このグローバルクラウドの時代、データリンク層の話など知らなくても立派なシステムは構築できる。だがしかし、冒頭にも書いたが今回はあえて、その認識不要とも思える領域を見てみる、というのが主題である。

なお、OSI参照モデル以外に界隈ではDARPAモデルと呼ばれるTCP/IPの4階層モデルを良く見る。
![OSI2.png](https://qiita-image-store.s3.amazonaws.com/0/118968/255f9970-c39f-654e-b33d-6378b39f076f.png)
これについてネットや書籍で間違った理解が散見されているのでここで補足しておくが、
__OSI参照モデルとTCP/IPの階層モデルの各層は対をなしている、というのは間違いであり、完全に一致するものではない。__
上記の絵はあえて、各層をあたかも対比するかのようにサイズを合わせてみたが、別に左右が正確にリンクするわけではない。

ということで話がだいぶ逸れはじめているので、物理層の話をしよう。

物理層がカバーする範囲というのは、ざっくり言うと、
・電気信号の変換　(01010101010101、変調方式、etc.)
・ケーブルの特性/種類　(ツイストペア、UTP/STP、光、etc.)
・コネクタの形状　(RJ-45、RJ-11、LC、SC、etc.)
といったようなまさに「物理的」な仕様となる。

上記を見てお分かりのように(？)、
物理層のすべての項目について触れようと思うと非常に範囲が広く、気が遠くなるほどの膨大な量になってしまうため、以降、浅い情報量の記事になってしまう点ご了承いただきたい。
(っていうか、私自身にそこまでマニアックな知識がないってのが本当のところですが)

# 通信の流れ

ということで、OSI参照モデルについて復習したところで、通信が物理層を経由するために何をしているのか、冒頭に例示したwebアクセスの件で考えてみる。構成は極力簡易的にするためにPCとwebサーバが直接LANケーブルで接続されているものとする。

クライアントPC側は当然httpを理解できる。だってPCだし。ブラウザだし。
サーバ側も当然httpを理解できる。だってwebサーバだし。
でも間のLANケーブル、ここをhttpってどうやって通っているの？

![pcweb.png](https://qiita-image-store.s3.amazonaws.com/0/118968/269a4ddb-2912-cc74-52a6-bd1a460061b5.png)

ここで先ほどのOSI参照モデルを元にイメージしてみる。
![データの流れ.png](https://qiita-image-store.s3.amazonaws.com/0/118968/4c4432d4-9553-3830-b16c-62d7db18dfd2.png)


基本的に通信を行う際は、各層で__"ヘッダ"__という情報を付与して下位の層へ引き渡すことになっている。

7～5層目でまとめられたデータはトランスポート層で"ヘッダ"を付与され、ネットワーク層へ引き渡される。

ネットワーク層は「元々のデータ＋トランスポート層のヘッダ」を受け取るが、自分のテリトリー(ネットワーク層内)のことしか知らないので、元々のデータもトランスポート層のヘッダもひっくるめて、ひとまとめにデータと認識する。そのデータにネットワーク層は自分の"ヘッダ"を付けて、データリンク層に渡す。

データリンク層は「元々のデータ＋トランスポート層のヘッダ＋ネットワーク層のヘッダ」を受け取るも、自分のテリトリー(データリンク層内)のことしか知らないので、ひとまとめにデータと認識する。そのデータにデータリンク層の"ヘッダ"を付けて、ビット変換する。
ざっくり言うとこんな流れで通信は出発する。

HTTPに言い換えるなら、データ（実際のデータ＋HTTPヘッダ）に、
TCPヘッダが付与され、
IPヘッダが付与され、
イーサネットのヘッダが付与され、
（細かい話をするとプリアンブルやLCCやFCSなども付与され）一つのフレーム（データ）となる。
ここまで加工して、ようやく相手方にこれを送ることになる。

この際、通信効率化のために、フレームを決まった単位に分割して送信を行う決まりがある。
長いデータをひとまとめに送ると、通信の過程で例えば破損などした場合に再送が大変だったり・・などが理由。その1単位を__"パケット"__と呼ぶ。携帯のパケット料金、的なものはこの辺が語源だと思われる。
![paketto.png](https://qiita-image-store.s3.amazonaws.com/0/118968/6a8e4e70-a7e3-08c0-5089-eda9e75584ba.png)



で、LANケーブルを流れているのはさらに、ビット変換されたパケットを信号に__"変調"__したもの、である。
"変調"というのはざっくりこんなイメージ。
![wave_ook.jpg](https://qiita-image-store.s3.amazonaws.com/0/118968/4d827e4a-b50c-2067-b29b-d54a7f577ffc.jpeg)

例えばこの図は振幅変調(ASK)という変調方式で、0のときに電波を出さない、1のときに電波を出す、
という非常に単純に二進数のデジタルなデータを変調した方式である。
もちろんこれだと電波がないタイミングが、0のデータなのかデータが単に流れていないだけなのか区別がつかないため、LANにおける通信では実用に足るものではない。（あくまで"変調"を説明するための例）

LANの通信で実際に使われている変調の方式は、イーサネットの規格(IEEE 802.3 など)の中で定義されている。
例えばギガのLANケーブル等で"1000Base-T"などというような用語をエンジニアなら見たことがあるだろうが、この場合"Base"の部分が変調方式を示している。Base＝ベースバンド方式のこと。
が、しかしこの"変調"については詳細を書き始めるととてもじゃないがシステムのエンジニアの範疇を超えてくるラインになるので、申し訳ないがこれ以上の深追いは割愛する。というか、ここだけでもものすごく奥が深いし、ぶっちゃけ難しすぎて私の頭がついていかない。
まあ010101といったデータが、電波に変調されて流れている、とだけ理解しておけばいいだろう。

ちなみに、受信については、この「逆の変換」を行う。徐々にヘッダをひも解いて上位層に受け渡し、最終的に受信側アプリケーションがデータを受け取ることになる。
![データの流れ２.png](https://qiita-image-store.s3.amazonaws.com/0/118968/6395061e-2d0a-e37e-72a5-94f0193e98a5.png)


# ケーブルの種類

次に、そのパケットを転送するための媒体であるケーブルの種類について掘り下げてみよう。

いろんなものがあるが、有線であればだいたい
・メタル（銅線）
・光
に分別され、いわゆる下図のような"LANケーブル"として家庭や会社で使われているものは"メタル"にあたる。
![41tKmHEoK8L._AC_US200_.jpg](https://qiita-image-store.s3.amazonaws.com/0/118968/cd0f03c0-b84d-1f0a-a89d-08b83f1a417b.jpeg)
光ファイバについてはあまり馴染みはないかもしれないが、SC、FC、ST、LC、ほか数多くあり、
マンションなどで光回線を引いている場合はSCなんかを見かけたことがあるかもしれない。
![connector.jpg](https://qiita-image-store.s3.amazonaws.com/0/118968/0d41dff7-8d46-0dc3-ee8b-e584da4771c9.jpeg)

今回はLANケーブルについてその中身をさらに見ていく。(というか光のケーブル持ってないし・・)

いわゆる良く見るLANケーブルは__"ツイストペアケーブル"__と呼ばれ、
1本のLANケーブルのように見えるがその青いゴムの中身は8本の導線が2本ずつより合わせてできている。
![lan_make4_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/118968/8e765fb8-c8c4-7ff8-32c6-f4ae2af94f48.jpeg)
中身はこのような感じ。
よく使われるストレートの配線だと、橙白、橙、緑白、青、青白、緑、茶白、茶の順にケーブルを並べ、
それをコネクタに刺すことによって形成されている。
コネクタ部分が透明なLANケーブルを見ると良く分かると思う。
![lan_make6_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/118968/e43b1afd-d6cd-a90d-7ea3-36adc7eadddc.jpeg)

ツイストペアケーブルにはEIAが規格化したカテゴリが存在し、
よく「カテ5」とか「カテ6」といわれるのがそれに当たる。
・カテゴリ5e 1000BASE-T
・カテゴリ6e 10GBASE-T (UTP)
・カテゴリ7  10GBASE-T (STP)
など。

UTPというのはケーブルにシールド処理を施していないもので、通常の良く見るLANケーブルはUTPである。
STPはシールド処理を行うことでノイズに強くしたものだが、家庭や会社の執務室内でよく見かけるものではない。


# 端末が日本、サーバが海外の場合、物理的にはどこを通っているの？
ということで、PCとwebサーバを直接LANケーブルでつないだ場合の通信の流れ、
そのケーブルの素材について見てきたが、今度はここで話をものすごく大きくしてみよう。
PCが日本、webサーバが海外だった場合、通信はどこを通っているのだろうか？
PCとサーバの拠点が違う以上、ワープしているわけじゃないだろうし何らかの伝送路がどこかに存在するはずだ。

ということで調べてみた。
当然ながら私自身も生で見たことがないのでリアリティは全くないが、
__実は海底に通信用のケーブルが這わせてある。__

遠隔で通信する方法といえば、海底ケーブル以外には衛星を使った通信も存在するが、基本的には海底ケーブルの方が圧倒的に早く、現状はほぼほぼ海底ケーブルを経由して通信されている。
考えてもみれば、例えば日本からアメリカまで海底を経由すれば1万kmの距離を、衛星の場合、宇宙を経由して何万kmも無駄に移動することになるので、その時点で海底ケーブルの方に圧倒的アドバンテージがあるのは明確である。

海底ケーブルの詳細についてはこのサイトが詳しい。

__海底ケーブルのヒミツ__
https://jpn.nec.com/kids/himitsu/07.html

子供向けの解説サイトだが、それゆえに非常に分かりやすく丁寧に書かれている。
ケーブルの形状や帯域以外に、ケーブルの沈め方や敷設船に乗る技術者の苦労まで書かれていて大変興味深いw
このサイトを見れば概要が簡単に分かる点と、そもそも私が海底ケーブルについて全く知識がない点もあり、
申し訳ないが今回はこのサイト紹介にとどめることにする。

# 端末が携帯だった場合はどうなの？
最後に、有線から離れて携帯の話に触れてみる。

まずは、携帯電話で遠くの知人と会話するケースを考えてみよう。
当然ながら、自分の携帯と知人の携帯が直接つながって交信するわけではない。
携帯電話での通信は、携帯と近隣の__"基地局"__と呼ばれる設備の間で電波のやりとりをすることが前提となっている。

![fig_03_01.gif](https://qiita-image-store.s3.amazonaws.com/0/118968/f3c1b022-c41b-d17a-3f10-6f09dff43c3c.gif)
[NTTサイトより引用](https://business.ntt-east.co.jp/content/nw_system/03.html) 

北海道と沖縄で通話する場合でも、実質携帯がやっていることは近隣の基地局との通信である。
ゆえに携帯電話にはゴツい装備は必要なく、小型でOKなのである。

基地局は全国各地の電柱やビルや鉄塔のような設備に建てられている。
場所さえ知ってれば肉眼で確認することも可能。
また、複数の基地局は基地局制御装置によって制御されている。

で、上記の北海道と沖縄間の通話の場合、当然基地局同士に距離があり、かつ間には無数の基地局がある。
Aさんの電波を受け取った北海道の基地局は、どうやって沖縄までそれをもっていくの？という疑問がわく。
(上記の画像でいう、「様々な通信設備」と書いてあるところ)
その点については、わかりやすく言うと「ルーティング」用に__"交換機"__という設備が存在する。
Aさんの電波を基地局経由で交換機に一旦蓄積し、複数の交換機を移動しながら目的の基地局と交信する形となる。
なお、SIMの認証もこの交換機で行われている。

さて、ではこれがwebサーバへのアクセスならばどうなるのか？
実は通話のケースと良く似ていて、携帯からパケットを送信した場合も同様に基地局を経由し、
今度はパケットを制御する"パケット交換機"なるものでルーティングされ、
最終的に各キャリアのIT通信設備からグローバルなインターネットへ旅立つこととなる。

ちなみに、最近某キャリアで大規模な電波障害があったが、
それはこのパケット交換機部分での障害が起因となったものである。


# さいごに
ということで、通信の物理寄りの話を雑多にしました。
AWSをお使いの皆様には不要な知識だったかもしれません。

結局のところこの記事を通して私が言いたいことは一言だけ。

__「LANケーブルの自作は楽しいぞ」__

以上。

# 参考
海底ケーブルのヒミツ
https://jpn.nec.com/kids/himitsu/07.html
ネットワークエンジニアを目指して
https://www.itbook.info/
cman.jp
https://note.cman.jp/network/lan_cable_make.cgi
携帯電話・通信の仕組みと歴史
https://business.ntt-east.co.jp/content/nw_system/03.html