Tech × Books plusシリーズTCP/IPネットワークコマンド入門
──プロトコルとインターネット、基本の力[Linux/Windows/macOS対応]

書籍の概要

この本の概要

TCP/IP&ネットワークコマンドの解説書。『Linux×コマンド入門』(技術評論社,2021/04),『macOS×コマンド入門』(技術評論社,2020/4)の姉妹本です。

本書では,TCP/IP&ネットワークの今の基本を押さえ,ネットワークコマンドや各種ツールの基礎知識や作法を平易に解説。コマンドやWiresharkなどのツールを使って,TCP/IPのしくみ&ネットワークの基本概念を手を動かして実際の動作を見ながら学べる点が特徴です。動作確認環境としてはLinux(Ubuntu)を中心に,Windows/WSL2,macOSに対応。コマンドラインがはじめての方でも試せるようにサポートサイトも用意しました。変わる基本,変わらない基本を広く初学者の方々へ。スマートフォン,Wi-Fi,無線通信をはじめとしたコンピューターネットワークの今を気軽に体感できる1冊です。

こんな方におすすめ

  • モダンなネットワークのしくみに興味をお持ちの方々
  • 「目に見えない」ネットワークの学習にお困りの方々
  • 今のTCP/IPプロトコルスタックに関心のあるプログラマの方々
  • 無線&通信量の増大を背景とするいまどきの通信技術を知りたい学生の方々

本書のサンプル

本書の一部ページを,PDFで確認することができます。

本書の紙面イメージは次のとおりです。画像をクリックすることで拡大して確認することができます。

サンプル画像1

サンプル画像2

サンプル画像3

サンプル画像4

サンプル画像5

目次

[特別収録] TCP/IP&コマンドラインQuickリファレンス

Part 0 基礎知識

0.1 プロトコル ネットワーク通信に必要な段取りとは

  • インターネットには多種多様なハードとソフトが関わっている
  • サービスを提供する側を「サーバー」という
  • 段取りをまとめたものを「プロトコル」という
  • インターネットの共通言語「TCP/IP」
  • TCP/IPは「みんなで決めた」プロトコル

0.2 階層モデル ネットワーク通信は「層」で分けるとうまくいく

  • インターネットはネットワークのネットワーク
  • TCP/IPは4つの層で構成されている
  • 通信相手を指定する方法が各層で異なる
  • データは分割して送受信されている
  • パケットには各層でヘッダーが付け加えられている
  • OSI参照モデルは7層から成る概念モデル

0.3 OS・シェル・コマンドの基礎知識 ネットワークコマンドを使う上で知っておくべきこと

  • OSとネットワークの関係
  • コマンドとシェルの関係
  • Linuxのディストリュビューションとは
  • コマンドラインシェルの種類
  • シェルとコマンドの関係
  • コマンドの実行権限 管理者権限,root権限
  • ホームディレクトリとカレントディレクトリ

0.4 学習用の環境を準備しよう VirtualBox/UTM/WSL

  • 仮想化ソフトウェアの活用
  • 実環境と仮想環境の使い分け
  • 本書で使用する仮想環境
  • Windows VirtualBox+Ubuntu
  • macOS UTM+Ubuntu
  • Ubuntuデスクトップの使い方
    • 【補足】 ホストOSのスリープから復帰後のネットワークの状態
  • WSLの活用

0.5 パケットキャプチャ用のソフトウェア Wireshark/tcpdump

  • Windowsでのパケットキャプチャ Wireshark
  • macOSでのパケットキャプチャ Wireshark,tcpdump
  • Linuxでのパケットキャプチャ Wireshark,tcpdump

0.6 体験その❶ Webサーバーとのやりとりを体験してみよう ncコマンドでHTTP接続

  • 体験の流れ
  • ⒶWebサーバーとHTTPで対話してみよう
  • Ⓑ-1 Wiresharkで通信内容を表示してみよう
    • 【補足】 表示フィルターの活用
  • Ⓑ-2 tcpdumpで通信内容を表示してみよう

0.7 体験その❷ 接続の状態を調べてみよう pingコマンド

  • pingコマンドを実行してみよう
  • Wiresharkで通信内容を表示してみよう
  • tcpdumpで通信内容を表示してみよう

0.8 コマンドラインの基礎知識 いつでもどこでも使えるようになろう

  • この後の構成

0.9 Linuxコマンドライン Ubuntuデスクトップとbash

  • 端末アプリケーション
  • コマンド履歴
  • コマンド補完
  • 実行結果の検索・実行結果の削除
  • GUI環境との組み合わせ

0.10 Windowsコマンドライン cmd,PowerShell,WSL

  • コマンドプロンプト
  • PowerShell
  • WSL Windows Subsystem for Linux
  • WSLのディレクトリ構成
  • コマンドプロンプトやPowerShellからWSLのコマンドを実行する
  • WSLからWindowsコマンドを実行する
  • Windows Terminal
  • コマンド履歴
  • 実行結果の検索・実行結果の削除
  • GUI環境との組み合わせ

0.11 macOSコマンドライン ターミナル.appとzsh

  • ターミナル Terminal.app
  • コマンド履歴
  • コマンド補完
  • 実行結果の検索・実行結果の削除
  • GUI環境との組み合わせ

0.12 標準入出力とパイプ・リダイレクトの活用 入出力を理解しよう

  • 実行結果をファイルに保存する リダイレクト
  • 実行結果を絞り込む パイプとgrepコマンド・findstrコマンド
  • 実行結果を破棄する ヌルデバイス
  • 標準出力と標準エラー出力のリダイレクト/パイプ操作

0.13 コマンドの使い方と調べ方 「いま使っている環境で」調べよう

  • コマンドのオプションと引数
  • オプションの書式
  • コマンドの使い方を調べるには
  • manコマンドでマニュアルを参照する(macOS,Linux)

Part 1 リンク層

1.1 ネットワークデバイスとMACアドレス リンク層で使われている「ハードウェアのアドレス」

  • Ethernet(IEEE 802.3)とWi-Fi(IEEE 802.11)
  • MACアドレスはリンク層のアドレス
  • IPアドレスはネットワーク層のアドレス

1.2 ネットワークデバイスの情報を表示してみよう ip/ifconfig/ipconfig

  • ipコマンド(Linux)
  • ifconfigコマンド(macOS,Linux,WSL)
  • ipconfigコマンド・getmacコマンド(Windows)

1.3 ネットワーク接続の有無による表示の変化を見よう 状態によって表示が変わる

  • 体験の流れ
  • Ⓐネットワーク接続がオンの状態を確認
  • Ⓑ-1 ネットワーク接続がオフの状態 システムメニューで切断した場合
  • Ⓑ-2 ネットワーク接続がオフの状態 デバイスを無効にした場合
  • 後始末

1.4 MACアドレスを解決するARPとNDP IPアドレスからMACアドレスを知る

  • ARPは一斉送信でアドレスを尋ねる
  • NDPはインターネット層の近隣探索機能でアドレスを知る
  • ip neigh(ip n)/arp IPアドレスとMACアドレスの対応を管理する

1.5 2台でやりとりできる仮想マシン環境を作ろう VirtualBox/UTM

  • [準備]Windows(VirtualBox)
    • 1 NATネットワーク用のデバイスを作成する
    • 2 仮想マシン(1台目)の設定を「NATネットワーク」に変更する
    • 3 仮想マシン(1台目)のクローンを作成する
    • 4 2台目の仮想マシンを起動してホスト名(コンピューターの名前)を変更する
  • [準備]macOS(UTM)
    • 1 仮想マシンのネットワークアドレスを変更する
    • 2 仮想マシン(Ubuntu)のクローンを作成する
    • 3 Ubuntuを起動してホスト名(コンピューターの名前)を変更する

1.6 WiresharkでARPのやりとりを表示してみよう IPv4のパケットを観察

  • これから試す内容の流れ(ARP)
  • [準備]IPアドレスとMACアドレスの確認
  • Ⓐping実行前後でip nの実行結果がどう変化するか確認する
  • ⒷARPのパケットをWiresharkで表示する

1.7 WiresharkでNDPのやりとりを表示してみよう IPv6のパケットを観察

  • これから試す内容について NDP
  • [準備]IPアドレスとMACアドレスの確認
  • Ⓐping実行前後でip -nの実行結果がどう変化するか確認する
  • ⒷNDPのパケットをWiresharkで表示する

1.8 Ethernetフレーム パケットのさまざまな呼び名

  • パケットの呼び方について
  • Ethernetフレームの構造
  • Ethernetフレームはリンク層すべてに流れる?
  • 自分宛ではないパケットも取り込むプロミスキャスモード

Part 2 インターネット層

2.1 ネットワークとIPアドレス ネットワークを超えて通信相手を特定できるアドレス

  • IPアドレスはネットワークアドレス+ホストアドレス
  • ネットワークを分割するメリット
  • ルーティングテーブルには経路の情報が書かれている
  • ローカルIPアドレスとグローバルIPアドレス
  • グローバルIPアドレスは誰が管理しているのか
  • プロバイダーの役割
  • IPv4とIPv6
  • IPv6に対応しているか知るには
  • IPv4を使うかIPv6を使うか

2.2 IPv4 昔から使われている32ビットのアドレス

  • 32ビットのIPアドレスを0~255×4組で表す
  • サブネットマスクでネットワーク部とホスト部を分ける
  • 「10.0.2.15/24」と「10.0.2.15/28」は意味が異なる
  • ホスト部で特別扱いされるアドレス
  • ローカルIPアドレスとして使用できるアドレス
  • ローカルIPアドレスはインターネットでの使用が禁止されている
  • インターネットへの接続にはNAT(NAPT)という技術が使われている
  • 自分自身は127.0.0.1で表す

2.3 IPアドレスの削除と再割当を試してみよう ipコマンドによる手動割り当て

  • これから試す内容の流れ
  • ipコマンドによるIPアドレスの表示と変更(Linux)
  • IPアドレスを削除してみよう
  • 新しいIPアドレスを付けてみよう

2.4 IPv6 アドレス枯渇を解消する128ビットのアドレス

  • 128ビットのIPアドレスを16進4桁×8組で表す
  • IPv6アドレスの省略表記
  • ネットワーク部分はプレフィックス長で表す
  • ユニキャストアドレスとマルチキャストアドレス
  • 3種類のユニキャストアドレス
  • 誰かが応えるエニーキャストアドレス

2.5 ICMP/ICMPv6パケットを観察してみよう IPv4とIPv6を見比べる

  • pingはICMP Echo Requestを送りEcho Replyを受け取る
  • ICMPパケットを見てみよう
  • ICMPパケットの構造
  • ICMPv6パケットを見てみよう
  • ICMPv6パケットの構造
  • IPのフラグメンテーション(断片化)

2.6 pingに応答しない設定を試してみよう 「応答がない」にもいろいろある

  • これから試す内容の流れ
  • pingに応答しないⒶ ICMPの応答を拒否してみよう ping応答が「拒否」されたらどうなる
  • pingに応答しないⒷ ICMPを遮断してみよう

2.7 異なるネットワークとの通信を試してみよう 経路設定とIPフォワーディング

  • [準備]Windows(VirtualBox)
    • 1 NATネットワーク用のデバイスを作成する
    • 2 仮想マシン(Ubuntu1)のクローンを作成する
    • 3 クローンで作成した仮想マシン(Ubuntu3)のネットワークデバイスを変更する
    • 4 Ubuntu3を起動してホスト名(コンピューターの名前)を変更する
    • 5 Ubuntu1にネットワークデバイスを追加する
  • [準備]macOS(UTM)
    • 1 仮想マシン(Ubuntu1)にネットワークデバイスを追加する
    • 2 仮想マシン(Ubuntu1)のクローンを作成する
    • 3 新しい仮想マシン(Ubuntu3)のネットワークを設定する
    • 4 Ubuntuを起動してホスト名(コンピューターの名前)を変更する
  • これから試す内容の流れ
  • ⒶUbuntu1,2,3相互にpingを送ってみる
    • 各ホストのIPアドレスの確認
    • Ubuntu1からUbuntu2,Ubuntu3へのpingは可能
    • Ubuntu2からUbuntu1とUbuntu3へのping
    • Ubuntu3からUbuntu1とUbuntu2へのping
  • ⒷUbuntu2に経路情報を追加する Ubuntu2にUbuntu3への経路情報を設定する
    • Ubuntu1に,Ubuntu3へのルートを追加する
    • 結果の確認
  • ⒸUbuntu1でIPフォワーディングを有効にする
  • ⒹUbuntu3に経路情報を追加する

2.8 インターネットの経路を探索してみよう traceroute/mtr/pathping

  • ネットワークの1区間をホップという
  • 経路を調べるコマンド
  • tracerouteコマンド(Linux/macOS)
  • mtrコマンド(Linux)
  • tracert・pathpingコマンド(Windows)

2.9 pingコマンドで経路を探索してみよう tracerouteのしくみ

  • TTL/Hop Limitであと何回ホップできるかが決まる
  • traceroute/tracertはTTLで経路を探索している
  • pingコマンドで経路を調べる(Windows)
  • pingコマンドで経路を調べる(macOS)
  • pingコマンドで経路を調べる(Linux)

Part 3 トランスポート層

3.1 TCPとUDP コネクション型とコネクションレス型の違いとは

  • コネクション型のTCP,コネクションレス型のUDP
  • TCPの3ウェイハンドシェイク
  • WiresharkでTCPパケットを見てみよう
  • TCPのパケット分割と順序制御
  • ウィンドウ制御 フロー制御と輻輳制御で取りこぼしを防ぐ
  • 速度を優先するUDP

3.2 ポート番号でサービスを区別する 80はHTTP,443はHTTPS

  • ポート番号はサービスを特定するのに使用される
  • 0~65535の数値で表し,3つに区分けされている
  • NATとNAPT
  • ポート番号はファイアウォールでも使用される
  • nmap 開いているポートを調べる(ポートスキャン)
  • ss/netstat 現在の通信状態を調べる

3.3 TCPとUDPのパケットを見比べてみよう ncコマンドで試してみよう

  • これから試す内容の流れ ncコマンド
  • TCPによる通信
  • TCPのパケット
  • UDPによる通信
  • UDPパケットを見てみよう

3.4 パケットロスを発生させてみよう tcコマンドで試してみる

  • 1 一定間隔で送られるデータの観察 これから試す内容の流れを確認しよう
  • Ⓐ一定間隔で送られるデータの観察 パケットロスがない状態
    • TCP通信の実行例
    • UDP通信の実行例
  • Ⓑ一定間隔で送られるデータの観察 パケットロスがある状態
    • 【参考】 IP通信だとどうなるか
  • いったん後始末
  • 2 大きなデータを送信した場合の観察 これから試す内容の流れを確認しよう
  • テスト用のファイルを作成する
  • Ⓐ大きなデータの送信 パケットロスがない状態
    • TCP通信での実行
    • UDP通信での実行
  • Ⓑ大きなデータの送信 パケットロスがある状態
  • 結果の比較と後始末

3.5 TLS 安全な通信とは

  • TLSで実現する「安全な通信」とは
  • なりすましを防ぐ「サーバー証明書」
  • 暗号化には公開鍵と共有鍵を使用する
  • TLSハンドシェイクで安全な通信を確立
    • ❶Client Hello
    • ❷Server Hello
    • ❸Certificate, Certificate Verify
    • ❹Finished
  • HTTPとHTTPSのハンドシェイクを見比べてみよう

3.6 TLS通信を見てみよう 暗号化された状態と復号された状態を見比べよう

  • opensslによるHTTPS通信
  • セッションキーで復号する

3.7 QUIC UDPベースでセキュアな高速通信を狙うプロトコル

  • QUICは高速で安全な通信を目指して新しく作られたプロトコル
  • QUICのハンドシェイク
  • TCPのヘッドオブラインブロッキング問題
  • モバイル通信の再接続問題
    • 【参考】 Wiresharkでの表示

Part 4 アプリケーション層

4.1 DNSによるドメイン名とIPアドレスの変換 ドメイン名のしくみと名前解決

  • 名前からIPアドレスを知るのが「名前解決」
  • nslookup/host 接続先のドメインからIPアドレスを調べる
  • 名前解決のしくみ
  • インターネットで使われる名前は「ドメイン」で管理されている
  • ドメイン名からわかること
  • トップレベルドメイン
  • 「DNSサーバー」は名前解決用のサーバー
  • DNSが管理する情報(レコード)
  • whois ドメインの管理情報を表示
  • 自分が使用しているDNSサーバーを調べるには
  • 名前解決の際に使用するDNSサーバーを指定する
  • DNSの効率化とDNSSEC

4.2 mDNSによるローカルネットでの名前解決 自ら名乗って名前を解決

  • mDNSは「設定なし」で名前解決できるしくみ
  • 名前を使ってpingを実行してみよう
    • 【補足】 VirtualBox/UTMにインストールしたUbuntuのmDNSでIPv6の名前解決を行う

4.3 Web通信のプロトコル URLとHTTP/HTTPSを理解しよう

  • URLからはプロトコルと場所がわかる
  • URLの基本書式
  • HTTPにはいくつかのバージョンがある
  • リクエストメソッド
  • HTTPのステータス
  • HTTPとHTTPSは標準のポート番号が異なる

4.4 HTTP/HTTPSの通信を見てみよう curlコマンドで通信内容を比較する

  • curlコマンドによるHTTP/HTTPS通信
  • curlコマンドを試してみよう
  • 環境変数SSLKEYLOGFILE
  • HTTP/1.1とHTTP/2でデータを取得する
  • HTTP/1.1とHTTP/2のパケットを見比べる
  • ❶HTTP通信の開始
  • ❷HTTPリクエスト(GETメソッド)
  • ❸HTTPレスポンス
  • Firefoxのパケットを表示してみよう
    • 【補足】 Wiresharkのフィルターについて
    • 【参考】 curlによるHTTP/3通信

4.5 電子メールのプロトコル メール転送のしくみとSMTP/POP/IMAPの役割

  • SMTPはメールを転送,POPはメールを取得するためのプロトコル
  • メール転送とバケツリレー
  • メールの経路はヘッダーに残されている
  • エラーメールは経由地のMTAが送信するケースもある
  • SMTPの認証は後から追加された
  • IMAP4はサーバー上のメールを直接操作できるプロトコル
  • SMTP・POP3・IMAP4のポート番号
  • MUA(メールソフト)の設定はどのようになっているか
  • OAuthによるメールアカウントの認証
  • メールはテキスト形式に変換して送信されている
  • Base64によるエンコード

4.6 POP受信を試してみよう POPコマンドによるメール受信のプロセス

  • POPのコマンド
  • POPでメールを受信してみよう
  • MUAは何をしているのか

4.7 SMTP送信を試してみよう SMTPコマンドによるメール送信のプロセス

  • SMTPのコマンド
  • base64コマンドでユーザー名とパスワードをエンコードしておく
  • SMTPでメールを送信してみよう
  • 送信者と受信者のメールアドレスはどこで指定しているか

4.8 SSH 遠隔地のコンピューターをコマンドで操作する

  • 遠隔地からコンピューターを操作する
  • これから試す内容(SSH接続)
  • ⒶホストOSへの接続
  • [準備]Windows(ホストOS)
  • [準備]macOS(ホストOS)
  • ゲストOSからホストOSへログインする
  • ⒷゲストOSへの接続
  • [準備]ポートフォワーディングの設定(VirtualBox)
  • [準備]Ubuntu(ゲストOS)
  • [確認用]ゲストOSからゲストOSの接続
  • ホストOSからゲストOSの接続 Windows(VirtualBox)
  • ホストOSからゲストOSの接続 macOS(UTM)
  • WARNINGが表示された場合
  • Ⓒ公開鍵でパスワードなしの接続を行う
  • ssh-keygenで自分用の鍵を作る
    • 【注意】 「already exists」メッセージが表示された場合
  • scpで接続先に鍵をコピーする Windows
    • 手順の詳細
  • ssh-copy-idで接続先に鍵をコピーする macOS

4.9 VPN パブリックな回線を使ってプライベートなネットワークを実現する

  • 広域Ethernet/IP-VPN/エントリーVPN/インターネットVPN
  • レイヤ2VPN/レイヤ3VPN/SSL-VPN
  • OpenVPNで接続しているパケットを見てみよう
    • Ⓐ[準備]Ubuntu1側でOpenVPN用の設定ファイルを入手する
    • Ⓑ[準備]Ubuntu2側でUbuntu1のパケットを観察する準備をする(VirtualBox)
    • ⒸOpenVPNによる接続前後のパケットを観察する
  • Ⓐ[準備]OpenVPNによる接続を試してみよう
  • Ⓑ[準備]プロミスキャスモードを設定しよう VirtualBox
  • ⒸOpenVPNによる接続前後のパケットを観察しよう

4.10 Network Namespaceの活用 コマンドラインで仮想ネットワーク環境を作る

  • Network Namespaceとは
  • Network Namespaceの作成と削除
  • ネットワークデバイスの作成
  • 最初からやり直すには
  • Network Namespaceの作成
  • 仮想ネットワークデバイスの作成
  • 仮想ネットワークデバイスを有効化する
  • 仮想ネットワークデバイスにIPアドレスを割り当てる
  • [テスト❶]同じネットワークどうしでの通信
  • ルーティングとIPフォワーディング
  • [テスト❷]外部への通信
  • デフォルトルートの設定
  • NATの設定
    • 【補足】 WSLの名前解決
  • tcpdumpで観察する
    • eth0のIPアドレスでのtcpdump
    • veth-u2のIPアドレスでのtcpdump
  • Wiresharkで観察する
    • 【補足】 WSL環境のパケットをWindows版のWiresharkで観察する

Column

  • テキストの表示に使われるコマンド
  • ランダムMAC(プライベートアドレス)とMACアドレススプーフィング
  • Wiresharkでパケットダイアグラムを表示する
  • DHCPによる自動割り当て
  • Ubuntu環境用のtracerouteコマンド
  • pingコマンドで経路上の最小MTUを調べる
  • Windowsの名前解決
  • テキストエディタvi 端末で使えるテキストエディタ

著者プロフィール

西村めぐみ(にしむらめぐみ)

1990年代,生産管理ソフトウェアの開発およびサポート業務/セミナー講師を担当。書籍および雑誌での執筆活動を経て㈱マックス・ヴァルト研究所に入社,マーケティングリサーチの企画および実査を担当。その後,PCおよびMicrosoft Officeのeラーニング教材作成/ 指導,新人教育にも携わる。おもな著書は『図解でわかるLinuxのすべて』(日本実業出版社),『シェルの基本テクニック』(IDGジャパン),『[新版 zsh&bash対応]macOS×コマンド入門』『Linux+コマンド入門』(技術評論社)など。