拙著「Linuxネットワークプログラミング」の紹介

拙著「Linuxネットワークプログラミング」に関する情報ページです。 サンプルプログラムダウンロード、はじめに/目次/Chapter 1〜3までのサンプルPDF、書籍中の間違いに関する情報を扱っています。

参考:拙著に関して発売時に書いたブログ記事。拙著中のコラムを書く過程で書いたブログ記事「いいから殺せ。後はこっちでなんとかするから」。

サンプルプログラム

(間違い箇所の修正対応済み)

まとめてダウンロード(tar.gz)

Errata

書籍中の間違い一覧

拙著の内容

はじめに、目次、Chapter 1〜Chapter 3のPDFダウンロード

chapter 1 インターネットの仕組み

1-1 インターネットとは
  • ネットワークとインターネット
  • 初期のインターネット設計思想
  • パケットという考え方
1-2 OSI 7層モデル
  • 物理層とリンク層
  • ネットワーク層
  • トランスポート層
  • セッション層とプレゼンテーション層、アプリケーション層
1-3 TCPとUDPの概要
  • コネクション型プロトコル〜TCP
  • コネクションレス型プロトコル〜UDP
1-4 IPアドレス
  • ネットワーク部とホスト部
  • IPアドレスの種類
  • IPアドレスの一意性
  • プライベートアドレス
1-5 ドメイン名とホスト名
  • ドメインネームシステム
1-6 Webとメールの仕組み
  • Hyper Text Transfer Protocol
  • Web ブラウザが行うURLの解釈処理
  • メールの仕組み
1-7 IPv4とIPv6・
  • IPv6への移行
1-8 Chapter 1 のまとめ

chapter 2 TCP通信の基礎

2-1 TCPによるプログラミングの流れ
  • ソケットとプログラミング
  • Linuxにおけるソケットの作成
2-2 TCP サーバ/クライアントの実装
  • 単純なTCPサーバの実装
  • 単純なTCPクライアントの実装
2-3 ソケットプログラミングのエラー処理
  • errnoとperror
  • ソケット作成の失敗とperror利用例
  • perrorとスレッド処理
  • printf()とperror()の実行順
  • bind()の意味
  • listen()の意味
  • 無効になったソケットに対するデータ送信
  • 文字列でのエラー内容取得
2-4 名前解決の実装
  • 名前解決のサンプルプログラム
  • エラー解析関数
  • IPv6とIPv4両方に対応する
  • getaddrinfo()をbind()で使う
2-5 単純なファイル転送プログラム
  • ファイル送信側サンプルプログラム
  • ファイル受信側サンプルプログラム
2-6 単純なHTTPクライアント/サーバ
  • HTTPクライアントの実装
  • HTTPサーバの実装
2-7 Chapter2 のまとめ

chapter 3 UDP通信の基礎

3-1 UDPの特徴とプログラミング
3-2 UDP のプログラミング
  • 単純なUDP受信プログラム
  • 単純なUDP送信プログラム
  • getaddrinfo()を利用したUDP プログラム
  • IPv6が未設定の環境を想定する
3-3 ブロードキャストプログラミング
  • ブロードキャスト送信プログラム
3-4 マルチキャストプログラミング
  • マルチキャスト送信プログラム
  • マルチキャスト受信プログラム
3-5 UDP ソケットの「名前」とbind()
  • UDPでの「返信」
3-6 ソケットバッファ
3-7 Chapter3 のまとめ

chapter 4 ネットワーク情報の取得と設定

4-1 ネットワークインターフェース
  • インターフェース名とインターフェース番号
  • インターフェース情報一覧の取得
  • インターフェース一覧のみの取得
  • インターフェース名の変更
  • ハードウェアアドレスの取得
  • IPアドレスの設定
  • ネットマスクの設定
  • up/down状態
  • ハードウェアアドレスの設定
  • MTUの取得/設定
4-2 /procインターフェース
  • 経路テーブル
  • ネットワークデバイス統計情報
  • IPv6アドレス
  • ARP
  • 開いているソケット情報
4-3 Chapter 4 のまとめ

chapter 5 Netlinkによる情報取得と設定

5-1 Netlinkの概要
  • Netlinkを使ったプログラムの流れ
  • Netlinkソケットの作成
5-2 Netlinkメッセージの送受信
  • NetlinkユニキャストとNetlink マルチキャスト
  • sockaddr_nl構造体
  • Netlinkメッセージフォーマット
  • NETLINK_ROUTEプロトコル
5-3 インターフェース情報の取得
  • インターフェースをdown状態にする
  • MTUの設定
5-4 IPアドレスの取得
5-5 IPアドレス変更通知の受け取り
  • マルチキャストに必要な特権
5-6 IPアドレスの設定
  • IPアドレスの削除
5-7 Chapter 5 のまとめ

chapter 6 基本的な通信関連関数

6-1 ノンブロッキングモード
  • ノンブロッキングでのUDP受信
6-2 エンディアンとネットワークバイトオーダー
  • バイトオーダー
  • エンディアン同士の相互変換
  • 数値や構造体を送信するときの注意点
  • 相互接続の注意点
6-3 ソケットの設定を取得する
  • ソケットの名前を取得する
  • 接続相手の情報を取得する
6-4 シグナルハンドリング
6-5 知っておくと便利なマクロ
  • IPv4アドレス用マクロ
  • IPv6アドレス用マクロ
  • IPアドレス用文字列のサイズ
6-6 Chapter 6 のまとめ

chapter 7 プロセス間通信

7-1 プロセス
  • プロセスを生成する
7-2 スレッド
7-3 プロセス間通信とは
7-4 シグナル
  • kill()システムコール
  • シグナルハンドラ
7-5 UNIX ソケット
  • SOCK_DGRAMでUNIXソケットを使う
7-6 ソケットペア
7-7 パイプ
  • コマンドラインのパイプ
7-8 System V IPC
  • IPC資源とIPCキー
  • 共有メモリ
  • セマフォ
  • メッセージキュー
  • POSIX IPC関数
  • pthread mutexをプロセス間で利用する
7-9 Chapter 7 のまとめ

chapter 8 複数のソケットを扱う

8-1 epoll とは
  • epoll_create()システムコール
  • epoll_ctl()システムコール
  • epoll_wait システムコール
8-2 単純なepoll
  • データの受信プログラム
  • データの送信プログラム
8-3 epoll_wait()の活用
  • 送信可能かどうかのチェック
  • タイムアウトのチェック
  • connect()処理の終了v
8-4 epoll_wait()の解除
  • シグナルを送信する
  • ソケットペアを使う
8-5 select()とpoll()
  • select()システムコール
  • poll()システムコール
  • 送信可能かどうかのチェック
  • タイムアウトのチェック
8-6 Chapter 8 のまとめ

chapter 9 通信プログラムのデバッグ

9-1 パケットキャプチャによるデバッグ
  • 機器内で直接パケットを見る方法
  • 通信路でパケットを見る方法
  • パケットキャプチャと暗号化
9-2 インターネットとカプセル化
  • プロミスキャスモード
9-3 Wireshark
  • Wiresharkの基本動作
  • キャプチャフィルタ
  • Follow TCP Stream
  • フィルタ機能
9-4 各種ヘッダ
  • IPv4ヘッダ
  • IPv6ヘッダ
  • TCPヘッダ
  • UDPヘッダ
  • ICMPヘッダ
9-5 tcpdump
  • 主なオプション
  • キャプチャパケットをファイルに保存
  • 条件式を指定してフィルタリング
9-6 デバッグTIPS
  • なぜ接続できないのか?
  • TCP接続を切断したのはどちら?
  • TCPでデータがこない?
  • パケットが出てる?来てる?
9-7 Chapter 8 のまとめ

chapter 10 TCPサーバプログラミング

10-1 複数セッションの並列処理
  • fork()を利用する
  • スレッドを利用する
  • epollを利用する
10-2 TCP とTIME_WAIT
  • TIME_WAIT状態
  • ポート番号をすぐに再利用する
10-3 shutdown()の活用
10-4 ルートディレクトリを仮想的に変更
  • chroot jailを抜ける
10-5 デーモン化
10-6 syslogへの対応
  • syslog()の利用プログラム
10-7 Chapter 10 のまとめ

chapter 11 デュアルスタックプログラミング

11-1 sockaddr_in6構造体
11-2 sockaddr_storage構造体
11-3 IPv4射影アドレス
11-4 IPv4アドレス枯渇とIPv6
  • インターネットアーキテクチャの変化
  • Large Scale NAT
  • 日本国内における影響
11-5 Chapter11 のまとめ

chapter 12 生パケットプログラミング

12-1 RAWソケット
12-2 AF_PACKET
  • SOCK_DGRAMとSOCK_RAWの違い
  • sockaddr_ll
  • AF_PACKETを利用したICMP ECHOの送受信
  • プロミスキャスモード
  • bind()
12-3 pcapを使ったキャプチャ
  • インストールとコンパイル
  • パケットキャプチャの流れ
  • pcapを使ったキャプチャ
  • フィルタを利用する
  • ファイルへの書き出し
  • ファイルからの読み込み
12-4 Chapter 12 のまとめ

chapter 13 マルチキャストプログラミング

13-1 マルチキャストアドレス
  • 動的なマルチキャストアドレス割り当て
  • TTLとスコープ
  • IPv6でのマルチキャストアドレス
  • マルチキャストTTL の設定(IPv4)
13-2 Source Specific Multicast
  • SSMを利用する
  • SSMへの送信
13-3 出力インターフェースの指定
  • 出力インターフェースを指定する(IPv4)
  • 出力インターフェースを指定する(IPv6)
13-4 ASMにおけるマルチキャストソースフィルタ
13-5 マルチキャストフィルタ情報の取得
13-6 IP_MULTICAST_LOOP
  • JOINできる最大数
13-7 マルチキャスト関連の旧API
  • IP_ADD_MEMBERSHIPの利用(IPv4)
13-8 Chapter 13 のまとめ

Appendix

  • IPv4しか扱えない関数
  • gethostbyname()
  • gethostbyaddr()
  • herror()、hstrerror()
  • inet_ntoa()、inet_addr()
  • IPv4専用関数の落とし穴

コラム一覧

  • システムコールとは
  • サンプルプログラムの実行について
  • man と章番号
  • 非同期シグナルセーフな関数
  • サブネットブロードキャストを利用したDoS
  • 困ったときのnet-tools ソースコード
  • ビッグエンディアンとリトルエンディアンの語源
  • SIGHUP
  • IPC_PRIVATE?
  • select()とMSG_OOB
  • ぁゃτぃUNIX用語
  • Wiresharkとethereal
  • Bugzilla
  • プリプロセッサで処理される組み込みマクロ