[まとめ]TCP/IPとは?OSI参照モデルをレイヤーごとに解説!

私はソフト開発歴4年ですが、TCP/IPの通信の知識が不確かだったため、先日のバグ対応で時間を使ってしまう結果となりました。。。

どのようにデータのやりとりが行われるかが漠然とイメージできるだけでも、対応にかかる工数やコードの質は一気に良くなったのにと反省、、、

なのでこれを機会に、レイヤー1からレイヤー7までの役割をまとめました。

エンジニアの最低限の知識として、知っておいて損はないです。

スポンサーリンク

レイヤー1

ケーブルやwifiを介して信号を運ぶ物理的な転送のこと。

レイヤー2

ネットワーク内でのデータの転送。

レイヤー2ではレイヤー1で使われているケーブルや信号によってルールが異なる。
簡単に分類すればLAN用とWAN用がある。
LAN用でよく使われるのは、あのよく聞くイーサネットである。

イーサネットではMACアドレスが使用される。
MACアドレスとは、NICというインターフェースにつけられた固有のアドレスのことである。

ちなみに、Wiresharkなどでパケットキャプチャすると、NICが受け取る全てのキャプチャを見れるので、自分以外の宛先のフレームも見ることができる。

ハブ

ハブは信号の増幅と成形を行う。
それ以外は何もしない。
つまり、ハブは衝突ドメインになる。

ハブでは、全員にフレームが届くため、MACアドレスを見て自分宛でなければ破棄する仕組みである。
受け取り側は自分宛のフレームかどうか確認するため、ネットワークの効率が下がる。
全員にフレームを届けることをフラッディングという。
つまりフラッディングは効率を下げてしまう。

全二重通信の場合、ケーブル内では送信用と受信用が分かれているため衝突しない。
だが、ハブはフラッディングするので、ハブ内で衝突が起こる。
ハブに複数から同時に信号が届くと、1つのポートに2つのフレームを流そうとして衝突する。

スイッチ

衝突は無駄な通信を増やす原因となり、伝送効率が落ちる。
衝突を減らすためにはハブではなくスイッチを使う。

スイッチでは、宛先のMACアドレスのポートに対してのみフレームを流す。
そのため、2つのフレームが同時にが届いても、宛先が異なれば衝突しない。

スイッチの仕組みとしては、ポートとMACアドレスが対応するアドレステーブルを作成し、MACアドレスから対応するポートを調べる。
学習前はどのポートか分からないためフラッディングする。
マルチキャストやブロードキャストもフラッディングする。

もう1つの衝突を回避する仕組みとして、同じ宛先のフレームが同時に届いた場合はバッファリングする。
バッファリングは、後から届いたフレームをバッファーに退避させ、先のフレームの送信が終わってからバッファーに置いておいたフレームを送信する仕組みである。
つまり、バッファーを使えば、1つのポート宛に2つのフレームが届いたとしても、衝突しなくなる。

バッファーが溢れそうな場合はポーズフレームを送信し、送信を中断させる。
これをバックプレッシャー/IEEE802.3xという。

CSMA/CDでは、誰かが送信中(自分は受信中)は、自分は送信できない(キャリア検知 Collision Detection)。これを半二重通信という。
スイッチを使うと衝突しないため、CSMA/CDが不要になり誰かが送信中も送信できるようになる。これを全二重通信という。
つまり、衝突ドメインはスイッチで分割される。

障害対策のため冗長構成にするが、そうするとブロードキャストが伝搬するブロードキャストストームが発生する。
それを防ぐのがSTPである。

STPを利用すると、せっかく2本の回線で接続していても、帯域幅が1本の扱いになりもったいない。
そこで、複数の回線を1本の回線にみたてるリングアグリゲーションを使う。

レイヤー3

ネットワーク間でのデータの転送。
通信には4つのアドレスが必要。
1. 送信元MACアドレス(自分のインターフェースのMACアドレス)
2. 送信先MACアドレス(送信先IPアドレスをもとにARPで調べる)
3. 送信元IPアドレス(手動で静的に設定、もしくはDHCPで動的に設定)
4. 送信先IPアドレス(ユーザーかアプリケーションがドメイン名もしくはIPアドレスを指定する。ドメイン名が指定された場合はDNSが解決する。)

ルーター

・ブロードキャストを流さない。
・ネットワークの接点の数だけインターフェースと、異なる論理アドレスを持つ。

IPアドレスは、「ネットワーク番号」、「サブネット番号」、「ホスト番号」と並ぶ。
サブネット番号までを、サブネットマスクの1で示す。

ネットワーク部のビット長を「/」以下に記載する方法をCIDR表記という。
例:192.168.0.8 /21
その時のビット長をプレフィックス長という。

衝突ドメインはスイッチが、ブロードキャストドメインはルーターが区分けする。ハブはどちらにも影響しない。

DHCP

クライアントにアドレスプールにあるIPアドレスを割り当てる。

ホストがネットワーク外に移動した場合などのため、リース期限を設定しておく。

ARP

まずは、送信先IPアドレスをもとにARPテーブルから送信先MACアドレスを調べる。

ARPテーブルで見つからなければ、送信先MACアドレスが分からないため、ブロードキャストして問い合わせる。

IPアドレスは変わらないが、PCを買い替えたり、インターフェースが故障してMACアドレスが変わるとARPテーブルの内容と一致しなくなり、送信できなくなる。
そのためARPテーブルの内容は一定時間で削除されるようになっている。

DNS

DNSサーバは各組織に1つずつあり、その組織のドメイン名のみを管理している。
他の組織のIPアドレスを調べる時は、他の組織のDNSに問い合わせる。

DNSがいるおかげで、WebサイトやメールでもIPアドレスを直接打ち込まなくてすむ。

ルーティング

ルーターがなければ別のネットワークにデータグラムを送ることはできない。
同じハブに2台のPCをつなぎ、2台が別のネットワークに属するように設定すると、もう1台にはデータグラムが届かず、2台は通信できない。
なぜなら、宛先が別のネットワークにあればルーターへ送信する、宛先が同じネットワークにあれば直接宛先へ送信する。と決まっているからである。
この別のネットワークとの境界となるルーターのことをデフォルトゲートウェイと呼ぶ。

ルーターがルーティングテーブルをもとに次の経路を選択する。
宛先ビットが最も一致する次のルーターにホップする。(最長一致のルール)
ルーティングテーブルで宛先が一致しない場合は、パケットを破棄する。

メトリックが最小ものをルーティングテーブルにのせる。

ルーター間で経路情報をやりとりするルールのことをルーティングプロトコルという。
ルーティングプロトコルにはディスタンスベクター型(RIPなど)とリンクステート型(OSPFなど)がある。

スタティックルーティング(静的ルーティング)

静的ルーティングは小さなネットワークでは使い勝手が良いが、障害発生時に手動で経路を切り替えなければならず、大きなネットワークには向いていない。

ダイナミックルーティング(動的ルーティング)

動的ルーティングではルーティングプロトコルに則り、勝手に経路を変更してくれるが、以下の2点を考慮する必要がある。
1. ルーター同士が情報を交換しあうため、データの転送効率が少し下がる。回線が低速な場合は注意が必要。
2. 交換した情報から最適な経路を計算する必要があるため、ルーターの処理能力が必要となる。

ルーティング

他のネットワークへデータを送りたい場合は、下記の手順となる。
1. デフォルトゲートウェイにARPし、デフォルトゲートウェイのMACアドレスを取得する。
2. ホストA(自分)は宛先MACアドレスをデフォルトゲートウェイにして、宛先IPを送信先にしてパケットを送る。

3. デフォルトゲートウェイはルーティングテーブルから次の送信ポートを決定し、ARPする。
4. ARPで入手したMACアドレスに送信する。(この例では宛先に届くとしているが、中継ルーターのMACアドレスとなる可能性もある)

IPアドレスには以下の2種類がある。
1. グローバルIPアドレス(ICANNが管理しており、勝手に割り振れない)
2. プライベートIPアドレス(自由に割り振れるIPアドレス)

ネットワークにつながないTCP/IP通信ならば、グローバルIPアドレスは必要なく、プライベートIPアドレスだけで十分である。
グローバルIPアドレスはIPv4では枯渇しており、対策としてNATもしくはNAPTが使用される。

NATは、ネットワーク外と通信する際にプライベートIPアドレスをグローバルIPアドレスに変換する。そのためグローバルIPアドレスを複数のプライベートIPアドレスで共有できる。
しかしこれには問題があり、保有しているグローバルIPアドレスまでしか変換できないため、同時接続数が増えるとグローバルIPアドレスが足りなくなる。

それを解決したのがNAPTである。
プライベートIPアドレスとポート番号をグローバルIPアドレスに変換するため、1つのグローバルIPアドレスを以下のように同時に使用できる。
NAPTテーブル
192.168.0.1:1024 <-> 200.0.0.1:1001
192.168.0.8:1025 <-> 200.0.0.1:1002

NAPTは、NAPTテーブルにないポートからの内部ネットワークに入れないため、セキュリティ面にも効果がある。
ただし、サーバを公開したい場合なども外部からの通信ができなくなる。
そのため、公開したいポート番号を静的にNAPTテーブルに追加しておく必要がある。

もう1つ注意する点としては、IPヘッダー(レイヤー3)のIPアドレスしか変換されないため、FTPのようにデータ部分に記載されたIPアドレスとポート番号を使用するプロトコルは使えなくなる。
この場合、FTPに対応しているNAPTを購入する必要がある。

経路集約すると、ルーティングテーブルを小さくでき、結果、次のホップ先アドレスを検索する時間を短縮できる。
デフォルトゲートウェイのデフォルトルートである0.0.0.0も集約経路である。
デフォルトルートにはスタティックルーティングが使われる。

AS内部のルーティングをIGP、AS間でのルーティングをEGPという。
IGPではネットワークの数が少なく再送も簡単なため、UDPもしくはIPで通信する。
EGPは、大量の情報をやり取りするため、再送などのコストがIGPに比べて高い。
そのため、柔軟な経路選択ができ、また高い信頼性を求められるので、TCPで通信を行う。

VLAN

スイッチでつながっている場合、接続している全ての機器にブロードキャストは届く。
接続機器の数が増えると、無駄な処理が増えてしまう。
なのでルーターでネットワークを分けてしまえばいいが、ルーターはLANインターフェースがそこまで多くなく、数が必要になるが、そもそもルーターは高価である。
そこで、スイッチ自体でネットワークを分断できる仕組みをつくった。
それがVLANである。

VLANでは、スイッチの各インターフェースにVLANIDを割り振る。
割り振りは動的なアドレスベースのものと静的ベースのものがある。

VLANはネットワークを分断しているので、VLANIDが異なると、異なるネットワークとなる。
つまり、同じスイッチに接続していても、VLANIDが異なる機器の通信ではルーターが必要となる。

VLANごとに回線でつないでは、VLANIDの数だけ各スイッチを回線でつながなければならなくなる。
できれば1本の回線で済ませたいが、そうするとどのVLANから送信されたか分からなくなる。
そこでトランクリンクを使用する。

VLANを使ったスイッチとルーターの接続も同様となるため、トランクリンクをつかってもいいが、VLANスイッチとルーターを1つにした便利なものができた。
それがレイヤー3スイッチである。
レイヤー3スイッチは、VLAN内部にルーターを持たせた高速に通信できる機器である。

レイヤー4

転送したデータに対して必要な処理を行うレイヤー。
プロトコルとしてTCPとUDPがある。

PCにデータが届いても、それがメールのデータかホームページのデータか分からない。区別するためにポート番号がある。
ポート番号はアプリケーションに1対1で対応しており、実際のデータ通信はアプリケーションとアプリケーションが行っている。
つまりポート番号が分からなければ通信できない。
そのため、よく使われるアプリケーションのポート番号は決められている。
これをWell known portという(1~1023番)。
他にはRegistered portがある(1024~49151番)。
それ以降は自由に使ってよい(49152~65536番)。

TCP

処理しきれないデータが溢れ出る(オーバーフロー)のを防ぐためのフロー制御する。

受信側が「次は〇〇からのデータをください」と送信元に確認応答を送る。
〇〇を確認応答番号という。
確認応答番号とあわせて、残りのバッファー量(ウィンドウサイズ)を送る。
ウィンドウサイズまでは一気に送ってもオーバーフローしないと送信側は判断できる。
これをウィンドウ制御という。

UDP

リアルタイム性が求められる通信で使われる。

コネクションを確立しないため相手のアドレスが不明でも送信できるので、ブロードキャストが必要なアプリケーションでも使用される(DHCPなど)。
TCPでもできるが、通信相手全員を知った上でコネクションを確立する必要があるうえ、それぞれでバッファーを用意しなければならない。

レイヤー5~7

TCP/IPではレイヤー5~7は1つのプロトコルとして扱われることが多い。
例:HTTP, FTP, SMTP

レイヤー5

データのやり取りをセッションとして成立するよう管理する。
これをダイアログ制御という。

レイヤー6

ハードウェアやOSによる違いをなくしたデータ交換を可能にする。
例えば、ASCIIとEBCDICを使用するPC間の通信などでは、このレイヤーで転送用コードに変換することで、文字コードが異なっても通信できている。
また、圧縮や暗号化も行う。

レイヤー7

これまでのレイヤー1~6はそれぞれ独立しており、他のレイヤーに影響は及ぼさないが、役割として1つ上のレイヤーのために働いている。
このレイヤー7の場合は上のアプリケーションのために働いており、アプリケーショの目的に応じたプロトコルを選択するレイヤーである。

まとめ

TCP/IPは障害対策のため、分散ネットワークとなっており、1~7までの独立したレイヤーにより成り立っている。

Windowsの便利コマンド

・print route

コメント

タイトルとURLをコピーしました