情報ネットワーク演習
2
本日の内容
課題1 低水準入出力 課題2 名前解決 (ホスト名⇔IPアドレス) 課題3 ソケットを用いた プロセス間通信 課題4 HTTPサーバのビルド 課題5 HTTPクライアント ハイパーテキストへのアクセス第2回課題
• 実施内容と意図
– IPアドレスとホスト名の相互変換をするプログラムを拡張 する. – この課題を通じて,IPv4における名前解決の方法,および 関連するライブラリルーチンや構造体の仕様を学ぶ.4
ホスト名とは
• 例
– nachi00 – nachi00.sys.wakayama-u.ac.jp – www.wakayama-u.ac.jp – www.google.co.jp – localhost• 書式
– 英数字等を「.」でつなぐ.• 人間にとって見やすい.
演習室内では これらは同じ計算機 (ホスト,ノード) を指す FQDN (Fully Qualified Domain Name)と呼ば れるIPアドレスとは(文字列)
• 例
– 133.42.159.1 – 66.249.89.104 – 127.0.0.1• 書式
– 0~255の整数を4つ書き,「.」でつなぐ.• ドット付き10進記法(dotted decimal notation)ともい
う.
• 人間にとって見やすい.
6
IPアドレス(バイナリ)
• 例
– 10000110 00101010 10011111 00000001• 文字列によるIPアドレスを4オクテット(4バイト)で表
現し,順番に(ネットワークバイトオーダ,またはビッ
グエンディアン)メモリに格納する.
• 計算機が処理するのに適している.
IPアドレスとホスト名を知るコマンド
• host
– Vine Linuxでも利用可 – host nachi00 – host 133.42.159.1 – host www.google.co.jp• nslookup
– 古い(obsolete)コマンド.最近のLinuxでは非推奨8
DNS (Domain Name System)
• インターネットにおけるホスト名とIPアドレスとを対応
させるシステム
– ホスト名 ⇒ IPアドレス を「正引き」, IPアドレス ⇒ ホスト名 を「逆引き」という.• 「DNSサーバ」に「リゾルバ(resolver)」が問い合わ
せて情報を得る.
– DNSサーバ間で情報交換をすることも – 演習室環境で,通信するDNSサーバを知りたければ cat /etc/resolv.conf• ソフトウェアではBIND (Berkeley Internet Name
Domain)が有名
ホスト名と
IPアドレスは多対多(1)
mail.sys.wakayama-u.ac.jp ntp.sys.wakayama-u.ac.jp www.l.google.com www.google.com www.google.co.jp 66.249.89.104 66.249.89.99 一つのホスト名に 複数のIPアドレス ホスト名とIPアドレスは 一対多 「多対多」は 二つの 「一対多」に 分ける 133.42.159.1 ns.sys.wakayama-u.ac.jpホスト名と
IPアドレスは多対多(2)
• 実用上は
– ホスト名からIPアドレスの一つ, IPアドレスからホスト名の一つ(正式なホスト名) を求めれば十分• 利用例は
– クライアント: サーバのホスト名 ⇒ IPアドレス – サーバ: 例えばアクセスをログに記録する際, クライアントのIPアドレス ⇒ ホスト名IPv4とIPv6
• 本演習では,IPv4のみを対象とする.
• IPv4
– アドレス長: 32ビット (アドレス空間: 232)• IPv6
– アドレス長: 128ビット (アドレス空間: 2128) – IPアドレスは「.」ではなく「:」で区切って表記する. 省略記法もある. – IPv6に移行しても,ホスト名は変わらない12
相互変換プログラムを
Cで書くには
• 数個のライブラリルーチンと構造体を理解すること
– ライブラリルーチン: getaddrinfo, getnameinfo, inet_ntoa, freeaddrinfo
– 構造体: struct addrinfo
getaddrinfoライブラリルーチン
• int getaddrinfo(const char *node, const char
*service, const struct addrinfo *hints, struct
addrinfo **res);
– ソケットアドレス構造体を生成する. – node は,ホスト名または文字列形式のIPアドレスの文字 列. – serviceは,サービス名もしくはポート番号の文字列. 今回はNULLにする. – hintsに,ヒント情報を格納して呼び出す(ポインタ渡し).addrinfo構造体
• 戻り値(線形リスト)
struct addrinfo {
int ai_flags; /* フラグ */
int ai_family; /* プロトコルファミリ */ int ai_socktype; /* TCP, UDPの別 */ int ai_protocol; /* プロトコル詳細 */
size_t ai_addrlen; /* ai_addrのバイト数 */ struct sockaddr *ai_addr; /* IPアドレス(バイナリ) */ char *ai_canonname; /* ホスト名文字列 */
struct addrinfo *ai_next; /* 次へのリンク */ }; . . . ai_addr: 133042159002 . . . ai_next: . . . ai_addr: 133042160002 . . . ai_next: NULL 実際にはバイナリ形式 structは不可欠(「struct addrinfo型」を宣言している) 適切なホスト名 が格納されて いる保証はない
getnameinfoライブラリルーチン
• int getnameinfo(const struct sockaddr *sa,
socklen_t salen, char *host, size_t hostlen, char
*serv, size_t servlen, int flags);
– アドレスから名前へ変換する. – saはIPアドレス(バイナリ),salenはその長さ. • addrinfo構造体のai_addr, ai_addrlenに対応する. – hostにホスト名が格納される.配列などにより,あらかじ め領域を確保しておく.hostlenはその長さを指定する. – servとservlenは,hostとhostlenと同様.今回は使用しな いので,NULLと0を指定する.
16
inet_ntoaライブラリルーチン
• char *inet_ntoa(struct in_addr in);
– IPアドレスをバイナリ値から文字列形式に変換する. – “internet: network address to ascii string”
再入可能性
• inet_ntoaは,再入可能でない.
– 配列領域を別のところで(static領域などに)確保しており, そのアドレスを返す. – 連続して呼び出すと,前の結果は上書きされる.• getaddrinfo,getnameinfoは,再入可能である.
– 連続して呼び出しても,問題ない. – 戻り値の領域を,呼び出し側が確保し,引数に与える.ポ インタ渡しになる. – getaddrinfoの内部でmallocなどによりソケットアドレス構18
課題2(1)
• ~takehiko/network-enshu2007/2/resolver
は,ホス
ト名を引数にとり,その
IPアドレス(複数あっても一つ
だけ)をドット付き10進記法で出力する.
– cd ~takehiko/network-enshu2007/2 – ./resolver nachi00.sys.wakayama-u.ac.jp • 133.42.125.50 – ./resolver www.google.com • 66.249.89.147 – host www.google.com ...結果は各自確認のこと課題2(2)
• ~takehiko/network-enshu2007/2/resolver.c
をコピ
ーして
~/network-enshu2007/2/resolver.c
とし,以
下の仕様を満たすよう,修正をしなさい.
– ホスト名が複数のIPアドレスに結び付けられているとき, それぞれを出力する(1行1アドレスで). – 1行を「IPアドレス (ホスト名)」の形で出力する. • ~takehiko/network-enshu2007/2/command01-answer を参考 に – コメントを変更(作成者,作成日時)し,作業メモを残す.20
課題2の追加事項とヒント
• 課題はこれでできた,と思ったら,
~takehiko/network-enshu2007/bin/validator2
を実行してみよう.
• 余力のある人は,inet_ntoa を使うことなく,ドット付
き10進記法の
IPアドレスを出力するようにしてみよ
う.(ヒント:
inet_ntoa を getnameinfo に置き換える.
jman 3 getnameinfo
.)
期限
• 2007年10月12日(金)19:30の回収までに完成させ
ておくこと.
• 期限後のプログラム修正は?
– 最終的な回収までの修正(コメントの充実,デバッグなど) はOK.22
テストプログラムについて
• ~takehiko/network-enshu2007/bin/validatorα
で
テストする.
– 実行中に参照するファイル • ~/network-enshu2007/α/ソースファイル.c • ~takehiko/network-enshu2007/α/commandβ • ~takehiko/network-enshu2007/α/commandβ-answer – 生成されるファイル • ~/network-enshu2007/α/ソースファイル • ~/network-enshu2007/α/ソースファイル_code.c • ~/network-enshu2007/α/ソースファイル_comment.c • ~/network-enshu2007/α/error+warning • ~/network-enshu2007/α/.commandβ-answer– 「Everything is just fine!」を目指せ!
課題番号 今は「1」か「2」
ドットファイル.「ls -a」で 確認できる.