情報ネットワーク演習
情報ネットワ ク演習
本日の内容
課題5 課題5 HTTPクライアント ハイパーテキストへのアクセス 課題4 HTTPサ バのビルド 課題3 ソケットを用いた プロセス間通信 HTTPサーバのビルド プロセス間通信 課題1 課題2 名前解決 課題1 低水準入出力 名前解決 (ホスト名⇔IPアドレス)第2回課題
• 実施内容と意図
IPアドレスとホスト名の相互変換をするプログラムを拡張 する. この課題を通じて,IPv4における名前解決の方法,および 関連するライブラリルーチンや構造体の仕様を学ぶ. 関連するライブラリル チンや構造体の仕様を学ぶ.ホスト名とは
• 例
演習室内では これらは同じ計算機 (ホスト ノード) nachi00 nachi00 sys wakayama-u ac jp
(ホスト,ノ ド) を指す nachi00.sys.wakayama u.ac.jp www.wakayama-u.ac.jp www google co jp www.google.co.jp localhost
• 書式
英数字等を「.」でつなぐ. FQDN (Fully Qualified Domain Name)と呼ば れる 英数字等を .」でつなぐ.• 人間にとって見やすい.
IPアドレスとは(文字列)
• 例
133.42.159.1 66 249 89 104 66.249.89.104 127.0.0.1書式
32ビット• 書式
0~255の整数を4つ書き,「.」でつなぐ.• ドット付き10進記法(dotted decimal notation)ともい
う
う.
IPアドレス(バイナリ)
• 例
10000110 00101010 10011111 00000001• 文字列によるIPアドレスを4オクテット(4バイト)で表
• 文字列によるIPアドレスを4オクテット(4バイト)で表
現し,順番に(ネットワークバイトオーダ,またはビッ
グエンディアン)メモリに格納する
グエンディアン)メモリに格納する.
• 計算機が処理するのに適している.
IPアドレスとホスト名を知るコマンド
• host
Vine Linuxでも利用可 host nachi00 host nachi00 host 133.42.159.1 host www google co jp host www.google.co.jp• nslookup
古いコマンド.最近のLinuxでは非推奨DNS (Domain Name System)
• インターネットにおけるホスト名とIPアドレスとを対応
させるシステム
ホスト名 ⇒ IPアドレス を「正引き」 ホスト名 ⇒ IPアドレス を 正引き」, IPアドレス ⇒ ホスト名 を「逆引き」という.• 「DNSサーバ」に「リゾルバ(resolver)」が問い合わせ
• 「DNSサーバ」に「リゾルバ(resolver)」が問い合わせ
て情報を得る.
バ DNSサーバ間で情報交換をすることも 演習室環境で,通信するDNSサーバを知りたければ cat /etc/resolv.conf• ソフトウェアではBIND (Berkeley Internet Name
ソフトウェアではBIND (Berkeley Internet Name
Domain)が有名
ホスト名とIPアドレスは多対多
一つのホスト名に 複数のIPアドレス 「多対多」は 二つの 「 対多 に 複数のIPアドレス ホスト名とIPアドレスは 一対多 「一対多」に 分ける 66.249.89.99 www.l.google.com www.google.com www.google.co.jp 66.249.89.103 66 249 89 147 66.249.89.104 ntp.sys.wakayama-u.ac.jp 133.42.159.1 66.249.89.147 mail.sys.wakayama-u.ac.jp dns.sys.wakayama-u.ac.jp ns.sys.wakayama-u.ac.jp 一つのIPアドレスに 複数のホスト名 IPアドレスとホスト名は IPアドレスとホスト名はホスト名とIPアドレスの変換の使い道
• 実用上は
ホスト名からIPアドレスの一つ, IPアドレスからホスト名の一つ(正式なホスト名) を求めれば十分• 利用例は
利用例は
クライアント: サーバのホスト名 ⇒ IPアドレス サ バ 例えばアクセスを グに記録する際 サーバ: 例えばアクセスをログに記録する際, クライアントのIPアドレス ⇒ ホスト名IPv4とIPv6
• 本演習では,IPv4のみを対象とする.
• IPv4
アドレス長: 32ビット (アドレス空間: 232) アドレス長: 32ビット (アドレス空間: 232)• IPv6
アドレス長: 128ビット (アドレス空間: 2128) IPアドレスは「.」ではなく「:」で区切って表記する.ア 」 なく 」 区切 表記する 省略記法もある. IPv6に移行しても,ホスト名は変わらない IPv6に移行しても,ホスト名は変わらない相互変換プログラムをCで書くには
• 数個のライブラリルーチンと構造体を理解すること
ライブラリルーチン: getaddrinfo, getnameinfo, freeaddrinfo 構造体: struct addrinfo DNSサーバへ直接通信する処理は不要(ライブラリルー DNSサ バへ直接通信する処理は不要(ライブラリル チンに任せる)getaddrinfoライブラリルーチン
g
• int
getaddrinfo(const char *node, const char
g
(
,
*service, const struct addrinfo *hints, struct
addrinfo **res);
addrinfo
res);
ソケットアドレス構造体を生成する. d は 「ホスト名」または「文字列形式のIPアドレス」 node は,「ホスト名」または「文字列形式のIPアドレス」. serviceは,サービス名もしくはポート番号の文字列. 今回は にする 今回はNULLにする. hintsに,ヒント情報を格納して呼び出す(ポインタ渡し). resはソケットアドレスのリストのポインタのポインタ. あらかじめstruct addrinfo *型のポインタ変数を確保した 上で「&変数」と書く(ポインタ渡し).addrinfo構造体
t tは不可欠(「 t t dd i f 型」を宣言している) struct addrinfo { i i / フラグ / structは不可欠(「struct addrinfo型」を宣言している) int ai_flags; /* フラグ */ int ai_family; /* プロトコルファミリ */ int ai_socktype; /* TCP, UDPの別 */i t i t l /* プロトコル詳細 */
int ai_protocol; /* プロトコル詳細 */
size_t ai_addrlen; /* ai_addrのバイト数 */ struct sockaddr *ai_addr; /* IPアドレス(バイナリ) */ char *ai canonname; /* ホスト名文字列 */
char *ai_canonname; /* ホスト名文字列 */ struct addrinfo *ai_next; /* 次へのリンク */ };
• 戻り値(線形リスト)
実際にはバイナリ形式 適切なホスト名 が格納されて . . . ai_addr: . . . ai addr: いる保証はない _ 133042159002 . . . _ 133042160002 . . .getnameinfoライブラリルーチン
g
• int
getnameinfo(const struct sockaddr *sa,
g
(
,
socklen_t salen, char *host, size_t hostlen, char
*serv size t servlen int flags);
serv, size_t servlen, int flags);
アドレスから名前へ変換する. はIPアドレス(バイナリ) l はその長さ saはIPアドレス(バイナリ),salenはその長さ. • addrinfo構造体のai_addr, ai_addrlenに対応する. に結果が格納される 配列などにより あらかじめ領 hostに結果が格納される.配列などにより,あらかじめ領 域を確保しておく.hostlenはその長さを指定する. servとservlenは,hostとhostlenと同様.今回は使用しな いので,NULLと0を指定する. flagsが0なら,ホスト名を得る(時間がかかることも). flagsをNI_NUMERICHOSTとすると…自習すること.
再入可能性
• IPアドレスから文字列を得るライブラリルーチン
inet_ntoaは,再入可能でない.
配列領域を別のところで(静的領域などに)確保しており 配列領域を別のところで(静的領域などに)確保しており, そのアドレスを返す. 連続して呼び出すと 前の結果は上書きされる 連続して呼び出すと,前の結果は上書きされる.• getaddrinfo,getnameinfoは,再入可能である.
連続して呼び出しても,問題ない. 戻り値の領域を,呼び出し側で確保しておき,引数に与え 戻り値の領域を,呼び出し側で確保しておき,引数に与え る.ポインタ渡し(参照渡し)になる. getaddrinfoの処理で,mallocなどによりソケットアドレス getaddrinfoの処理で,mallocなどによりソケットアドレス 構造体が作られる.開放するには,(freeではなく)そもそもなぜgetaddrinfo,getnameifoか?
g
g
• IPアドレスとホスト名の相互変換プログラムを書く古
典的な方法は,gethostbyname,gethostbyaddrと
いったライブラリ関数を使用することである これは
いったライブラリ関数を使用することである.これは,
IPv4にしか対応してしておらず,また再入可能でな
い(連続して呼び出せない)といった問題があった
い(連続して呼び出せない)といった問題があった.
• getaddrinfoは,再入の問題がないだけでなく,
IPv4/IPv6の両方に対応する.さらに,第3回課題の
サーバプログラムがすっきり記述できるようになる.
サ
グラ
す きり記述できるよう なる
課題2(1)
• ~takehiko/network-enshu2009/2/resolver.c
は,ホ
スト名またはIPアドレスを引数にとり,そのIPアドレス
とホスト名のペア(複数あっても一組だけ)を出力す
とホスト名の ア(複数あっても
組だけ)を出力す
るプログラムである.
(コンパイルしてresolverを作る) (コンパイルしてresolverを作る) ./resolver nachi00.sys.wakayama-u.ac.jp 133 42 125 50 ( hi00 k j ) • 133.42.125.50 (nachi00.sys.wakayama-u.ac.jp) ./resolver www.google.com • 66.249.89.104 (nrt04s01-in-f104.google.com) host www.google.com ...結果は各自確認のこと課題2(2)
• ~takehiko/network enshu2009/2/resolver c
をコピ
• ~takehiko/network-enshu2009/2/resolver.c
をコピ
ーして
~/network-enshu2009/2/resolver.c
とし,以
下の仕様を満たすよう 修正をしなさい
下の仕様を満たすよう,修正をしなさい.
ホスト名が複数のIPアドレスに結び付けられているとき, IPアドレス(のビット列)に関して昇順で出力する. 見つかったIPアドレスが0個または1個のときは,修正前と 同じ出力とする. ファイル先頭のコメント (作成者,作成日時) を変更し,末ファイル先頭の メント (作成者,作成日時) を変更し,末 尾に作業メモを残す. ディレクトリのパーミッションは705 ファイルは604にして ディレクトリのパ ミッションは705,ファイルは604にして おくこと.課題2(3)
• プログラムが完成したと思ったら,
グラ
完成
思
,
~takehiko/network-enshu2009/2/command??
の
各コマンドを実行し 妥当な出力になることを確かめ
各コマンドを実行し,妥当な出力になることを確かめ
ること.さらに,以下のコマンドを実行するとよい.
t k hik / t k h 2009/bi / lid t 1
~takehiko/network-enshu2009/bin/validator1