ネットワークの基本

ネットワークの基本

Ethernet

Ethernet は IEEE 802.3 標準で規程されたネットワークプロトコルです。ほとんどの有線のネットワークインターフェースカード (NIC) は Ethernet を使って通信します。

Ethernet は、ネットワークプロトコルの OSI model の第 2 層にあたり、データリンク層とも呼ばれます。 Ethernet の話をすると、 ローカルネットワークレイヤー 2L2リンクレイヤーデータリンク層 といった用語をしばしば聞くことでしょう。

In an Ethernet network, the hosts connected to the network communicate by exchanging frames. Every host on an Ethernet network is uniquely identified by an address called the media access control (MAC) address. In particular, every virtual machine instance in an OpenStack environment has a unique MAC address, which is different from the MAC address of the compute host. A MAC address has 48 bits and is typically represented as a hexadecimal string, such as 08:00:27:b9:88:74. The MAC address is hard-coded into the NIC by the manufacturer, although modern NICs allow you to change the MAC address programmatically. In Linux, you can retrieve the MAC address of a NIC using the ip command:

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
     link/ether 08:00:27:b9:88:74 brd ff:ff:ff:ff:ff:ff

Conceptually, you can think of an Ethernet network as a single bus that each of the network hosts connects to. In early implementations, an Ethernet network consisted of a single coaxial cable that hosts would tap into to connect to the network. However, network hosts in modern Ethernet networks connect directly to a network device called a switch. Still, this conceptual model is useful, and in network diagrams (including those generated by the OpenStack dashboard) an Ethernet network is often depicted as if it was a single bus. You’ll sometimes hear an Ethernet network referred to as a layer 2 segment.

In an Ethernet network, every host on the network can send a frame directly to every other host. An Ethernet network also supports broadcasts so that one host can send a frame to every host on the network by sending to the special MAC address ff:ff:ff:ff:ff:ff. ARP and DHCP are two notable protocols that use Ethernet broadcasts. Because Ethernet networks support broadcasts, you will sometimes hear an Ethernet network referred to as a broadcast domain.

NIC がEthernet フレームを受信すると、デフォルトでは NIC は宛先 MAC アドレスが NIC のアドレス (またはブロードキャストアドレス) に一致するかを確認し、 MAC アドレスが一致しない場合はその Ethernet フレームを廃棄します。コンピュートホストでは、この動作は期待されるものではありません。なぜなら、そのフレームはインスタンスの 1 つに宛てたものかもしれないからです。 NIC は promiscuous モード (無差別モード) に設定することができ、このモードでは、 MAC アドレスが一致しない場合であっても、すべての Ethernet フレームがオペレーティングシステムに渡されます。 コンピュートホストでは、必要な NIC を常に promiscuous モードに設定する必要があります。

As mentioned earlier, modern Ethernet networks use switches to interconnect the network hosts. A switch is a box of networking hardware with a large number of ports that forward Ethernet frames from one connected host to another. When hosts first send frames over the switch, the switch doesn’t know which MAC address is associated with which port. If an Ethernet frame is destined for an unknown MAC address, the switch broadcasts the frame to all ports. The switch learns which MAC addresses are at which ports by observing the traffic. Once it knows which MAC address is associated with a port, it can send Ethernet frames to the correct port instead of broadcasting. The switch maintains the mappings of MAC addresses to switch ports in a table called a forwarding table or forwarding information base (FIB). Switches can be daisy-chained together, and the resulting connection of switches and hosts behaves like a single network.

VLAN

VLAN is a networking technology that enables a single switch to act as if it was multiple independent switches. Specifically, two hosts that are connected to the same switch but on different VLANs do not see each other’s traffic. OpenStack is able to take advantage of VLANs to isolate the traffic of different tenants, even if the tenants happen to have instances running on the same compute host. Each VLAN has an associated numerical ID, between 1 and 4095. We say “VLAN 15” to refer to the VLAN with a numerical ID of 15.

To understand how VLANs work, let’s consider VLAN applications in a traditional IT environment, where physical hosts are attached to a physical switch, and no virtualization is involved. Imagine a scenario where you want three isolated networks but you only have a single physical switch. The network administrator would choose three VLAN IDs, for example, 10, 11, and 12, and would configure the switch to associate switchports with VLAN IDs. For example, switchport 2 might be associated with VLAN 10, switchport 3 might be associated with VLAN 11, and so forth. When a switchport is configured for a specific VLAN, it is called an access port. The switch is responsible for ensuring that the network traffic is isolated across the VLANs.

今度は、 1 台目のスイッチのスイッチポートがすべて利用され、組織が 2 台目のスイッチを購入して、1 台目のスイッチに接続して、利用できるスイッチポート数を拡張する、というシナリオを考えましょう。 2 台目のスイッチも VLAN 10, 11, 12 が使用できるように設定します。ここで、スイッチ 1 の VLAN ID 10 に設定されたポートに接続されたホスト A が、スイッチ 2 の VLAN ID 10 に設定されたポートに接続されたホスト B に Ethernet フレームを送信する場面を考えます。スイッチ 1 は Ethernet フレームをスイッチ 2 に転送する際に、そのフレームは VLAN ID 10 に関連付けられていることを伝える必要があります。

2 台のスイッチは互いに接続されていて、両方のスイッチで VLAN が設定されている場合、スイッチ間の相互接続に使用されるスイッチポートは、どの VLAN からの Ethernet フレームももう一方のスイッチに転送できなければいけません。さらに、受信側のスイッチが VLAN に対応するホストだけがそのフレームを受信できることを保証できるように、送信側のスイッチは Ethernet フレームに VLAN ID のタグを付けなければいけません。

A switchport that is configured to pass frames from all VLANs and tag them with the VLAN IDs is called a trunk port. IEEE 802.1Q is the network standard that describes how VLAN tags are encoded in Ethernet frames when trunking is being used.

OpenStack クラウドでテナント分離を行うために物理スイッチで VLAN を使う場合、すべてのスイッチポートをトランクポートとして設定する必要がある点に注意してください。

It is important that you select a VLAN range not being used by your current network infrastructure. For example, if you estimate that your cloud must support a maximum of 100 projects, pick a VLAN range outside of that value, such as VLAN 200–299. OpenStack, and all physical network infrastructure that handles tenant networks, must then support this VLAN range.

トランクポートは、別のスイッチ間を接続するのに使用されます。各トランクでは、タグを使って、対象の VLAN を識別します。これにより、同じ VLAN のスイッチが通信していることが保証されます。

サブネットと ARP

NIC はネットワークホストを表すのに MAC アドレスを使用しますが、 TCP/IP アプリケーションは IP アドレスを使用します。アドレス解決プロトコル (Address Resolution Protocol; ARP) が、IP アドレスを MAC アドレスに変換して、Ethernet と IP の違いを埋めます。

IP アドレスは ネットワーク番号ホスト識別子 の 2 つの部分に分解できます。 2 つのホストが同じネットワーク番号を持つ場合、両者は同じ サブネット にあります。 2 つのホストが同じローカルネットワーク上にある場合、両者が通信する手段は直接 Ethernet 経由しかないことを思い出してください。 ARP は同じサブネットのすべてのマシンが同じローカルネットワーク上にあると仮定します。ネットワーク管理者は IP アドレスとネットマスクをホストに割り当てる際に、同じサブネットに属する任意の 2 つのホストが同じローカルネットワーク上にあるように気を付ける必要があります。さもなければ ARP は正しく動作しません。

IP アドレスのネットワーク番号を計算するには、そのアドレスに関連付けられた ネットマスク を知る必要があります。ネットマスクは 32 ビット IP アドレスのうち何ビットがネットワーク番号であるかを示します。

ネットマスクを表現する書式は 2 つあります。

  • ドット区切りの 4 つの数字

  • classless inter-domain routing (CIDR)

192.168.1.5 という IP アドレスで、アドレスの最初の 24 ビットがネットワーク番号であるとしましょう。ドット区切りの 4 つの数字の書式の場合、ネットワークは 255.255.255.0 と書けます。 CIDR 表記では IP アドレスとネットマスクの両方が含まれ、この例の場合は 192.168.1.5/24 と書けます。

注釈

マルチキャストアドレスやループバックアドレスを含む CIDR サブネットを作ると、OpenStack 環境では使用できません。例えば、 224.0.0.0/16127.0.1.0/24 を使うサブネットの作成はサポートされません。

サブネットを参照したいが、サブネット内の特定の IP アドレスを参照したくはない場合もあります。広く使われている方法は、ホスト識別子を全部 0 にセットして、サブネットを参照する方法です。例えば、ホストの IP アドレスが 10.10.53.24/16 の場合、サブネットは 10.10.0.0/16 になります。

ARP がどのようにして IP アドレスを MAC アドレスに変換するかを理解するために、次の例を考えてみましょう。ホスト A が IP アドレス 192.168.1.5/24 と MAC アドレス fc:99:47:49:d4:a0 を持っており、 IP アドレスが 192.168.1.7 のホスト B にパケットを送信したいものとします。ネットワーク番号は両方のホストで同じで、ホスト A はホスト B に直接フレームを送信できるものとします。

ホスト A が最初にホスト B と通信する際、宛先の MAC アドレスは不明です。ホスト A はローカルネットワークに ARP リクエストを行います。リクエストは以下のようなメッセージが入ったブロードキャストです。

宛先: 全員 (ff:ff:ff:ff:ff:ff)。私は IP アドレス 192.168.1.7 を持つコンピューターを探している。署名: MAC アドレス fc:99:47:49:d4:a0。

ホスト B は次のような応答を返します。

宛先: fc:99:47:49:d4:a0。私が IP アドレス 192.168.1.7 を持っています。署名: MAC address 54:78:1a:86:00:a5。

それから、ホスト A はホスト B に Ethernet フレームを送信します。

argping コマンドを使うと、自分で ARP 要求を始めることができます。例えば、 IP アドレス 10.30.0.132 に ARP 要求を送信するには、

$ arping -I eth0 10.30.0.132
ARPING 10.30.0.132 from 10.30.0.131 eth0
Unicast reply from 10.30.0.132 [54:78:1A:86:1C:0B]  0.670ms
Unicast reply from 10.30.0.132 [54:78:1A:86:1C:0B]  0.722ms
Unicast reply from 10.30.0.132 [54:78:1A:86:1C:0B]  0.723ms
Sent 3 probes (1 broadcast(s))
Received 3 response(s)

ARP 要求の数を抑えるため、オペレーティングシステムは IP アドレスから MAC アドレスへの対応表を保持する ARP キャッシュを管理します。 Linux マシンでは、 arp コマンドで ARP キャッシュの内容を表示できます。

$ arp -n
Address                  HWtype  HWaddress           Flags Mask            Iface
10.0.2.3                 ether   52:54:00:12:35:03   C                     eth0
10.0.2.2                 ether   52:54:00:12:35:02   C                     eth0

DHCP

ネットワークに接続されたホストは、 Dynamic Host Configuration Protocol (DHCP) を使って、動的に IP アドレスを取得します。 DHCP サーバーは、 IP アドレスを DHCP クライアントとなるネットワークホストに払い出します。

DHCP クライアントは、ポート番号 68 からアドレス 255.255.255.255 のポート番号 67 に対して UDP パケットを送信して、 DHCP サーバーを探します。 255.255.255.255 はローカルネットワークのブロードキャストアドレスです。ローカルネットワークのすべてのホストで、このアドレスに送信された UDP パケットが見えます。しかし、このパケットは他のネットワークには転送されません。したがって、 DHCP サーバーはクライアントと同じローカルネットワークに存在しなければならないということです。さもないと、サーバーはブロードキャストを受信できません。 DHCP サーバーは、ポート番号 67 からクライアントのポート番号 68 に UDP パケットを送信して、応答を行います。やり取りは以下のようになります。

  1. クライアントは discover を送信します (「自分は MAC アドレス 08:00:27:b9:88:74 のクライアントです。 IP アドレスがほしいです」)

  2. サーバーは offer を送信します (「08:00:27:b9:88:74``よ、OK だ。IP アドレス ``10.10.0.112 を提供するよ」)

  3. クライアントは request を送信します (「サーバー 08:00:27:b9:88:74、 IP 10.10.0.112 を使いたい」)

  4. サーバーは acknowledgement を送信します (「08:00:27:b9:88:74``よ、OK だ。 ``10.10.0.112 は君のものだ」)

OpenStack は第三者製のプログラム `dnsmasq<http://www.thekelleys.org.uk/dnsmasq/doc.html>`_ を使って DHCP サーバーを実装しています。 dnsmasq は syslog に書き込みます。 DHCP 要求と応答を確認できます。:

Apr 23 15:53:46 c100-1 dhcpd: DHCPDISCOVER from 08:00:27:b9:88:74 via eth2
Apr 23 15:53:46 c100-1 dhcpd: DHCPOFFER on 10.10.0.112 to 08:00:27:b9:88:74 via eth2
Apr 23 15:53:48 c100-1 dhcpd: DHCPREQUEST for 10.10.0.112 (10.10.0.131) from 08:00:27:b9:88:74 via eth2
Apr 23 15:53:48 c100-1 dhcpd: DHCPACK on 10.10.0.112 to 08:00:27:b9:88:74 via eth2

インスタンスがネットワークに到達できないという問題を切り分ける際には、このログを確認して、上記の DHCP プロトコルの 4 つのステップが問題のインスタンスに対して実行されているかを検証するとよいでしょう。

IP

インターネットプロトコル (IP) は、異なるローカルネットワークに接続されたホスト間でパケットをどのようにルーティングするかを規程しています。 IP は*ルーター* や ゲートウェイ と呼ばれる特別なネットワークホストを利用します。ルーターは、少なくとも 2 つのローカルネットワークに接続されたホストで、 IP パケットをあるローカルネットワークからもう 1 つのローカルネットワークに転送します。ルーターは複数の IP アドレスを持ち、それぞれが各々のネットワークに接続されています。

In the OSI model of networking protocols IP occupies the third layer, known as the network layer. When discussing IP, you will often hear terms such as layer 3, L3, and network layer.

ある IP アドレスにパケットを送信するホストは、 ルーティングテーブル に問い合わせを行い、パケットをローカルネットワーク上のどのマシンに送信すべきかを決定します。ルーティングテーブルは、サブネットと各ネットワークにおいて直接接続されているホストの関連付けのリストであり、これらのローカルネットワークにいるルーターのリストでもあります。

Linux マシンでは、以下のどのコマンドを使ってもルーティングテーブルを表示できます。

$ ip route show
$ route -n
$ netstat -rn

ip route show の出力例を以下に示します。

$ ip route show
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15
192.168.27.0/24 dev eth1  proto kernel  scope link  src 192.168.27.100
192.168.122.0/24 dev virbr0  proto kernel  scope link  src 192.168.122.1

出力の 1 行目は、デフォルトルートの場所を示しています。デフォルトルートは、他のどのルールにもマッチしなかった場合に使用されるルーティングルールです。デフォルトルートに関連づいているルーター (上記の例では 10.0.2.2) は デフォルトゲートウェイ と呼ばれることもあります。 DHCP サーバーは、通常、クライアントの IP アドレスとネットマスクと一緒に、デフォルトゲートウェイの IP アドレスを DHCP クライアントに通知します。

出力の 2 行目は、 10.0.2.0/24 のサブネットの IP は、ネットワークインターフェース eth0 に関連付いているローカルネットワークにあることを示しています。

出力の 3 行目は、 192.168.27.0/24 のサブネットの IP は、ネットワークインターフェース eth1 に関連付いているローカルネットワークにあることを示しています。

出力の 4 行目は、 192.168.122.0/24 のサブネットの IP は、ネットワークインターフェース virbr0 に関連付いているローカルネットワークにあることを示しています。

コマンド route -nnetstat -rn の出力は、少し違った形で整形されます。以下の例は、これらのコマンドを使って同じ経路を表示したものです。

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.0.2.2        0.0.0.0         UG        0 0          0 eth0
10.0.2.0        0.0.0.0         255.255.255.0   U         0 0          0 eth0
192.168.27.0    0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0          0 virbr0

ip route get コマンドは、宛先 IP アドレスへの経路を出力します。以下の例では、IP アドレス 10.0.2.14 は eth0 のローカルネットワーク上にあり、直接送信できます。

$ ip route get 10.0.2.14
10.0.2.14 dev eth0  src 10.0.2.15

宛先 IP アドレス 93.184.216.3 は、接続されているローカルネットワーク上にはなく、 10.0.2.2 のデフォルトゲートウェイに転送されます。

$ ip route get 93.184.216.34
93.184.216.34 via 10.0.2.2 dev eth0  src 10.0.2.15

パケットが最終的な宛先に到達するまでに複数のルーターを経由することはよくあることです。 Linux マシンでは、 traceroute や最近では mtr プログラムを使うと、 IP パケットが宛先に到達するまでに通過する各ルーターの IP アドレスが表示されます。

TCP/UDP/ICMP

IP ネットワーク上で通信するネットワークソフトウェア・アプリケーションは、 IP の上位層のプロトコルを使用する必要があります。これらのプロトコルは OSI モデルの第 4 層にあたり、 トランスポート層レイヤー 4 とも呼ばれます。 Internet Assigned Numbers Authority (IANA) が管理している Protocol Numbers のウェブページを見ると、 IP の上位層に位置するプロトコルと割り当てられている番号の一覧があります。

Transmission Control Protocol (TCP) は、ネットワークアプリケーションで最も広く使用されているレイヤー 4 プロトコルです。 TCP は 接続志向 (connection-oriented) のプロトコルで、クライアントがサーバーに接続するクライアント~サーバーモデルを使用します。ここで、 サーバー というのは接続を受信するアプリケーションのことです。 TCP を使うアプリケーションでの一般的なやり取りは次の通りです。

  1. クライアントがサーバーに接続します。

  2. クライアントとサーバーがデータを交換します。

  3. クライアントかサーバーが接続を終了します。

ネットワークホストでは TCP を使ったアプリケーションが複数動作する場合があるため、 TCP は ポート と呼ばれる番号付け機構を使い、 TCP を使うアプリケーションを一意に特定します。 TCP ポートは 1-65535 の範囲の数値に関連付けられ、あるホストにおいてはある時点では 1 つの TCP ポートに関連付けられるのは 1 つのアプリケーションだけで、この制約はオペレーティングシステムにより適用されます。

TCP サーバーは、ポートを リッスン (listen) します。例えば、 SSH サーバーは通常ポート 22 をリッスンします。サーバーに TCP を使って接続するクライアントは、サーバーホストの IP アドレスとサーバーでの TCP ポートの両方を知っている必要があります。

The operating system of the TCP client application automatically assigns a port number to the client. The client owns this port number until the TCP connection is terminated, after which the operating system reclaims the port number. These types of ports are referred to as ephemeral ports.

IANA は、多くの TCP を使うサービスやその他のポートを使うレイヤー 4 プロトコルに関して registry of port numbers (ポート番号の登録所) を管理しています。 TCP ポート番号の登録は必要ありませんが、ポート番号を登録しておくと他のサービスとの競合を避けることができます。 OpenStack のデプロイメントで使用される様々なサービスが使用するデフォルトのポート番号については OpenStack Configuration ReferenceAppendix B. Firewalls and default ports を参照してください。

The most common application programming interface (API) for writing TCP-based applications is called Berkeley sockets, also known as BSD sockets or, simply, sockets. The sockets API exposes a stream oriented interface for writing TCP applications. From the perspective of a programmer, sending data over a TCP connection is similar to writing a stream of bytes to a file. It is the responsibility of the operating system’s TCP/IP implementation to break up the stream of data into IP packets. The operating system is also responsible for automatically retransmitting dropped packets, and for handling flow control to ensure that transmitted data does not overrun the sender’s data buffers, receiver’s data buffers, and network capacity. Finally, the operating system is responsible for re-assembling the packets in the correct order into a stream of data on the receiver’s side. Because TCP detects and retransmits lost packets, it is said to be a reliable protocol.

User Datagram Protocol (UDP) は、いくつかの有名なネットワークプロトコルで使われている別のレイヤー 4 プロトコルです。 UDP は コネクションレス プロトコルです。 UDP を使って通信する 2 つのアプリケーションは、データのやり取りを行う前にコネクションを確立する必要がありません。オペレーティングシステムは、失われた UDP パケットの再送を行いませんし、検出さえ行いません。オペレーティングシステムは、UDP パケットが送信されたときと同じ順序で受信側のアプリケーションに見えるという保証も行いません。

UDP も TCP と同じくポートという考え方で、同じシステム上で動作するアプリケーションを区別します。ただし、オペレーティングシステムは UDP ポートを TCP ポートとは別ものとして扱います。例えば、あるアプリケーションを TCP ポート 16543 に関連付けて、別のアプリケーションを UDP ポート 16543 に関連付けることができます。

TCP と同様に、ソケット API が UDP を使うアプリケーションを書く際に最も広く使われています。ソケット API は UDP を使うアプリケーションに対して メッセージ志向 インターフェースを提供します。プログラマーは固定サイズのメッセージを送信して、 UDP 上でデータ送信を行います。アプリケーションが失われたパケットの再送や受信パケットの並び替えを必要とする場合、アプリケーションのコードでこれらの機能を実装するのはプログラマーの仕事になります。

DHCP、Domain Name System (DNS)、Network Time Protocol (NTP)、Virtual extensible local area network (VXLAN) が、OpenStack 環境で使用される UDP 系のプロトコルの例です。

UDP は 1対多通信に対応しており、1 つのパケットを複数のホストに送信できます。アプリケーションは、受信者の IP アドレスを特別なブロードキャスト IP アドレス 255.255.255.255 に設定することで、ローカルネットワーク上のすべてのネットワークホストに UDP パケットをブロードキャストできます。また、アプリケーションは IP マルチキャスト を使って UDP パケットを受信者の集合に送ることができます。パケットを受信したい受信側アプリケーションは、UDP ソケットを特別な IP アドレス、つまり、有効なマルチキャストグループアドレスの 1 つにバインドすることで、マルチキャストグループに参加します。受信者のホストは送信者と同じローカルネットワークにある必要はありませんが、途中のルーターが IP マルチキャストルーティングをサポートするように設定されている必要があります。 VXLAN は IP マルチキャストを使用する UDP ベースのプロトコルの 1 例です。

Internet Control Message Protocol (ICMP) は、 IP ネットワーク上で制御メッセージを送信するのに使用されるプロトコルです。例えば、IP パケットを受信したルーターは、宛先アドレスに対応する経路がルーターのルーティングテーブルにない場合は、ICMP パケットを送信元に送ります (ICMP コード 1、宛先ホスト到達不能)。また、 IP パケットが大きすぎて、そのルーターでは処理できない場合にも、ICMP パケットを送信元に送ります (ICMP コード 4、フラグメンテーションが必要だが “don’t fragment” (フラグメント禁止) フラグがセットされている)。

Linux のコマンドラインツール pingmtr は、 ICMP を使うネットワークユーティリティーの例です。

Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.