ネットワーク関連の雑多な用語整理
[履歴] [最終更新] (2015/01/13 00:13:21)
最近の投稿
注目の記事

TCP/IPモデル

教科書的には OSI 参照モデルが有名ですが、実際の現場ではTCP/IPモデルを使用した通信がほとんどです。TCP/IPモデルは以下の 4 層から構成されます。

  • アプリケーション層: OSIのセッション層 + プレゼンテーション層 + アプリケーション層
  • トランスポート層: OSIのトランスポート層
  • インターネット層: OSIのネットワーク層
  • ネットワークインターフェイス層: OSIの物理層 + データリンク層

PDU (Protocol Data Unit)

OSI参照モデルの文脈で、以下の3層におけるカプセル化されたデータには特別な名称があります。PDU はそれらの総称です。

  • トランスポート層: TCPのPDUをセグメント、UDPのPDUをデータグラムとよびます
  • ネットワーク層: パケット
  • データリンク層: フレーム

イーサネットのケーブル

イーサネットは OSI 参照モデルにおける (物理層および) データリンク層のプロトコルです。プロトコルは共通ですが、実際にネットワークを構築する際には通信速度や通信ケーブルに関してネットワーク管理者による選択の自由があります。自由度があるとはいえ、経験上ネットワーク規模によって好ましい選択肢があることが知られており、規格として整理されています。

10BASE-2
10BASE-T

規格名の最初の数値 10 は通信速度が 10Mbps (bps: bits per second) であることを意味します。ハイフン '-' 以降の部分はケーブルの種類と長さを示します。無印 2 は同軸ケーブル 200 メートル前後を意味します。また一部の例外はありますが、T は UTP (Unshielded Twisted Pair), F は光ファイバを意味します。その際、通信速度 100Mbps の場合をファストイーサネット、1Gbps の場合をギガビットイーサネットとよぶことがあります。通信速度が求められるイーサネットには光ファイバが採用され、求められないイーサネットには同軸ケーブルが採用されます。UTP には後述の通りカテゴリーによる品質の幅があるため一概には判断できませんが、基本的に同軸ケーブルと光ファイバの中間に位置するケーブルです。

ツイストペアケーブル

より対線 (ついせん) ともよばれます。8本の銅線があり、以下の二種類があります。

  • UTP (Unshielded Twisted Pair): よくあるLANケーブルです。最大セグメント長 (ケーブル長) は100メートルとされており、それ以上はハブやスイッチを使用して仮想的に延長する必要があります
  • STP (Shielded Twisted Pair): ノイズに強いケーブルです。特殊な環境で利用されます

カテゴリー

ツイストペアケーブルには「カテゴリー」という品質を示す数値があり、その数値が大きいほど品質が高く高額になります。

  • カテゴリー3 (Cat3): 10BASE-T 向け
  • カテゴリー5 (Cat5): 100BASE-TX (ファストイーサネットの一種) 向け
  • カテゴリー6 (Cat6): 1000BASE-T (ギガビットイーサネットの一種) 向け

ポート

ツイストペアケーブルの両端には RJ-45 コネクタがよく用いられます。コネクタに 1-8 の番号を付与したとき、両端のコネクタの同じ番号が電気的に接続されている場合をストレートケーブルとよびます。そうでない場合をクロスケーブルとよびます。これはケーブルの区分ではなく、コネクタの接続方法で決定される区分です。使用するデバイスのイーサネットインターフェイスのポートの仕様によって使い分けます。

  • MDIポート: 1,2が送信で3,6が受信。PCやルータはこれ
  • MDI-Xポート: 1,2が受信で3,6が送信。ハブやスイッチはこれ

MDIポートとMDI-Xポートの組み合わせの場合のみストレートケーブルを使用します。それ以外の組み合わせではクロスケーブルとなります。違う種類のポートならばストレートケーブルで、同じ種類のポートならばクロスケーブルとも理解できます。自動的に送信と受信の銅線を判別してくれる Auto-MDI ポートというものがあります。Auto-MDI ポートのデバイスに関しては、どちらのケーブルも使用可能です。

物理層とデータリンク層のデバイス

ハブ

MACアドレスによるフィルタリングができないことから、現在はあまり使用されていません。物理層 (レイヤ 1) までのデバイスです。信号を整形増幅する機能と全ポートに送信することで 1:N 接続を可能にする機能 (集線装置) を有します。スイッチングハブ (単にスイッチともよぶ) で代用可能です。

スイッチ

データリンク層 (レイヤ 2) までサポートするデバイスです。レイヤ 2 スイッチやスイッチングハブともよばれます。ポートとMACアドレスの対応関係を記憶するMACアドレステーブルを持ちます。MACアドレスを学習する機能があり、データを受信するとテーブルを更新します。送信時にテーブル登録があれば該当ポートのみに送信し、なければ全ポートにフラッディングします。

コリジョンドメインはネットワークにおいて半二重通信 (受信と送信が同時にできない通信) となる範囲です。同じコリジョンドメインで異なる二つ以上の通信を同時に行うためには、例えば CSMA/CD (Carrier Sense Multiple Access/Collision Detection) といった仕組みが必要になります。ハブはネットワークすべてで一つのコリジョンドメインを共有するのに対し、スイッチは基本的にポート毎にコリジョンドメインが独立しています。よって、スイッチのバッファリングを利用できることもあり、全体として擬似的に全二重通信となります。効率のよくない CSMA/CD を使用する必要もありません。

スイッチには VLAN (Virtual LAN; 仮想LAN) という機能があり、仮想的に複数のスイッチとして機能してネットワークを分割することができます。Catalyst スイッチには既定で VLAN1 が default という名前で生成されています。スイッチの全てのポートはこの VLAN1 に属しています。

ブリッジ

現在ではあまり使用されません。機能としてはスイッチと同じです。ポート数がスイッチよりも少なく、スイッチがハードウェアで処理することをブリッジではソフトウェアで処理するため動作も低速です。

レイヤ 3 スイッチ (参考)

マルチレイヤスイッチともよばれます。教科書的には、ルータはソフトウェア処理である一方でレイヤ 3 スイッチはハードウェア処理なため高速に動作します。しかしながら、現在ではルータとの違いは明確ではなく、レイヤ 2 スイッチを拡張したものであるという歴史的経緯を表現した言葉であると解することもできます。

インターフェイス名

ルータやスイッチにはボックス型とシャーシ型があります。ボックス型は備えつけられた固定のものが一つですが、シャーシ型はモジュールを複数設置できます。各モジュールには複数のインターフェイスがあり番号が付与されています。

例 FaX/Y

  • X: モジュール番号
  • Y: インターフェイス番号

WAN接続などに使用されるシリアルインタフェイスは Se0/0 などと表記されます。

イーサネットで送信されるデータ (フレーム) の構成

イーサネットヘッダ

レイヤ2ヘッダともよばれます。

宛先MACアドレス6バイト + 送信元MACアドレス6バイト + タイプ部2バイト (合計14バイト)
  • MACアドレス: 前半の3バイトはベンダーコード、後半の3バイトはメーカによるシリアル番号
  • タイプ部: 上位層のプロトコルの識別子。IPならば 0x0800 の2バイト

タイプ部はイーサネットにだけある特別な仕組みではなく、カプセル化を基本とするプロトコルスタックの各層に備わっている仕組みです。例えば IP ヘッダにはトランスポート層のプロトコル識別子としてのプロトコルフィールドがありますし、トランスポート層のヘッダにはアプリケーション層の識別子であるポート番号フィールドがあります。

イーサネットトレーラ

データの「後」に付与されます。トレーラはイーサネットにだけある特別な仕組みではなく、他のプロトコルでも同様の仕組みが採用されていることがあります。データリンク層のデータは壊れやすいため FCS (Frame Check Sequence) というトレーラを付与します。具体的には FCS に CRC (Cyclic Redundancy Check) という値を入れておき、受信側で壊れていないかを確認します。

IPヘッダ

IPバージョン 4bit + ヘッダ長 4bit
    + 本パケットの扱いでルータに重視してほしいサービス種別 8bit + ヘッダを含むパケット長 16bit
パケット分割で使用するパケットの識別子 16bit + パケット分割の制御フラグ 3bit
    + 同じ識別子のパケットでデータ復元する際の本パケットの断片位置 13bit
TTL 8bit + 上位プロトコルの種類 (TCP: 6, UDP: 17, ICMP: 1) 8bit + ヘッダ部用のチェックサム 16bit
送信元IPアドレス 32bit
宛先IPアドレス 32bit

TCP/IPにおいて、レイヤ 2 のプロトコルごとに最大データサイズ MTU (Maximum Transmission Unit) が規定されています。例えばイーサネットは 1500 バイトです。IPパケットのサイズが MTU を越える経路を使用する場合にパケット分割が発生します。これは IP フラグメンテーションともよばれます。分割されるのは IP パケットのデータ部分のみです。分割時には IP ヘッダ情報は可能な限りコピーされます。分割されたパケットはそれぞれ独立して宛先 IP アドレスまで転送されていき、宛先において復元されます。レイヤ 2 の通信におけるイーサネットフレームは以下のようになります。

イーサネットヘッダ + MTU以下 + イーサネットトレーラ

ICMP

ICMP (Internet Control Message Protocol) は IP の上位プロトコルですが、ネットワーク層のプロトコルとして扱われます。IP に不足している機能を補うためのプロトコルであり、IP が使用できる端末では必ず ICMP も実装されています。ICMP パケットは以下のようになります。

イーサネットヘッダ + IPヘッダ + ICMPヘッダ (ICMPメッセージ) + データ + イーサネットトレーラ

ICMPヘッダ (ICMPメッセージ)

大まかな通知の種類 8bit: 8 エコー要求、0 エコー応答、3 宛先到達不能、11 時間超過
    + 詳細な通知種別コード 8bit + エラー検査のためのチェックサム 16bit
各通知に必要なデータ 32bit 単位

例えば ping コマンドは ICMP を利用しています。正常時にはエコー要求に対してエコー応答を返します。到達できなければ宛先到達不能が返されます。TTL が 0 になり破棄されたならば時間超過が返されます。

IPアドレス

ネットワーク部 + ホスト部 で 32 ビットです。IPアドレスの扱いはすべて対等ではなく、サブネットマスクを用いないデフォルトのネットワーク部の桁数によってクラス分けされています。クラスには A,B,C,D,E がありますが、一般利用されるものは A,B,C です。クラス D はすべてマルチキャスト用に使用されます。

  • クラスA: 第一オクテット 0-127 (0*******/8)
  • クラスB: 第一オクテット 128-191 (10******/16)
  • クラスC: 第一オクテット 192-223 (110*****/24)
  • クラスD: 第一オクテット 224-239 (1110****/32)

ループバックアドレス

クラス A の 127 はループバックアドレスとして使用されます。そのうちよく採用されるのは「127.0.0.1」です。TCP/IP が正常に動作していることを確認する目的や、いわゆる localhost として自分自身の PC が提供するサービスの動作確認に使用されます。「127.0.0.1」に ping が届かない場合、経路上の障害以前の問題として NIC 周辺の障害が疑われます。

リンクローカルアドレス

DHCP クライアントは、何らかの障害によって IP アドレスの取得に失敗すると APIPA (Automatic Private IP Addressing) という機能によってクラス B の 169.254.0.0/16 範囲のリンクローカルアドレスとよばれる IP を自分で設定します。その際、重複が発生しないように他の機器の使用状況を事前に自動確認します。ルータは宛先の IP アドレスがリンクローカルアドレスのパケットを転送しません。リンクローカルアドレスは DHCP が存在しない小規模で閉じたネットワークを形成し、同一ネットワーク内での通信を行う目的で考案されました。AutoIP や自己割り当て IP ともよばれます。

各クラスのプライベート IP アドレス

グローバル IP アドレスとして確保されていないアドレスです。

  • クラスA: 10.0.0.0/8
  • クラスB: 172.16.0.0/12
  • クラスC: 192.168.0.0/16

VLSM (Variable Length Subnet Mask)

可変長サブネットマスク VLSM は「サブネット毎に」異なった長さのサブネットマスクを使用できる技術です。対して、固定長サブネットマスク FLSM (Fixed Length Subnet Mask) ではサブネットマスクがすべてのサブネットで同じ長さである必要があります。VLSM で IP アドレッシングするためには、ルーティングプロトコルが対応している必要があります。対応しているものをクラスレスルーティングプロトコルとよび、対応していないものをクラスフルルーティングプロトコルとよびます。クラスレスルーティングプロトコルには RIPv1 が該当します。

CIDR (Classless Inter-Domain Routing)

IP アドレスをクラスで扱うと割り当ての際に無駄が発生する場合があります。CIDR はクラス全体ではなく部分的に IP アドレスを割り当てることで浪費を防ぐ機構です。VLSM と似た概念ですが VLSM は技術で CIDR は機構です。

クラスの概念を廃したアドレスのことをクラスレスアドレスとよびます。クラスレスアドレスにおけるネットワーク部の長さをプレフィックス長とよびます。プレフィックス長が N のアドレスは *.*.*.*/N と表記されます。これを CIDR 表記とよぶこともあります。

デフォルトルート

サブネット間通信の規定の窓口であるデフォルトゲートウェイとは別物です。ルーティングテーブルにおいて 0.0.0.0/0 が宛先となっているエントリのことです。/0であるため、任意の IP アドレスが合致します。ルーティングテーブルのエントリとは「ネットワークアドレス」と「インターフェイスおよびネクストホップの IP アドレス (または直接接続)」の組み合わせです。合致するエントリがなければパケットは破棄されますが、任意の宛先に合致するデフォルトルートをエントリに登録しておくことでパケットの破棄を回避できます。ただし、他に合致するエントリがあれば合致度合いが低いためデフォルトルートは採用されません。これをロンゲストマッチとよびます。

ルーティングテーブルの管理方法

  • スタティックテーブル: 管理者がエントリを追加します
  • ダイナミックルーティング: ルーティングプロトコル (RIP, OSPF, EIGRPなど) が自動的に各々が好ましいと判断したエントリを追加します。判断基準をメトリックとよびます

ルーティングプロトコル

  • RIP: 中小規模ネットワークで使用されます
  • OSPF: 大規模ネットワークで使用されます
  • EIGRP: シスコ独自のルーティングプロトコルです (シスコ製品でしか使用できません)

NAT (Network Address Translation)

ルータに備えられる IP 変換のための機能です。変換の度に NAT テーブルを更新して IP アドレスの変換情報を保持します。また、NATによって IP ヘッダの送信元アドレスが書き換えられます。変換の際にポート番号の情報まで含めてテーブルに保持する場合を IP マスカレードとよびます。これは NAPT (Network Address Port Translation) や PAT (Port Address Translation) ともよばれます。ポート番号まで含めて保持することで、一つのグローバル IP と複数の LAN 内プライベート IP アドレスの変換が可能になります。

TCPヘッダ

送信元ポート番号 16bit + 宛先ポート番号 16bit
シーケンス (Seq) 番号 32bit  ← セグメントの識別番号
確認応答 (ACK) 番号 32bit  ← 受信済みセグメントの範囲を示す
TCPヘッダ長 4bit + 将来の機能拡張用の予約 6bit + コードビット 6bit + 送信側に通知する受信側のウィンドウサイズ 16bit
エラー検査用のチェックサム 16bit + URGコードビットが有効の場合に参照される緊急ポインタ 16bit
(オプション 32bit単位で可変長 >= 0)  ← ここを除くとTCPヘッダは 20 バイト

コードビットの詳細

  • URG: Urgent あまり使用されません。緊急データが含まれることを示す
  • ACK: 確認応答 (ACK) 番号フィールドが有効であることを示す
  • PSH: Push バッファリングせずにアプリケーションにすぐに渡すことを要求
  • RST: Reset 接続を強制終了することを相手に通知
  • SYN: Synchronize スリーウェイハンドシェイクによるコネクション確立を要求
  • FIN: Finish コネクションの切断を要求。リセットと異なり相手にお伺いを立てる

スリーウェイハンドシェイク

=> SYN:1,ACK:0,Seq番号:M,ACK番号:0
<= SYN:1,ACK:1,Seq番号:N,ACK番号:M+1
=> SYN:0,ACK:1,Seq番号:M+1,ACK番号:N+1

以上のやり取りによってシーケンス番号の初期値 M, N が決定されます。最初のセグメントを特に SYN パケットとよびます。それ以外のセグメントは ACK コードビットが常に 1 であり ACK パケットとよびます。初回 M, N を除く新規セグメントの Seq 番号には、受信した最後のセグメントに含まれる ACK 番号を使用します。ACK 番号はスリーウェイハンドシェイク中は相手のセグメント Seq 番号 K に「K+1」とするだけです。それ以降の通信では、受信したセグメント Seq 番号 K に受信したTCPヘッダを除くデータのバイト数 L を足して ACK 番号が「K+L」のセグメントを返します。データ量が 0 バイトのセグメントに対する返信時には相手のセグメント Seq 番号が「K+0」となり変化しないことになります。データが 0 バイトのセグメントについてはそもそもACKを待つ必要がないためこれで問題になりません。

通信の終了

FIN コードビットが 1 の FIN パケットをお互いに送信して通信終了の合意を取ります。

=> ACK:1,FIN:1,Seq番号:K,ACK番号:L
<= ACK:1,FIN:0,Seq番号:L,ACK番号:K+1 (通信終了の合意)

<= ACK:1,FIN:1,Seq番号:L,ACK番号:K+1
=> ACK:1,FIN:0,Seq番号:K+1,ACK番号:L+1 (通信終了の合意)

宛先ポート番号 16bit の補足

ポート番号フィールドは 16bit であるため 0-65535 の範囲になります。そのうち 1-1023 はウェルノウンポート番号です。

  • ftp: 20,21
  • telnet: 23
  • smtp: 25
  • http: 80
  • pop3 110

送信元ポート番号 16bit の補足

クライアント側のポート番号は自動設定されるのが通常です。ポート番号フィールドは 16bit であるため 0-65535 の範囲が使用可能ではありますが、そのうちランダムポートとよばれる 1025-65535 の範囲から選ばれます。

MSS (Maximum Segment Size)

上述の MTU から IP ヘッダと TCP ヘッダを除いた値を MSS (Maximum Segment Size) とよびます。

[イーサネットヘッダ][MTU以下][イーサネットトレーラ]

における MTU 部分を MSS を用いて表現すると以下のようになります。

[イーサネットヘッダ][IPヘッダ][TCPヘッダ][MSS以下][イーサネットトレーラ]

UDPヘッダ

送信元ポート番号 16bit + 宛先ポート番号 16bit
UDPヘッダとデータの合計 (データグラム) の長さ 16bit + エラー検査用のチェックサム 16bit

宛先ポート番号の補足

UDP を利用するアプリケーション層のプロトコルとしては DHCP や TFTP、NTP、ルーティングプロトコルの RIP が有名です。それぞれのポート番号はウェルノウンポートの範囲に含まれます。UDP を利用するアプリケーションは「動画や音声などのパケットロスよりもリアルタイム性を重視するもの」や「伝えたい情報量がとても小さくデータグラムにすべて含めることができるため、スリーウェイハンドシェイクを行う TCP を用いると非効率なもの」です。後者には DNS や DHCP が該当します。

  • DHCP: UDP 67,68
  • TFTP: UDP 69
  • NTP: UDP 123
  • RIP: UDP 520
関連ページ
    概要 TCP/IP モデルのうちトランスポート層ではなく、インターネット層およびネットワークインターフェイス層のパケット (正確には PDU) を扱う低レイヤープログラミングの雑多なテクニックをまとめます。『ルーター自作でわかるパケットの流れ』などを参考にしています。バックアップ目的で書籍のサンプルコードをホスティング
    概要 EC2 インスタンスから AWS を利用する場合、AccessKey などを直接 AMI 内に配置する必要はありません。起動時に IAM ロールを指定すれば EC2 はそのロールに付与された権限で AWS を利用できます。鍵を直接 AMI 内に配置しないためセキュリティ上も安心です。 設定例 AWS IAM ロールを新規作成 (Role Name:
    概要 VyOS は Debian GNU/Linux をもとにしたオープンソースの OS です。かつて無償提供されていた Vyatta Core から fork して開発されています。ルーティングソフトウェア Quagga やこちらのページに記載した OpenVPN を利用した、ソフトウェアルータとしての機能を有しています。AWS EC2 の AMI も Marketplace で提供されており
    概要 AWS ELB に ALB と NLB が追加され、こちらのページで使用方法を把握した従来の ELB は CLB (Classic Load Balancer) とよばれるようになりました。本ページでは CloudFormation の基本的な使い方を把握する目的で ALB/NLB/EC2 スタックを作成するテンプレートを YAML で記述します。その際、
    概要 TCP/IP ソケットプログラミングについて、C 言語を用いた TCP クライアントの基本的なサンプルコードを記載します。 サンプルコード #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> // ソケット API を利用するため。 #include <unistd.h> //
    概要 pcap (packet capture) というパケットキャプチャ用APIの実装には、UNIX系のlibpcapとWindowsのWinPcapがあります。これらのライブラリを利用したアプリケーションとしては、UNIX系のtcpdumpとWindowsのWiresharkが有名です。また、スクリプト言語にはlibpcap/WinPcapのラッパーが存在しており、パケットキャプチャアプリケ
    概要 こちらのページでは、特定の LAN に対して各種サービスを提供するための VyOS 設定を把握しました。本ページでは、複数の LAN をつなぐルータとしての設定方法をまとめます。具体的には、スタティックルーティングおよびダイナミックルーティング (RIP/OSPF/BGP) の設定方法を把握します。 設定方法を検証するための構成
    概要 こちらのページで VirtualBox へのインストール方法を把握した VyOS について、DHCP/DNS/NAT/Firewall 等の基本的な設定方法をまとめます。 設定方法を検証するための構成 VirtualBox のゲスト OS として VyOS 用の VM を二つ用意します。手順はこちらです。
    概要 CSS は構造化が難しくスタイルを宣言していくだけで目的が達成できてしまいます。上書きの繰り返しによって肥大化しないための設計ヒントをまとめます。 詳細度の高騰が発生した CSS は破綻しやすい CSS の詳細度はルーティングテーブルのロンゲストマッチのようなものです。一致度の高いとされるセレクタで指定したスタイルが優先的に適用されます。同じ詳細度の場合は後から指定したスタイルで上書か
    概要 シスコ社の製品のうち、ルータは Cisco*** という製品名でスイッチは Catalyst*** という製品名です。いずれも *** は機種番号で、数字が小さいほど小規模ネットワーク向けとなっています。例えば資格試験 CCNA Routing and Switching では小規模および中規模ネットワークが対象です。そのため、中小規模のネットワークのルータおよびスイッチが手元にあるとよい
    概要 インターフェイスに IP を設定しただけでは他のデバイスと通信できません。各デバイスにルーティングテーブルを設定する必要があります。こちらのページに記載した通り、ルーティングテーブルの設定方法には動的に自動設定するものと、静的に手動設定するものの二種類があります。ここでは静的に手動設定するスタティックルートの方法を紹介します。
    コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin
    概要 HTTP Proxy として利用される squid について、設定例を記載します。 localnet の定義 127.0.0.1 に対しては localhost および to_localhost という組み込みの名称のキーワードが利用できます。その他のプライベートIP に対するキーワードは独自に定義する必要があります。
    概要 GCP VPC について基本的な使い方を記載します。 custom サブネットモードによる VPC 作成 VPC 作成 gcloud compute networks create mynetwork --subnet-mode=custom サブネット作成 gcloud compute networks subnets create mysubnet-us --network=my