【1日目】TCP/IPネットワーク入門
皆さん,こんにちは.bb_lotusです.
さて,今回はTCP/IPネットワークに関しての1日目のアウトプットになります.
すぐアウトプットだけ見たい人はこちらから
(ネットワーク初学者のため,記載内容等間違いがありましたらどしどしコメント,指摘等していただければと思います.)
使用する教材はこちらです.
「Linuxで動かしながら学ぶTCP/IPネットワーク入門」
この教材を選んだ理由としては,
実際に手を動かしながら学ぶことができるためです.
また,情報科学といっても様々な分野があるわけですが,なぜネットワークを選んだかというと,前々から単純に興味があり,仕組みなどを知りたかった,ことももちろんなのですが,
基盤となる知識をつけておくことで,プログラムなどでエラーが出た際の原因となり得る候補を挙げられる,または具体的な解決策が見いだせる可能性が上がる.
といったことです.
例えば,なんでもいいのですが,例えば自転車を例に挙げましょう.
自転車が壊れてしまった時,チェーンが外れてしまったくらいだと自力で直せることも多いのですが,パンクしてしまった等の時,大体は自転車さんに修理に出すと思うのですが,自転車さんがなぜ直せるのかというと,「自転車がどういう仕組みで動いているか」というのが把握できているためです.
もしかしたら,めちゃくちゃ長い時間かけて1つずつ見ていけば,自分でも直せるかもしれませんが,まあ効率が悪いわけですし,そもそもどこが破損したとか,どこが悪さしているのかもわからない可能性も十分にあります.
といったように,例で出した自転車だと自転車屋さんがあるので直してくれる人がいるわけなのですが,大学院で研究する際,プログラムを書いてエラーが出ることというのはしょっちゅうな訳で,研究ではそーはいきません.
そこで効率よく研究を進めていくためにも,今の内からネットワークの勉強をしたいと思ったわけです.
まあ後は,卒論でVRの研究をしていたのですが,
ネットワークの知識があればもっと幅広いことできたな
と感じたことがしばしばあったことも理由の1つです.
というわけで,長々話してしまいましたが,以上がネットワークを勉強したいと思った理由です.
--------------↓ここからアウトプット--------------
第2章 TCP/IPとは
2.1プロトコルとは
・TCP/IP:プロトコルの総称(TCPとIPの2つの代表的なプロトコルから由来)
・プロトコル:物事を円滑に進めるための「決め事」
・TCP:荷物(パケット)が目的地まで届いたかどうか管理するプロトコル
・IP:荷物(パケット)を目的地まで運ぶプロトコル
2.2プロトコルの階層構造
・プロトコルは階層構造を持つ
→理想はOSI参照モデル(TCP/IPの概念を説明する上で便利)
◎様々な役割のプロトコルがあり,それらを階層構造で分類できる.
◎TCP/IPでの通信は目的に応じたそれぞれの階層ごとのプロトコルを選択し組み合わせながら使う.(組み合わせは定石あり)
2.3LinuxでUbuntu20.04LTSのマシン起動
こちらは本書に従って設定しましたが,エラーが出まくりかなり時間かかりました.
参考にしたものを載せておきます.
エラーはbrew doctor後に出たのがほとんどです.
エラーが出過ぎたため,Xcode Command Line Toolをアンインストールし,一からやり直しました.(もし,片っ端から調べて試してもうまくいかないようなら,アンインストールしてみましょう.僕はそれでエラーはやはり出ましたけどなんとかいけました)
・Homebrew関連のエラー(主にbrew doctor後)
→この方の記事はとても分かりやすく大変勉強になりました.
以下,エラーではないですが,関連で調べたもの
・ Vim関連
・Xcode Command Line Tools
~少し脱線〜 興味ない人は続きはこちら
・そもそもLinuxとは?(ざっくり)
・maxOS,Windowsと同じOSの1つ
・基本的にCUI操作(マウスではなく,キーボードで操作)
・元々はパソコン用OSとして,今は家電にも利用されている
・Webサーバを設定する際にも利用されることが多い.
・Linuxを使うメリット
・多くの種類がある
WindowsにもWindows7やWindows10といったものがあるようにLinuxにも「ディストリビューション」といったものがある
ディストリビューションとはLinuxを使うためのアプリや機能をひとまとめにしたパッケージみたいなもので代表的なものとして,RHEL(レル),Ubuntu(ウブントゥ),CentOSなどがある.
→今回はUbuntuを使用している.
・無料
Windows:有料
→Linuxはスペックが低くてもOK!
・インストール
・PCにインストールできる
・仮想環境にインストールできる
こちらの動画を参考にしました.
・Homebrewとはなんぞや
macOS上で動作するパッケージ管理ツールらしい.
まあ一言で言うと,Homebrewを使うことで、ターミナルからコマンドを実行するだけで、パッケージのインストールやアンインストールが簡単に行える.
とのこと.
なんとなくわかったようなわからないようなと言うことで,今のところは「あるとめっちゃ便利らしい」と言うイメージで覚えておきます.
----------↓アウトプット続きはここから----------
とりあえず,仮想環境の設定が終了し,実際にLinuxでTCP/IPの動作を見ていきます.
・ping(ピン)
$ ping -c 3 8.8.8.8
メモ
ping:TCP/IPのネットワークで疎通(通信が行って戻ってこれるか)を確認するコマンド.内部的にはICMPというプロトコルが使われている.
-c 3:応答を要求するメッセージを3回送る
8.8.8.8:Googleが運営する公開DNSサーバのIPアドレス
・実行結果
$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=15.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=15.7 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=13.8 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 13.813/14.857/15.662/0.773 ms
・IPアドレスとは
IPというプロトコルで通信するのに必要な識別子の一種.
(プロトコルのIPと,識別子のIPの混同に注意)
インターネット上における住所みたいなもの
IPアドレスはさらに,
グローバルIPアドレス:インターネット上で一意(同一のものなし)
プライベートIPアドレス:ローカルなネットワーク内では一意(他のネットワークで同一のものあり)
現実世界では荷物のものをインターネット上では「パケット」というらしいですが,
現実世界の宅配便と同様にインターネットの世界でも,パケット(荷物)をある特定の場所に送るためには差出人,宛先のIPアドレス(住所)がいるわけです.
そういった情報はヘッダとしてそのプロトコルで通信が成立するように情報を書いておくわけです.(各プロトコルにヘッダがある.今回はIPヘッダ)
ちなみに情報を記載する領域のことをフィールドと言います.(最大32ビット)
以下にIPヘッダのフォーマットを載せておきます.
特定の場所にパケットが送れたということは,自分が宛先であるIPアドレスを持っているということになります.それを見たい時は.
$ ip address show
出力結果は次のようになります.
$ ip address show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo //ネットワークインターフェイスloには127.0.0.1というIPアドレスが付与されている.
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 02:c2:dc:03:55:bb brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 //ネットワークインターフェイスenp0s3には10.0.2.15というIPアドレスが付与されている.
valid_lft 67544sec preferred_lft 67544sec
inet6 fe80::c2:dcff:fe03:55bb/64 scope link
valid_lft forever preferred_lft forever
メモ
・1:や2:の後ろにある文字列,loやenp0s3はネットワークインターフェイスという.
・ネットワークインターフェイスとはNICや無線LANアダプタのこと.(ただし,それらをソフトウェアから扱う上で抽象化した概念のため,物理的にデバイスとして存在しないものもある)
・127.0.0.1は自分自身を表すIPアドレス.(ループバックアドレスという.)
・10.0.2.15は差出人のIPアドレス.
自分自身にpingコマンドを打つと..
$ ping -c 3 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.031 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.040 ms
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2166ms
rtt min/avg/max/mdev = 0.016/0.029/0.040/0.009 ms
応答時間(time)がめちゃ早い!!!!
続いて,差出人と宛先の通信を覗き見しちゃおう!(パケットキャプチャ)
$ sudo tcpdump -tn -i any icmp
・出力結果
$ sudo tcpdump -tn -i any icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
このコマンド打つだけだと,プログラム自体は止まるが,もう1つのターミナルでpingコマンドを打つと,,
$ ping -c 3 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=63 time=25.2 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=63 time=16.3 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=63 time=17.2 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2005ms
rtt min/avg/max/mdev = 16.339/19.602/25.247/4.007 ms
$ sudo tcpdump -tn -i any icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes
IP 10.0.2.15 > 8.8.8.8: ICMP echo request, id 8, seq 1, length 64
IP 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 8, seq 1, length 64
IP 10.0.2.15 > 8.8.8.8: ICMP echo request, id 8, seq 2, length 64
IP 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 8, seq 2, length 64
IP 10.0.2.15 > 8.8.8.8: ICMP echo request, id 8, seq 3, length 64
IP 8.8.8.8 > 10.0.2.15: ICMP echo reply, id 8, seq 3, length 64
やりとりが反映される!!!
・pingコマンドとtcpdumpコマンドで通信のやり取りは見れたけど,最初と最後のみで通信の途中過程が知りたい!そんな人には,
$ traceroute -n 8.8.8.8
tracerouteコマンドを使えばパケットの目的地までの道のりがわかる!!
・出力結果
$ traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 10.0.2.2 0.319 ms 0.262 ms 0.236 ms
2 192.168.0.1 4.491 ms 4.312 ms 4.281 ms
3 210.173.146.33 16.112 ms 16.023 ms 16.247 ms
4 210.173.145.73 16.228 ms 16.422 ms 16.344 ms
5 210.173.150.53 15.881 ms 15.843 ms 210.173.150.97 15.584 ms
6 210.171.224.95 18.247 ms 103.246.232.96 14.278 ms 210.171.224.95 18.011 ms
7 * 108.170.242.129 20.626 ms 108.170.242.193 20.589 ms
8 8.8.8.8 14.635 ms 12.107 ms 142.250.214.139 16.640 ms
・じゃあどうやって目的地まで最適な道のりがわかるのか?
そんな時にはルーティングテーブルというものを見て,次にパケットを渡す相手を決める!!
ルーティングテーブルを見るコマンド
$ ip route show
・出力結果
$ ip route show
default via 10.0.2.2 dev enp0s3 proto dhcp src 10.0.2.15 metric 100
10.0.2.0/24 dev enp0s3 proto kernel scope link src 10.0.2.15
10.0.2.2 dev enp0s3 proto dhcp scope link src 10.0.2.15 metric 100
メモ