【9日目】TCP/IPネットワーク入門(第4章イーサネット編)
皆さん,こんにちは.bb_lotusです. さて,今回はTCP/IPネットワークに関しての9日目のアウトプットになります.
すぐアウトプットだけ見たい人はこちらから
(ネットワーク初学者のため,記載内容等間違いがありましたらどしどしコメント,指摘等していただければと思います.)
使用する教材はこちらです.
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」
--------------↓ここからアウトプット--------------
今回は第4章のイーサネットに関してやっていきます!
イーサネットとは
・データリンク層における通信方法の規格
・送るデータの単位を「フレーム」という.
・フレームの送信と受信のやりとりにMACアドレスが使われる.
MACアドレスとは
・48ビットの正の整数(世界で一意,上位24ビットはネットワーク機器を製造するベンダー,下位24ビットはベンダーが自由に割り当てる識別子)
・フレームを観察してみる!
以下のようなネットワークにおいて,実際にフレームがどのようにやりとりされているのかをみていく!!
それではネットワークを組んでいきます.
~[復習]ネットワークの組み方~
その1. Network Namespaceの作成
その2. ネットワークインターフェースを作成し,つなげる.
その3. 2をNetwork Namespaceで使えるようにする.
その4. お互いが通信できるようにインターフェースにIPアドレスを付与する.
その5. ネットワークインターフェースを有効にする.
その6. pingで疎通確認.
その1. Network Namespaceの作成
$ sudo ip netns add ns1
$ sudo ip netns add ns2
その2. ネットワークインターフェースを作成し,つなげる.
$ sudo ip link add ns1-veth0 type veth peer name ns2-veth0
その3. 2をNetwork Namespaceで使えるようにする.
$ sudo ip link set ns1-veth0 netns ns1
$ sudo ip link set ns2-veth0 netns ns2
その4. お互いが通信できるようにインターフェースにIPアドレスを付与する
$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
$ sudo ip netns exec ns2 ip address add 192.0.2.2/24 dev ns2-veth0
その5. ネットワークインターフェースを有効にする.
$ sudo ip netns exec ns1 ip link set ns1-veth0 up
$ sudo ip netns exec ns2 ip link set ns2-veth0 up
今回は,インターフェースのMACアドレスを変更します.
(デフォルトで設定されているためこちらで指定)
$ sudo ip netns exec ns1 ip link set dev ns1-veth0 address 00:00:5E:00:53:01
$ sudo ip netns exec ns2 ip link set dev ns2-veth0 address 00:00:5E:00:53:02
MACアドレスが変更できているか確認.
$ sudo ip netns exec ns1 ip link show | grep link/ether
link/ether 00:00:5e:00:53:01 brd ff:ff:ff:ff:ff:ff link-netns ns2
$ sudo ip netns exec ns2 ip link show | grep link/ether
link/ether 00:00:5e:00:53:02 brd ff:ff:ff:ff:ff:ff link-netns ns1
続いて,パケットキャプチャの準備.
別のターミナルからubuntuにログインして,以下のコマンドを入力
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ns1-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
準備が整ったので,その6. pingで疎通確認.
$ sudo ip netns exec ns1 ping -c 3 192.0.2.2 -I 192.0.2.1
PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 : 56(84) bytes of data.
64 bytes from 192.0.2.2: icmp_seq=1 ttl=64 time=0.383 ms
64 bytes from 192.0.2.2: icmp_seq=2 ttl=64 time=0.050 ms
64 bytes from 192.0.2.2: icmp_seq=3 ttl=64 time=0.043 ms
--- 192.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 0.043/0.158/0.383/0.158 ms
tcpdumpを実行したターミナルに戻ると..
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ns1-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 40825, seq 1, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 40825, seq 1, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 40825, seq 2, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 40825, seq 2, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 40825, seq 3, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 40825, seq 3, length 64
送信元MACアドレス>送信先MACアドレスで記載されている.
また,さらに左側にはIPとICMPに関する情報も記載があり,つまりこれはイーサネットのフレームによってIPのパケットが運ばれる様子を表している!!
※ここで1つ.ICMPとはなんぞや
ICMP:IPパケットの配送中に何らかの異常が発生してパケットを転送できなくなった場合に,パケットの送信元に異常を知らせるために使われるプロトコル
ネットワークの診断などにも利用される.
ここで1つ疑問が湧いてくる.
Q:MACアドレスってどうやってわかったん?
・というわけで,ARPを観察してみよう!!
まずはMACアドレスのキャッシュを行う
$ sudo ip netns exec ns1 ip neigh flush all
キャッシュ後,改めて別のターミナルでtcpdumpコマンドを実行
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp or arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ns1-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
これでパケットキャプチャの準備が完了したので,再度ns1からns2へpingを打つ.
$ sudo ip netns exec ns1 ping -c 3 192.0.2.2 -I 192.0.2.1
PING 192.0.2.2 (192.0.2.2) from 192.0.2.1 : 56(84) bytes of data.
64 bytes from 192.0.2.2: icmp_seq=1 ttl=64 time=0.038 ms
64 bytes from 192.0.2.2: icmp_seq=2 ttl=64 time=0.088 ms
64 bytes from 192.0.2.2: icmp_seq=3 ttl=64 time=0.055 ms
--- 192.0.2.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2053ms
rtt min/avg/max/mdev = 0.038/0.060/0.088/0.020 ms
tcpdumpコマンドを確認すると..
$ sudo ip netns exec ns1 tcpdump -tnel -i ns1-veth0 icmp or arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ns1-veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
00:00:5e:00:53:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.0.2.2 tell 192.0.2.1, length 28
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype ARP (0x0806), length 42: Reply 192.0.2.2 is-at 00:00:5e:00:53:02, length 28
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 45591, seq 1, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 45591, seq 1, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 45591, seq 2, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 45591, seq 2, length 64
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype IPv4 (0x0800), length 98: 192.0.2.1 > 192.0.2.2: ICMP echo request, id 45591, seq 3, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype IPv4 (0x0800), length 98: 192.0.2.2 > 192.0.2.1: ICMP echo reply, id 45591, seq 3, length 64
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype ARP (0x0806), length 42: Request who-has 192.0.2.1 tell 192.0.2.2, length 28
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype ARP (0x0806), length 42: Reply 192.0.2.1 is-at 00:00:5e:00:53:01, length 28
何と!新しい情報が増えている!!
一番最初と最後の行にARPに関しての情報が!!
00:00:5e:00:53:01 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 42: Request who-has 192.0.2.2 tell 192.0.2.1, length 28
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype ARP (0x0806), length 42: Reply 192.0.2.2 is-at 00:00:5e:00:53:02, length 28
00:00:5e:00:53:02 > 00:00:5e:00:53:01, ethertype ARP (0x0806), length 42: Request who-has 192.0.2.1 tell 192.0.2.2, length 28
00:00:5e:00:53:01 > 00:00:5e:00:53:02, ethertype ARP (0x0806), length 42: Reply 192.0.2.1 is-at 00:00:5e:00:53:01, length 28
ns1のMACアドレス (00:00:5e:00:53:01
)からff:ff:ff:ff:ff:ffにARPで
192.0.2.2というIPアドレスを持った機器の
MACアドレス
を
送っている!(ARPリクエスト)192.0.2.1に教えてくれと
ここで,ff:ff:ff:ff:ff:ffというのはブロードキャストアドレス.(このフレーム
が届く限りの範囲で,全ての機器に聞いて!」ということ.送信先がブロードキャストアドレスになっているフレームのことをブロードキャストフレーム,ブロードキャストフレームが届く範囲のことをブロードキャストドメインという.)
それに対して,次の行でns2のMACアドレス(00:00:5e:00:53:02)から
ns1のMACアドレス (00:00:5e:00:53:01
)へ,「俺が持ってるでー」という返答が返ってくる.(ARPリプライ)
→つまり,ARPもIPと同じく,イーサネットのフレームで運ばれている!
とりあえず今回はここまで!!
ではまた!!