まえがき xvii |
第1部 序説とTCP/IP概説 1 |
第1章 序説 3 |
1.1 導入 3 |
1.2 簡単なdaytimeクライアント 6 |
1.3 プロトコル独立 10 |
1.4 エラー処理:ラッパー関数 11 |
1.5 簡単なdaytimeサーバ 13 |
1.6 クライアントーサーバ例題のロードマップ 15 |
1.7 OSIモデル 18 |
1.8 BSDにおけるネットワークキングの歴史 19 |
1.9 テスト用のネットワークとホスト 19 |
1.10 Unixにおける標準 23 |
1.11 64ビットアーキテクチャ 26 |
1.12 要約 27 |
第2章 トランスポート層:TCPとUDP 29 |
2.1 導入 29 |
2.2 TCP/IP概観 29 |
2.3 UDP:ユーザデータグラムプロトコル 32 |
2.4 TCP:トランスミッションコントロールプロトコル 32 |
2.5 TCP:コネクションの確立と終了 34 |
2.6 TIME_WAIT状態 40 |
2.7 ポート番号 41 |
2.8 TCPポート番号と並行サーバ 44 |
2.9 バッファサイズの影響 46 |
2.10 インターネットの標準サービス 50 |
2.11 一般的なインターネットアプリケーションの使用プロトコル 51 |
2.12 要約 52 |
第2部 基本ソケット操作 55 |
第3章 ソケットAPI入門 57 |
3.1 導入 57 |
3.2 ソケットアドレス構造体 57 |
3.3 値-結果引数 63 |
3.4 バイト順序関数 65 |
3.5 バイト列操作関数 68 |
3.6 inet_aton関数、inet_addr関数およびinet_ntoa関数 70 |
3.7 inet_pton関数とinet_ntop関数 71 |
3.8 sock_ntop関数と関連関数 74 |
3.9 readn関数、writen関数、およびreadline関数 76 |
3.10 isfdtype関数 80 |
3.11 要約 81 |
第4章 基本TCPソケット 83 |
4.1 導入 83 |
4.2 socket関数 83 |
4.3 connect関数 86 |
4.4 bind関数 89 |
4.5 listen関数 91 |
4.6 accept関数 97 |
4.7 fork関数とexec関数 99 |
4.8 並行サーバ 102 |
4.9 close関数 104 |
4.10 getsockname関数とgetpeername関数 105 |
4.11 要約 108 |
第5章 TCPクライアントーサーバ例題 109 |
5.1 導入 109 |
5.2 TCPechoサーバ:main関数 110 |
5.3 TCPechoサーバ:str_echo関数 111 |
5.4 TCPechoクライアント:main関数 112 |
5.5 TCPechoクライアント:str_cli関数 112 |
5.6 正常な起動 113 |
5.7 正常な終了 115 |
5.8 Posixのシグナル処理 116 |
5.9 SIGCHLDシグナルの処理 119 |
5.10 wait関数とwaitpid関数 122 |
5.11 accept完了前のコネクション確立中断 126 |
5.12 サーバの終了 127 |
5.13 SIGPIPEシグナル 129 |
5.14 サーバホストのクラッシュ 130 |
5.15 サーバホストのクラッシュと再起動 131 |
5.16 サーバホストのシャットダウン 132 |
5.17 TCP例題の要約 132 |
5.18 データ形式 134 |
5.19 要約 137 |
第6章 I/Oの多重化:select関数とpoll関数 139 |
6.1 導入 139 |
6.2 I/Oモデル 140 |
6.3 select関数 145 |
6.4 str_cli関数(再訪) 151 |
6.5 バッチ入力 153 |
6.6 shutdown関数 155 |
6.7 str_cli関数(再々訪) 157 |
6.8 TCPechoサーバ(再訪) 158 |
6.9 pselect関数 163 |
6.10 poll関数 164 |
6.11 TCPechoサーバ(再々訪) 167 |
6.12 要約 168 |
第7章 ソケットオプション 171 |
7.1 導入 171 |
7.2 getsockopt関数とsetsockopt関数 171 |
7.3 オプションサポートの確認とデフォルト値の取得 172 |
7.4 ソケットの状態 176 |
7.5 一般的なソケットオプション 177 |
7.6 IPv4ソケットオプション 191 |
7.7 ICMPv6ソケットオプション 192 |
7.8 IPv6ソケットオプション 193 |
7.9 TCPソケットオプション 195 |
7.10 fcntl関数 198 |
7.11 要約 201 |
第8章 基本UDPソケット 205 |
8.1 導入 205 |
8.2 recvfrom関数とsendto関数 205 |
8.3 UDPechoサーバ:main関数 207 |
8.4 UDPechoサーバ:dg_echo関数 207 |
8.5 UDPechoクライアント:main関数 210 |
8.6 UDPechoクライアント:dg_cli関数 210 |
8.7 データグラムの消失 211 |
8.8 受信した応答の検証 211 |
8.9 サーバが存在しない場合 214 |
8.10 UDP例題の要約 215 |
8.11 UDPにおけるconnect関数 216 |
8.12 dg_cli関数(再訪) 221 |
8.13 UDPにおける流量制御の欠如 222 |
8.14 UDPにおける出力インターフェースの特定 225 |
8.15 selectを用いるTCPechoサーバとUDPechoサーバ 226 |
8.16 要約 228 |
第9章 基本的な名前-アドレス変換 231 |
9.1 導入 231 |
9.2 ドメイン名前システム 231 |
9.3 gethostbyname関数 234 |
9.4 RES_USE_INET6リゾルバオプション 238 |
9.5 gethostbtname2関数とIPv6サポート 239 |
9.6 gethostbyaddr関数 242 |
9.7 uname関数 243 |
9.8 gethostname関数 244 |
9.9 getservbyname関数とgetservbyprot関数 244 |
9.10 そのほかのネットワーク関連情報 248 |
9.11 要約 249 |
第3部 高度なソケット操作 251 |
第10章 IPv4IPv6の相互運用 253 |
10.1 導入 253 |
10.2 IPv4クライアントとIPv6サーバ 254 |
10.3 IPv6クライアントとIPv4サーバ 257 |
10.4 IPv6アドレスの検査マクロ 259 |
10.5 IPV6_ADDRFORMソケットオプション 260 |
10.6 ソースコードの互換性 262 |
10.7 要約 262 |
第11章 高度な名前-アドレス変換 265 |
11.1 導入 265 |
11.2 getaddrinfo関数 265 |
11.3 gai_strerror関数 270 |
11.4 freeaddrinfo関数 271 |
11.5 getaddrinfo関数:IPv6とUnixドメイン 271 |
11.6 getaddrinfo関数:例題 274 |
11.7 host_serv関数 276 |
11.8 tcp_connect関数 277 |
11.9 tcp_listen関数 280 |
11.10 udp_client関数 284 |
11.11 udp_connect関数 287 |
11.12 udp_server関数 288 |
11.13 getnameinfo関数 289 |
11.14 再入可能関数 291 |
11.15 gethostbyname_r関数とgethostbyaddr_r関数 294 |
11.16 getaddrinfo関数とgetnameinfo関数のインプリメンテーション 296 |
11.17 要約 318 |
第12章 デーモンプロセスとinetdスーパーサーバ 321 |
12.1 導入 321 |
12.2 syslogdデーモン 322 |
12.3 syslog関数 323 |
12.4 daemon_init関数 325 |
12.5 inetdデーモン 329 |
12.6 daemon_inetd関数 334 |
12.7 要約 336 |
第13章 高度な入出力関数 339 |
13.1 導入 339 |
13.2 ソケットのタイムアウト 339 |
13.3 recv関数とsend関数 344 |
13.4 readv関数とwritev関数 346 |
13.5 recvmsg関数とsendmsg関数 347 |
13.6 補助データ 352 |
13.7 キューイングされているデータ量を知る 355 |
13.8 ソケットと標準I/O 356 |
13.9 T/TCP:トランザクション用TCP 359 |
13.10 要約 360 |
第14章 Unixドメインプロトコル 363 |
14.1 導入 363 |
14.2 Unixドメインソケットアドレス構造体 364 |
14.3 socketpair関数 366 |
14.4 ソケット関数群 367 |
14.5 Unixドメインのストリームクライアントーサーバ 368 |
14.6 Unixドメインのデータグラムクライアントーサーバ 368 |
14.7 ディスクリプタパッシング 371 |
14.8 送信者クレデンシャルの受信 379 |
14.9 要約 382 |
第15章 非ブロッキングI/O 385 |
15.1 導入 385 |
15.2 非ブロッキング読み出しと書き込み:str_cli関数(再訪) 386 |
15.3 非ブロッキングconnect 396 |
15.4 非ブロッキングvonnect:daytimeクライアント 397 |
15.5 非ブロッキングconnect:Webクライアント 400 |
15.6 非ブロッキングaccept 409 |
15.7 要約 411 |
第16章 ioctl操作 413 |
16.1 導入 413 |
16.2 icol関数 413 |
16.3 ソケット操作 414 |
16.4 ファイル操作 416 |
16.5 インターフェース設定 416 |
16.6 get_ifi_info関数 418 |
16.7 インターフェース操作 425 |
16.8 ARPキャッシュ操作 427 |
16.9 経路テーブル操作 429 |
16.10 要約 430 |
第17章 経路制御ソケット 433 |
17.1 導入 433 |
17.2 データリンクソケットアドレス構造体 434 |
17.3 経路ソケットの読み書き 434 |
17.4 sysctl操作 442 |
17.5 get_ifi_info関数 446 |
17.6 インターフェース名関数とインターフェースインデックス関数 449 |
17.7 要約 454 |
第18章 ブロードキャスト 455 |
18.1 導入 455 |
18.2 ブロードキャストアドレス 456 |
18.3ユニキャストとブロードキャスト 458 |
18.4 ブロードキャストを用いるdg_cli関数 461 |
18.5 競合状態 464 |
18.6 要約 470 |
第19章 マルチキャスト 473 |
19.1 導入 473 |
19.2 マルチキャストアドレス 473 |
19.3 LAN上のマルチキャストとブロードキャスト 477 |
19.4 WAN上のマルチキャスト 479 |
19.5 マルチキャストソケットオプション 481 |
19.6 mcast_join関数と関連関数 485 |
19.7 マルチキャストを用いるdg_cli 489 |
19.8 MBoneセッション告知の受信 490 |
19.9 送信と受信 493 |
19.10 SNTP:Simple Network Time Protocol 496 |
19.11 SNTP(続き) 500 |
19.12 要約 513 |
第20章 UDPソケットの高度な操作 517 |
20.1 導入 517 |
20.2 フラグ、終点IPアドレスおよびインターフェースインデックスの受信 518 |
20.3 データグラムの切り捨て 524 |
20.4 UDP対TCP 525 |
20.5 UDPアプリケーションへの信頼性の付加 527 |
20.6 インターフェースアドレスのバインド 537 |
20.7 並行UDPサーバ 542 |
20.8 IPv6パケット情報 543 |
20.9 要約 547 |
第21章 帯域外データ 549 |
21.1 導入 549 |
21.2 TCP帯域外データ 549 |
21.3 sockatmark関数 556 |
21.4 TCP帯域外データの要約 562 |
21.5 クライアントーサーバ・ハートビート関数 564 |
21.6 要約 568 |
第22章 シグナル駆動I/O 571 |
22.1 導入 571 |
22.2 ソケットにおけるシグナル駆動I/O 571 |
22.3 SIGIOを用いるUDPのechoサーバ 574 |
22.4 要約 580 |
第23章 マルチスレッド 581 |
23.1 導入 581 |
23.2 基本スレッド関数:生成と終了 582 |
23.3 マルチスレッドを用いるstr_cli関数 585 |
23.4 マルチスレッドを用いるTCPのechoサーバ 586 |
23.5 スレッド固有データ 591 |
23.6 Webクライアントと同時コネクション(再訪) 598 |
23.7 相互排除変数 602 |
23.8 条件変数 606 |
23.9 Webクライアントと同時コネクション(続き) 609 |
23.10 要約 611 |
第24章 IPオプション 613 |
24.1 導入 613 |
24.2 IPv4オプション 613 |
24.3 IPv4始点経路指定オプション 615 |
24.4 IPv6拡張ヘッダ 622 |
24.5 IPv6ホップ毎オプションと終点オプション 623 |
24.6 IPv6経路ヘッダ 627 |
24.7 IPv6持続オプション 630 |
24.8 要約 631 |
第25章 rawソケット 633 |
25.1 導入 633 |
25.2 rawソケットの作成 634 |
25.3 rawソケットからの出力 634 |
25.4 rawソケットからの入力 636 |
25.5 pingプログラム 639 |
25.6 tracerouteプログラム 650 |
25.7 ICMPメッセージデーモン 661 |
25.8 要約 677 |
第26章 データリンクアクセス 679 |
26.1 導入 679 |
26.2 BPF:BSDパケットフィルタ 680 |
26.3 DLPI:データリンクプロバイダインターフェース 682 |
26.4 Linex:SOCK_PACKET 683 |
26.5 libpcap:パケット取り込みライブラリ 684 |
26.6 UDPチェックサムフィールドの検査 684 |
26.7 要約 700 |
第27章 クライアントーサーバシステムの設計手法 701 |
27.1 導入 701 |
27.2 TCPクライアントの設計方法 703 |
27.3 評価用TCPクライアント 704 |
27.4 TCP反復サーバ 706 |
27.5 TCP並行サーバ:1クライアント-1子プロセス 706 |
27.6 TCP事前forkサーバ:accept周りのロックなし 710 |
27.7 TCP事前forkサーバ:ファイルロックによるacceptの保護 716 |
27.8 TCP事前forkサーバ:スレッドロックによるacceptの保護 719 |
27.9 TCP事前forkサーバ:ディスクリプタパッシング 721 |
27.10 TCP並行サーバ:1クライアント-1スレッド 726 |
27.11 TCP事前スレッド生成サーバ:スレッドごとのaccept 727 |
27.12 TCP事前スレッド生成サーバ:主スレッドによるaccept 729 |
27.13 要約 731 |
第4部 XTI:X/Openトランスポートインターフェース 735 |
第28章 XTI:TCPクライアント 737 |
28.1 導入 737 |
28.2 t_open関数 738 |
28.3 t_error関数とt_strerror関数 742 |
28.4 netbuf構造体とXTI構造体 743 |
28.5 t_bind関数 744 |
28.6 t_connect関数 746 |
28.7 t_rcv関数とt_snd関数 747 |
28.8 t_look関数 748 |
28.9 t_sndrei関数とt_rcvrel関数 749 |
28.10 t_snddis関数とt_rcvdis関数 751 |
28.11 XTIを用いるTCPのdaytimeクライアント 752 |
28.12 xti_rdwr関数 754 |
28.13 要約 756 |
第29章 XTI:名前-アドレス変換関数 757 |
29.1 導入 757 |
29.2 /etc/netconfigファイルとnetconfig関数 757 |
29.3 NETPATH変数とnetpath関数 759 |
29.4 netdir関数 760 |
29.5 t_alloc関数とt_free関数 762 |
29.6 t_getprotaddr関数 764 |
29.7 xti_ntop関数 764 |
29.8 tcp_connect関数 766 |
29.9 要約 768 |
第30章 XTI:TCPサーバ 771 |
30.1 導入 771 |
30.2 t_listen関数 773 |
30.3 tcp_listen関数 774 |
30.4 t_accept関数 776 |
30.5 xti_accept関数 776 |
30.6 簡単なdaytimeサーバ 778 |
30.7 複数の待ちコネクション 780 |
30.8 xti_accept関数(再訪) 782 |
30.9 要約 790 |
第31章 XTI:UDPクライアントとサーバ 791 |
31.1 導入 791 |
31.2 t_rcvudata関数とt_sndudata関数 791 |
31.3 udp_client関数 792 |
31.4 t_rcvuderr関数と非同期エラー 796 |
31.5 udp_server関数 798 |
31.6 データグラムの分割読み出し 800 |
31.7 要約 802 |
第32章 XTIオプション 803 |
32.1 導入 803 |
32.2 t_opthdr構造体 805 |
32.3 XTIオプション 807 |
32.4 t_optmgmt関数 810 |
32.5 オプションサポートの有無確認とデフォルト値の取得 811 |
32.6 XTIオプションの取得と設定 814 |
32.7 要約 817 |
第33章 ストリーム 319 |
33.1 導入 319 |
33.2 ストリームの概要 820 |
33.3 getmsg関数とputmsg関数 824 |
33.4 getpmsg関数とputpmsg関数 825 |
33.5 ioctl関数 826 |
33.6 TPI:トランスポートプロバイダインターフェース 826 |
33.7 要約 836 |
第34章 XTI:その他の関数 837 |
34.1 導入 837 |
34.2 非ブロッキングI/O 837 |
34.3 t_rcvconnect関数 838 |
34.4 t_getinfo関数 839 |
34.5 t_getstate関数 839 |
34.6 t_sync関数 840 |
34.7 t_unbind関数 841 |
34.8 t_rcvv関数とt_rcvvudata関数 342 |
34.9 t_sndv関数とt_sndvudata関数 843 |
34.10 t_rcvreldata関数とt_sndreldata関数 843 |
34.11 シグナル駆動I/O 844 |
34.12 帯域外データ 845 |
34.13 ループバックトランスポートプロバイダ 849 |
34.14 要約 850 |
訳者あとがき 851 |
付録A IPv4、IPv6、ICMIPv4、ICMIPv6 853 |
A.1 導入 853 |
A.2 IPv4ヘッダ 853 |
A.3 IPv6ヘッダ 855 |
A.4 IPv4アドレス 857 |
A.5 IPv6アドレス 862 |
A.6 ICMIPv4とICMIPv6:インターネット制御メッセージプロトコル 866 |
付録B 仮想ネットワーク 869 |
B.1 導入 869 |
B.2 MBone 869 |
B.3 6bone 871 |
付録C デバッグ技法 873 |
C.1 システムコール追跡 873 |
C.2 標準インターネットサービス 878 |
C.3 sockプログラム 878 |
C.4 小さなテストプログラム 880 |
C.5 tcpdumpプログラム 883 |
C.6 netstatプログラム 883 |
C.7 lsofプログラム 884 |
付録D 雑多なソースコード 885 |
D.1 unp.hヘッダ 885 |
D.2 config.hヘッダ 888 |
D.3 unpxti.hヘッダ 890 |
D.4 標準エラー関数 891 |
付録E 演習問題解答例 895 |
参考文献 931 |
索引 939 |