TCP/IPをハンズオンで学ぶ[TCP/IPとは]

この本から得たいこと
- ネットワークが何をやっているのかをもっと理解したい。
- dockerネットワークへの理解に繋げたい。

一般的な定義ではTCP/IPにイーサネットは含まれない。しかし、この本では説明の都合から含むように表現する場合があるそう。

1. TCP/IP
-
TCP/IPとは、インターネットを構成するプロトコルの総称。
- TCP/IPのプロトコル群が存在するから、インターネットが成立している。
- TCP/IPはプロトコル群で、代表的なプロトコルがTCPとIPって話。
- TCP/IPに複数のプロトコルがある理由は、プロトコルそれぞれに特定の役割を背負わせて、それらを組み合わせて目的を達成した方が、シンプルに達成できるから。また、組み合わせの数だけ色々なことができるようになる。
- プロトコルとは、コンピュータ同士がネットワークを用いて通信するための約束ごと

IPプロトコルの責務:目的地まで荷物(パケット)を運ぶこと。到達する保証はしない
TCPプロトコルの責務:荷物が目的地までちゃんと届いたことを管理するプロトコル

IPプロトコルとTCPプロトコルを組み合わせることで、荷物(ビット列で表現された何かしらのデータのこと)がちゃんと目的地まで届くことを実現できる

IPプロトコルとIPアドレスの関係
IPアドレスは、IP(Internet Protocol)というプロトコルで通信するのに必要な識別子の一つ。 IPはインターネットの根幹をなすプロトコルである。
なるほど、IPプロトコルで通信する際に、IPアドレスが必要なのか。

IPアドレスはネットワーク(プライベート、パブリック問わず)一意でなければならない。

- IPプロトコルでは、通信先に届ける荷物(データ)のことをパケットと呼ぶ。
- IPによって運ばれるパケットの一つ一つには、差出人と宛先のIPアドレスが載っている。これをヘッダと呼ぶ(もちろん簡略的に言っているだけでその他のフィールドもヘッダには含まれている)。つまりパケットにはヘッダが付属する。IP以外のプロトコルにもヘッダという概念は存在していて、ヘッダにはそのプロトコルで通信を成立させるために必要となるさまざまな情報が含まれている。
- ヘッダの中で情報を記載する領域のことはフィールドと呼ぶ。

IPアドレスは32ビットで構成されていて、8ビットずつ10進数にして、ドットで繋いだものである。

上の画像は「IPヘッダのフォーマット」である。要はIPヘッダの構造を図示したものである。この図は左から右に、上から下に向かって読んでいく。このようなヘッダが、実際にはビット列として、ネットワーク上でそれぞれのパケットを表現している。

ip address show
ip address showで差出人のIPアドレスを確認できる。inetの部分を見ればIPアドレスが何かわかる。
今回の場合、 127.0.0.1や172.17.0.2がコンピュータのIPアドレスである。
root@60a459bf9d33:/# ip address show | grep inet
inet 127.0.0.1/8 scope host lo
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0

root@60a459bf9d33:/# 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
valid_lft forever preferred_lft forever
2: tunl0@NONE: <NOARP> mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
3: ip6tnl0@NONE: <NOARP> mtu 1452 qdisc noop state DOWN group default qlen 1000
link/tunnel6 :: brd ::
175: eth0@if176: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
1:や2:の後ろにあるloやeth0@if176はネットワークインターフェースと呼ぶ。
- ネットワークインターフェースとは、LANケーブルを指すネットワークインターフェースカード(NIC)や無線LANアダプタなどをソフトウェアから扱う上で抽象化した概念のこと。 そのため、実際には物理的なデバイスが存在しないネットワークインターフェイスもある。loとかが代表的。
-
ネットワークインターフェースには、必要に応じてIPアドレスが付与される。
- loというネットワークインターフェースには、127.0.0.1というIPアドレスが付与される
- eth0@if176というネットワークインターフェースには、172.17.0.2というIPアドレスが付与される
すごくざっくり解釈するとネットワークインターフェースが存在するから、自分のホストはローカルのネットワークに接続できる。多分。あと、PCにネットワークインターフェースが内蔵されているから、PCにIPアドレスがあると思うのか。実際はIPアドレスはネットワークインターフェースに対して付与される

- 127.0.0.1というIPアドレスは、ループバックアドレスという特殊なIPアドレスである。ループバックアドレスは、自分自身を表している。ループバックアドレスが付与されているネットワークインターフェイスはループバックインターフェイスと呼ばれる。今回であればloだが、このネットワークインターフェイスは仮想的なものである。つまり、物理的なネットワークインターフェースカードなどがコンピュータに刺さっているわけではない。
- 動作確認など自分自身だけに関わる通信をしたいときに、このループバックアドレスを使うと便利である

ネットワークインターフェースカード
ネットワークインターフェースカードとは、コンピュータなどの通信機器を通信ネットワーク(LAN)に繋げるためのカード型の拡張装置。かつてはコンピュータ本体に通信機能がついておらず、NICを差し込んでネットワーク機能を追加するのが一般的だった。現在ではコンピュータに通信機能があらかじめ組み込まれているので、単体のNICを使うことは無くなった。

ループバックコマンドでpingを実行するとめちゃくちゃ早い。そりゃそう。自分自身に対して通信しようとしているんだもん。
root@60a459bf9d33:/# 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.637 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.042 ms
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2038ms
rtt min/avg/max/mdev = 0.042/0.242/0.637/0.279 ms
つまり、この環境では、172.17.0.2が差出人に相当するIPアドレスである。

それぞれのパケットは、IPアドレスがフィールドに書きこまれたヘッダによって表現されています。
これがよくわからん。IPヘッダとパケットって別物じゃないんか?やっぱここは実装しないとわからなそう。

成功してたら3 receivedして、0% packet lossが出る。失敗してたら、0 received 100% packet lossが出たりする。

TCP/IPにはさまざまな役割のプロトコルが含まれていて、それらは役割ごとに階層構造で分類できる
実際にTCP/IPで通信するときは、目的に応じてそれぞれの階層にごとにプロトコルを選んで組み合わせながら使う。 料理で前菜やスープなどを一品ずつ選んでコース料理を完成させるイメージ。

このコースにはある程度決まった組み合わせがあるので、悩むことはないそう。

もうひとつ重要な概念として、プロトコルの階層構造には「高さ」という考え方があります。先ほど紹介したOSI参照モデルでは、階層構造が低くなるほどより抽象度の低い具象的な概念を扱います。たとえば、階層構造でもっとも低いところにある物理層で扱うのは、通信に使うビットを電気や光でどう表現するかといったことです。反対に、階層構造における位置が高ければ、より抽象度の高い概念を扱います。たとえば、もっとも高いところにあるアプリケーション層のプロトコルの1つであるHTTPではWebページのコンテンツなどを扱います。
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 20). Kindle Edition.
なるほど。階層構造の位置の高低に応じて、抽象度が変わってくるのか。

標準化
IETF(Internet Engineering Task Force)という団体がTCP/IPのプロトコルの仕様をどうするか決めて、RFCという技術文書を通してプロトコルの仕様を公開している。とはいえIETFがトップダウンでプロトコルを決めているわけではなくて、エンジニアの意見も聞いて民主的にプロトコルの仕様を決めているそう。

sudo
実行するコマンドの先頭にsudoがあると、コマンドを管理者権限で実行することを意味しています。その際、設定によってはログインパスワードを聞かれることがあります。
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 24). Kindle Edition.

Dockerfileでubuntuの環境を手に入れた。
RUN 命令は、現在のイメージよりも上にある新しいレイヤでコマンドを実行し、その結果を コミット(確定)commit する。RUN命令はdocker buildを実行するタイミング(つまり、イメージを生成するとき)に実行する。イメージの時点で実行しておきたいコマンド(パッケージやライブラリのインストール、ファイルコピー、変更など)を実行するために書く。
FROM ubuntu:20.04
# apt-getコマンドを使うことで、ubuntuでパッケージのインストールやアップデート、削除などを簡単にできる。
RUN apt-get update
# -yを指定することでパッケージをインストールするたびに出る確認プロンプトに自動でyesと答えてくれる
# bash: GNU Bashシェル(Unixシェルの一種)であり、コマンドラインインターフェースを提供します。
# coreutils: Linuxで一般的に使用される基本的なコマンド群を提供します。例えば、ls、cp、mv、rmなどのコマンドが含まれます。
# grep: ファイル内の文字列を検索するためのコマンドです。
# iproute2: Linuxカーネルのネットワーク構成ツールで、ネットワークインターフェースやルーティングテーブルの設定に使用されます。
# iputils-ping: ネットワークデバイスの到達性をテストするために使用されるpingコマンドの一部です。
# traceroute: パケットが通る経路をトレースし、ネットワークの経路情報を表示するために使用されます。
# tcpdump: ネットワークトラフィックをキャプチャして表示するためのパケット解析ツールです。
# bind9-dnsutils: BIND DNSサーバーのユーティリティツールを提供します。
# dnsmasq-base: DHCPサーバーやDNSキャッシュを提供する軽量で高速なネットワークサービスを提供するdnsmasqのベース部分です。
# netcat-openbsd: ネットワーク接続を作成・監視・操作するためのユーティリティツールです。
# python3: Pythonプログラミング言語のバージョン3のランタイムとライブラリを提供します。
# curl: コマンドラインからURLを操作し、データの送受信を行うためのツールです。
# wget: コマンドラインからファイルをダウンロードするためのツールです。
# iptables: Linuxのファイアウォール機能を管理するためのツールです。
# procps: プロセスに関連する情報を表示・操作するためのツール群です。
# isc-dhcp-client: DHCPクライアントを提供します。
# DHCPは「コンピュータにIPアドレスを自動割り当てする仕組み」
# DHCPサーバは、人間様の代わりに、コンピュータにIPアドレスを割り当てる仕事をやるコンピュータのこと
# DHCPクライアントとは、DHCPサーバとやり取りしてIPアドレスを割り当ててもらう側のコンピュータのこと。
# https://wa3.i-3-i.info/word18660.html
RUN apt-get -y install bash coreutils grep iproute2 iputils-ping traceroute tcpdump bind9-dnsutils \
dnsmasq-base netcat-openbsd python3 curl wget iptables procps isc-dhcp-client

パッケージがインターネットからダウンロードされるときの通信もTCP/IPによって実現されている。

pingコマンド(ピンコマンド)
- 8.8.8.8はGoogleが運用する公開DNSサーバのIPアドレス。IPアドレスなので、もちろんインターネット上で一つしか存在しない。
- pingコマンドでTCP/IPで通信できるのかを確認できる。
- pingコマンドによって生じる通信は、一般にコマンドと同名のPing(ピン)と呼ばれる
root@60a459bf9d33:/# 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=36 time=25.9 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=36 time=9.79 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=36 time=7.40 ms
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 7.395/14.362/25.898/8.215 ms

こちらの出した要求に対して応答が全て無事に届いている。3packetstransmitted,3received,0%packetloss"という表示からわかります。これは「3つ要求を送って、3つ応答が戻ってきました。途中で失われた内容は0%です」という意味
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 27). Kindle Edition.

ネットワークって言葉の意味が若干理解曖昧だけど、作らないと理解できなさそう

tcpdumpコマンド
tcpdumpコマンドを使うことで、ネットワーク上を流れるデータパケットをリアルタイムで表示できる。
通信を覗き見することを、パケットキャプチャやスニッフィングと呼ぶ。
# -tn: このオプションは、tcpdumpが表示するパケットの詳細をシンプルな形式で表示するためのものです。
# -t: タイムスタンプを表示しないことを意味します。
# -n: ホスト名をIPアドレスで表示することを意味します。つまり、DNSの逆引きを行わずにIPアドレスで表示されます。
# -i any: すべてのネットワークインターフェースからのトラフィックをキャプチャすることを意味します。
# anyは、すべてのインターフェースを表す特殊なキーワードです。
# icmp: ICMPトラフィックをフィルタリングするための条件です。ICMPは、ネットワークデバイス間で制御メッセージをやり取りするためのプロトコルであり、通常はネットワークの健全性やエラー報告に使用されます。ping(ICMP Echo Request/Reply)も含まれます。
tcpdump -tn -i any icmp
pingコマンドはIPプロトコルとICMPプロトコルを用いて行われている。
root@60a459bf9d33:/# 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 172.17.0.2 > 8.8.8.8: ICMP echo request, id 3, seq 1, length 64
IP 8.8.8.8 > 172.17.0.2: ICMP echo reply, id 3, seq 1, length 64
IP 172.17.0.2 > 8.8.8.8: ICMP echo request, id 3, seq 2, length 64
IP 8.8.8.8 > 172.17.0.2: ICMP echo reply, id 3, seq 2, length 64
IP 172.17.0.2 > 8.8.8.8: ICMP echo request, id 3, seq 3, length 64
IP 8.8.8.8 > 172.17.0.2: ICMP echo reply, id 3, seq 3, length 64

ICMPプロトコル
ICMP ( Internet Control Message Protocol )とは、TCP/IPでネットワークの疎通がされているノード(サーバー、ネットワーク機器、PCなど)間で、通信状態の確認をするために使われるプロトコルです

tracerouteコマンド
tracerouteコマンドを使うことで、指定したホスト(IPアドレス)までのパケットの経路を追跡することができる。また、-nオプションを付けることで、ホスト名の逆引きを行わずにIPアドレスで表示することができます。
traceroute -n 8.8.8.8

root@60a459bf9d33:/# traceroute -n 8.8.8.8
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets
1 172.17.0.1 2.233 ms 2.146 ms 2.129 ms
2 * * *
3 * * *
4 * * *
5 * * *
6 * * *
7 * * *
8 * * *
9 * * *
10 * * *
11 * * *
12 * * *
13 * * *
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
tracerouteコマンドを使って、パケットがどのような道順で目的につくのか確認できる。
パケットが通る道順のことは、一般に「経路(Route)」と呼ばれる。
tracerouteコマンドの結果として表示される一つ一つの行は、パケットが通過した一つ一つのルータを表している。それぞれの行に表示されているIPアドレスは、パケットが通過したルータが持っているIPアドレスである。

パケットが通過するルータの台数はインターネットにおける論理的な距離として扱われる。この通過するルータの台数のことをホップ数と呼ぶ。

インターネットの不思議な力には、ルータというネットワーク機器が関係している
- ルータの仕事は、別のルータまたはホストから送られてきたパケットを次のルータまたはホストに送ること
- tracrouteコマンドの実行結果を見てわかる通り、パケットを目的地まで届けるためにたくさんのルータを通過する。
- つまり、インターネットとは、たくさんのルータによるパケットのバケツリレーによって成り立っているものであることが分かる。

- IPアドレスを持ってネットワークにつながっている、ルータではないコンピュータのことをホスト(Host)と呼ぶ。
- また、ホストやルータといった区別をしない、ネットワークにつながったコンピュータの総称をノード(Node)と呼ぶ。

ルーティングテーブル
- TCP/IPの世界では、次にパケットを渡すべき相手をルーティングテーブル(RoutingTable)というもので管理している。
- ルーティングテーブルは、インターネットにつながるノードがそれぞれ持っています。
- ip route showで、インターネットにつながる自分のコンピュータのルーティングテーブルを確認できる。

これが自分のPCのルーティングテーブル
root@60a459bf9d33:/# ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2
ルーティングテーブルは複数のルーティングエントリ(ルーティングテーブルの各行のこと)で構成されている。ルーティングエントリを構成する2大要素は、「宛先(defaultや172.17.0.0/16)」と「次にパケットを渡す相手(Next Hopとも呼ぶ)」である
注) ルーティングエントリのことを経路と呼ぶこともある。

defaultは他のどの宛先にも該当しないときに使われる宛先。デフォルトルートと呼ばれる。
172.17.0.0/16は、複数のIPアドレスをまとめた表現方法。この表記方法では、256個のIPアドレスをまとめて宛先として指定している。つまり、ルーティングテーブルでは、宛先となるIPアドレスを必ずしもひとつずつ書くわけではない。もちろん一つずつ書くこともできるけど、効率が悪いので、いくつかまとめて扱えるようにしている。
ホスト部が全て0のIPアドレスはネットワークアドレスである。 ネットワークアドレスは
ネットワーク自体を指すアドレスとして使用される。ネットワークに割り当てるアドレスなので、ホストに割り当てることはできない。

宛先の後ろにあるのがネクストポップである(次にパケットを渡す相手)。
宛先がデフォルトルートのルーティングエントリの場合、via 172.17.0.1がネクストポップに該当する。 つまり、デフォルトルートのルーティングエントリを解釈すると、他に該当しない全ての宛先のパケットは、172.17.0.1に転送する」という意味である。

なるほど、つまりルーティングテーブルのデフォルトルートの先にインターネットがありそう。

devとなっているネクストポップについて、これは該当する宛先についてはそのネットワークインターフェースを用いて通信することを示している。 たしかに、自分以外のホストと通信する際の自分のIPアドレスは、 172.17.0.2/16であり、ネットワークインターフェースはeth0だったな。

172.17.0.0/16 dev eth0の場合、自分自身のホストがそのネットワークに存在しているので、ネクストポップとなるルータを必要とせずに、通信することができる。なるほどね。わかってきた
要は、同じネットワークに所属しているホストたちだから、ルータを必要とせずに通信できるよねって話。

てことは、複数のホストがあるネットワークに所属している場合、そのネットワークに所属しているルータを使わずとも、複数のホストは通信できるということか。自分のネットワークとは別のネットワークに所属しているホストと通信する場合は、自分のネットワークに存在するルータを経由しないとダメ。わかってきた

ルーティング
ルーティングテーブルを使って、ネクストホップにパケットを転送する作業のことをルーティング(Routing)といいます。インターネットを構成するルータがやっているバケツリレーは、このルーティングという作業です。
コマンドを実行したホストが持つルートテーブルをもとにルーティングがまずは決まる。デフォルトルートの場合、NextPopのルーターにパケットが渡る。
NextPopとなるルータは他のノードからパケットを受け取って、そのパケットのヘッダを見て、宛先のIPアドレスを取得する。その後、そのルータは自分のルーティングテーブルを見て、宛先のIPアドレスに一致するNextPopにパケットを送る。
ネクストホップにパケットを渡す作業のことをフォワーディング(Forwarding)と呼んで、ルーティングの作業と区別することもあります。区別するときは、ルーティングテーブルからネクストホップを調べるまでの作業がルーティングと呼ばれます。
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 58). Kindle Edition.
へー。フォワーディングという言葉が絡むときは、ルーティングはルーティングテーブルからネクスホップを調べるまでの作業になるのか。

2つのインターネット(IPv4/IPv6)
実は、この世界には2つのインターネットが、まったく別々に存在しています。それは、プロトコルにIPv4(InternetProtocolversion4)を使ったインターネットと、IPv6(InternetProtocolversion6)を使ったインターネットです。さまざまな共存技術はありますが、両者には基本的に互換性がありません。そのため、IPv4のインターネットを使うにはIPv4アドレスが、IPv6のインターネットを使うにはIPv6アドレスが必要になります
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (pp. 58-59). Kindle Edition.

実は、IPv4のアドレスは、普及に伴って新たに使えるものが少なくなってきているのです。そのため、今は次世代のインターネットとしてIPv6への移行が試みられています。
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 59). Kindle Edition.

19ただし、NAT64/DNS64のように、異なるアドレス体系のインターネットに対して間接的にアクセスする技術も存在します。
momijiame. Learning TCP/IP networking by exercise on Linux (Japanese Edition) (p. 61). Kindle Edition.

そうか、ネットワーク自体を表すIPアドレス(ネットワークアドレス)が存在するってことは、ネットワークを差ししめることができるのか。なんとなくネットワークがわかってきた。とりあえずIPアドレスを所有しているっていうのがわかりやすい。

vagrantを入れて仮想マシンでracerouteを使うと、どのルータを通って、ホストにたどり着いたのかが分かるな。やっぱデフォルトルートがインターネットの入り口のルートを表していたのか。ルートテーブルにない宛先を指定すると、デフォルトルートが選ばれて、デフォルトルートに指定してあるNextPopのノードにパケットが運ばれる。そして、そのルータは差し出したホストと同じネットワークに所属しているからまだ自分のネットワークを出たわけではない。その後、そのルータのルートテーブルによって、自分のネットワークを出てインターネットへつながる。
vagrant@ubuntu-focal:~$ 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.219 ms 0.145 ms 0.083 ms
2 133.20.191.254 40.646 ms 40.229 ms 40.579 ms
3 133.20.17.158 40.898 ms 40.440 ms 41.117 ms
4 133.20.17.238 44.535 ms 42.643 ms 43.112 ms
5 150.99.182.77 43.795 ms 68.986 ms 68.661 ms
6 150.99.9.125 46.459 ms 43.468 ms 44.467 ms
7 101.203.88.173 45.648 ms 9.180 ms 11.384 ms
8 108.170.242.97 12.285 ms 13.108 ms 108.170.242.193 13.918 ms
9 142.250.214.139 13.445 ms 142.251.226.139 12.670 ms 142.251.60.197 13.664 ms
10 8.8.8.8 12.257 ms 13.961 ms 11.905 ms
vagrant@ubuntu-focal:~$ 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
vagrant@ubuntu-focal:~$

internetとは
インターネット(またはinternet)[a]は、インターネット・プロトコル・スイート(TCP/IP)[b]を使用してネットワークやデバイス間で通信を行う、相互接続されたコンピュータネットワークの世界的なシステムである。

そうか、超個人的に解釈すると、インターネットって、TCP/IPのプロトコル群で複数のネットワークが接続された世界的なネットワークのことなのか。要は世界中のネットワークの集合体がインターネット。インターネットへの行き方はデフォルトルートで表される。自分と同じネットワークに所属しているルータがインターネットへ案内してくれる

ネットワークを棒で書くとすると、こんな感じでホスト(IPアドレスを持ってネットワークにつながっている、ルータではないコンピュータ)はインターネットに接続している。
ネットワークを図示する際に棒(線)で表現するのは、複数のノード(ホストやルータといった区別をしない、ネットワークにつながったコンピュータの総称)が相互に接続されていることを視覚的に示すため。自分と同じネットワークに所属しているルーターがインターネットへ案内してくれる(自分のホストが持つルートテーブルからデフォルトルートが選ばれたときに、同じネットワークに所属しているルータへパケットが流れる。そしてルーターがインターネットへ案内してくれる)。