• 検索結果がありません。

Microsoft PowerPoint pptx

N/A
N/A
Protected

Academic year: 2021

シェア "Microsoft PowerPoint pptx"

Copied!
25
0
0

読み込み中.... (全文を見る)

全文

(1)

情報ネットワーク演習

情報ネットワ ク演習

(2)

本日の内容

課題5 課題5 HTTPクライアント ハイパーテキストへのアクセス 課題4 HTTPサ バのビルド 課題3 ソケットを用いた プロセス間通信 HTTPサーバのビルド プロセス間通信 課題1 課題2 名前解決 課題1 低水準入出力 名前解決 (ホスト名⇔IPアドレス)

(3)

第2回課題

• 実施内容と意図

 IPアドレスとホスト名の相互変換をするプログラムを拡張 する.  この課題を通じて,IPv4における名前解決の方法,および 関連するライブラリルーチンや構造体の仕様を学ぶ. 関連するライブラリル チンや構造体の仕様を学ぶ.

(4)

ホスト名とは

• 例

演習室内では これらは同じ計算機 (ホスト ノード)  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)と呼ば れる  英数字等を .」でつなぐ.

• 人間にとって見やすい.

(5)

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)ともい

う.

(6)

IPアドレス(バイナリ)

• 例

 10000110 00101010 10011111 00000001

• 文字列によるIPアドレスを4オクテット(4バイト)で表

• 文字列によるIPアドレスを4オクテット(4バイト)で表

現し,順番に(ネットワークバイトオーダ,またはビッ

グエンディアン)メモリに格納する

グエンディアン)メモリに格納する.

• 計算機が処理するのに適している.

(7)

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では非推奨

(8)

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)が有名

(9)

ホスト名と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アドレスとホスト名は

(10)

ホスト名とIPアドレスの変換の使い道

• 実用上は

 ホスト名からIPアドレスの一つ, IPアドレスからホスト名の一つ(正式なホスト名) を求めれば十分

• 利用例は

利用例は

 クライアント: サーバのホスト名 ⇒ IPアドレス サ バ 例えばアクセスを グに記録する際  サーバ: 例えばアクセスをログに記録する際, クライアントのIPアドレス ⇒ ホスト名

(11)

IPv4とIPv6

• 本演習では,IPv4のみを対象とする.

• IPv4

 アドレス長: 32ビット (アドレス空間: 232)  アドレス長: 32ビット (アドレス空間: 232)

• IPv6

 アドレス長: 128ビット (アドレス空間: 2128)  IPアドレスは「.」ではなく「:」で区切って表記する.ア 」 なく 」 区切 表記する 省略記法もある.  IPv6に移行しても,ホスト名は変わらない  IPv6に移行しても,ホスト名は変わらない

(12)

相互変換プログラムをCで書くには

• 数個のライブラリルーチンと構造体を理解すること

 ライブラリルーチン: getaddrinfo, getnameinfo, freeaddrinfo  構造体: struct addrinfo  DNSサーバへ直接通信する処理は不要(ライブラリルー  DNSサ バへ直接通信する処理は不要(ライブラリル チンに任せる)

(13)

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 *型のポインタ変数を確保した 上で「&変数」と書く(ポインタ渡し).

(14)

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 . . .

(15)

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とすると…自習すること.

(16)

再入可能性

• IPアドレスから文字列を得るライブラリルーチン

inet_ntoaは,再入可能でない.

 配列領域を別のところで(静的領域などに)確保しており  配列領域を別のところで(静的領域などに)確保しており, そのアドレスを返す.  連続して呼び出すと 前の結果は上書きされる  連続して呼び出すと,前の結果は上書きされる.

• getaddrinfo,getnameinfoは,再入可能である.

 連続して呼び出しても,問題ない.  戻り値の領域を,呼び出し側で確保しておき,引数に与え  戻り値の領域を,呼び出し側で確保しておき,引数に与え る.ポインタ渡し(参照渡し)になる.  getaddrinfoの処理で,mallocなどによりソケットアドレス  getaddrinfoの処理で,mallocなどによりソケットアドレス 構造体が作られる.開放するには,(freeではなく)

(17)

そもそもなぜgetaddrinfo,getnameifoか?

g

g

• IPアドレスとホスト名の相互変換プログラムを書く古

典的な方法は,gethostbyname,gethostbyaddrと

いったライブラリ関数を使用することである これは

いったライブラリ関数を使用することである.これは,

IPv4にしか対応してしておらず,また再入可能でな

い(連続して呼び出せない)といった問題があった

い(連続して呼び出せない)といった問題があった.

• getaddrinfoは,再入の問題がないだけでなく,

IPv4/IPv6の両方に対応する.さらに,第3回課題の

サーバプログラムがすっきり記述できるようになる.

グラ

す きり記述できるよう なる

(18)

課題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 ...結果は各自確認のこと

(19)

課題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にして おくこと.

(20)

課題2(3)

• プログラムが完成したと思ったら,

グラ

完成

~takehiko/network-enshu2009/2/command??

各コマンドを実行し 妥当な出力になることを確かめ

各コマンドを実行し,妥当な出力になることを確かめ

ること.さらに,以下のコマンドを実行するとよい.

 t k hik / t k h 2009/bi / lid t 1

 ~takehiko/network-enshu2009/bin/validator1

(21)

期限

• 2009年10月8日(金)19:30の回収までに完成させて

おくこと.

• 期限後のプログラム修正は?

• 期限後のプログラム修正は?

 最終的な回収までの修正(コメントの充実,デバッグなど) はOK はOK.

(22)

線形リストのソート方法(1)

• 初期状態

key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL HEAD

(23)

線形リストのソート方法(2)

• ポインタの配列を確保し,順に代入

key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL HEAD  線形リストを1回走査して要素数(この例では4)を求めて から,配列領域をmallocで確保し,用意しておいた(リスト から,配列領域をmallocで確保し,用意しておいた(リスト の要素のポインタのポインタとなる)変数に代入する.  ポインタの配列には 線形リストの各要素へのリンクを順  ポインタの配列には,線形リストの各要素へのリンクを順 に代入する(既存の に基づき,同じ箇所を指し示す).

(24)

線形リストのソート方法(3)

• ポインタの配列をソート

key: 4 next: key: 2 next: key: 1 next: key: 3 next: NULL HEAD  ソートのためのキーは,指し示す先の(構造体の)メンバ keyの値. keyの値.  このソートでは,構造体の値を含め, の値は一切変 わらない の値(指し示す先)が変わる わらない. の値(指し示す先)が変わる.  今回の課題では,要素数が多くならないので,バブルソー トなどを直接書いてもよいが ライブラリ関数のqsortと トなどを直接書いてもよいが,ライブラリ関数のqsortと memcmpを組み合わせると簡潔に書ける.

(25)

線形リストのソート方法(4)

• ポインタの配列の順に,リンクを付け替え

key: 4 next: NULL key: 2 next: key: 1 next: key: 3 next: HEAD  この付け替えでは,リスト各要素のメンバnextの値(次を 指し示す矢印)が変わる. 指し示す矢印)が変わる.  以上の処理により,リストの各要素(構造体)のコピーや 交換をすることなく 以下と同じ内容のデータ構造が得ら 交換をすることなく,以下と同じ内容のデ タ構造が得ら れた(線形リストをソートした)ことになる. 1 2 3 key: 1 next: key: 2 next: key: 3 next: key: 4 next: NULL HEAD

参照

関連したドキュメント

2.シニア層に対する活躍支援 (3) 目標と課題認識 ○ 戦力として期待する一方で、さまざまな課題も・・・

この課題のパート 2 では、 Packet Tracer のシミュレーション モードを使用して、ローカル

本時は、「どのクラスが一番、テスト前の学習を頑張ったか」という課題を解決する際、その判断の根

「1 建設分野の課題と BIM/CIM」では、建設分野を取り巻く課題や BIM/CIM を行う理由等 の社会的背景や社会的要求を学習する。「2

2021 年 7 月 24

課題曲「 和~未来へ 」と自由曲「 キリクサン 」を披露 しました。曲名の「 キリクサン

 工学の目的は社会における課題の解決で す。現代社会の課題は複雑化し、柔軟、再構

⑤  日常生活・社会生活を習得するための社会参加適応訓練 4.