20
ネットワークプログラミング 演習 15 振り返り 2019.01.23

ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

ネットワークプログラミング演習

第15回 振り返り

2019.01.23

Page 2: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

今日のお題

振り返り前回のおみくじを例に:

プロトコル(HTTP)

ソケット通信を行うプログラム

2019.01.23

Page 3: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

プロトコル(通信規約)

サービスを提供・実行するためにやり取りが必要なメッセージの形式を定めたもの

さまざまなサービスごとにプロトコルが定められている

RFC

新しいサービスを作るとき:そのサービスには、どんな「やり取り」が必要か?

2019.01.23

再掲(第4回)

Page 4: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

2019.01.23

プロトコルの階層

通信規約にも階層がある下位の層:IPを使うなら TCP か UDP を使う

上位の層:どのような状況で、どのようなデータをどのような順番で送受信するのか?

Java で TCP を使うとして…byte の配列を送受信することはできる(ね?)

InputStream, OutputStream

伝えたい情報はどのようなものか

その情報を、どのように byte の配列で表現するか?

byte の配列からどうやって元の情報に戻すか?

再掲(第4回)

Page 5: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

HTTP リクエストの構成

Hyper Text Transfer Protocol

リクエスト:ブラウザからサーバへの要求

2019.01.23

リクエスト行

ヘッダ

ボディ

GET や POST など。1行に書く。

host は必須。Cookie などを書く。複数行書くことができる

ヘッダとボディの間に空行を1行入れる

POSTをリクエストする際の名前と値のペアなど。

※)改行は \r\n で表す。

Page 6: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

HTTP リクエスト:リクエスト行

例)GET /prof/yamagu/2018NP/omikuji.php HTTP/1.1

2019.01.23

GET リクエストであることを示す

要求するファイルの所在

プロトコルバージョン

Page 7: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

ソケット

他のプロセスと通信するときの「口」

TCP/IP や UDP/IP はソケットを介して使うことができる ローカルのファイル経由で通信するときにも使える(UNIXドメインソケットという)

インターネットドメインのソケットを使う際には、あらかじめホストマシンの情報(IPアドレス)が必要

2019.01.23

再掲(第2回)

Page 8: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

ソケットの使い方

サーバ側

1. ソケットを用意するsocket を呼ぶ

ファイルデスクリプタが得られる

2. 名前を対応付ける

bind を呼ぶ

ポート番号と対応付く

3. 接続を待つ

listen を呼ぶ

4. 接続を受け付けるaccept を呼ぶ

ファイルデスクリプタが得られる

2019.01.23

クライアント側

1. ソケットを用意する

socket を呼ぶ

ファイルデスクリプタが得られる

2. サーバに接続する

connect を呼ぶ

再掲(第2回)C言語の場合

Page 9: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラムの解説(Client)

Socket クラス

new で作れば connect してくれる

2019.01.23

再掲(第3回)

Javaの場合

Page 10: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

今日のサンプルプログラムimport java.io.*;

import java.net.*;

public class CheatClient {

final static String HOST = "sun.ac.jp";

final static int PORT = 80;

public static void main(String args[]) {

try {

Socket sock = new Socket(InetAddress.getByName(HOST),PORT);

InputStream in = sock.getInputStream();

OutputStream out = sock.getOutputStream();

out.write(("GET /prof/yamagu/2018NP/omikuji3.php HTTP/1.1\r\n"+

"Host: sun.ac.jp\r\n"+

"Cookie: omikuji3=UUlKZ3ora2lzWlBlTjE1RUQyNnEyUT09\r\n"+

"\r\n").getBytes());

byte message[] = new byte[1000];

int len;

while( (len=in.read(message)) > 0) {

System.out.write(message,0,len);

}

in.close();

out.close();

sock.close();

}catch( IOException e ) {

e.printStackTrace();

System.exit(1);

}

}

}2019.01.23

山口のおみくじプログラムにCookie を送り付けて大吉を

出させるプログラム

CheatClient.java

Page 11: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 1/6

import java.io.*;

import java.net.*;

public class CheatClient {

・ ・ ・

}

2019.01.23

入出力に関連するクラスを使う

ネットワーク関連のクラスを使う

クラスの名前を CheatClient とする

Page 12: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 2/6

final static String HOST = "sun.ac.jp";

final static int PORT = 80;

public static void main(String args[]) {

try {

・ ・ ・

}catch( IOException e ) {

e.printStackTrace();

System.exit(1);

}

}

2019.01.23

接続先のホスト名。定数として定義している

接続先のポート番号。HTTP は 80番

ネットワークや入出力を使うと、例外が発生する可能性があるので、捕捉するようにしておく

例外が発生したら、スタックトレースを表示して終了する

Page 13: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 3/6

Socket sock = new Socket(InetAddress.getByName(HOST),PORT);

InputStream in = sock.getInputStream();

OutputStream out = sock.getOutputStream();

2019.01.23

ソケットを作って、connect する受信用に、ソケットから

読みこむためのInputStream

を準備する

送信用に、ソケットへ書き込むためのOutputStream を準備する

Page 14: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 4/6

out.write(("GET /prof/yamagu/2018NP/omikuji3.php HTTP/1.1\r\n"+

"Host: sun.ac.jp\r\n"+

"Cookie: omikuji3=UUlKZ3ora2lzWlBlTjE1RUQyNnEyUT09\r\n"+

"\r\n").getBytes());

2019.01.23

HTTP リクエストを送信する

ヘッダにCookieを含めるヘッダとボディの間の空行。ボディは無し。

Page 15: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 5/6

byte message[] = new byte[1000];

int len;

while( (len=in.read(message)) > 0) {

System.out.write(message,0,len);

}

2019.01.23

サーバから受信した応答を標準出力にそのまま出力 情報を受け取る

記憶領域を準備

情報がある限り、受け取る繰り返し

受け取った情報をそのまま出力

Page 16: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

サンプルプログラム解説 6/6

in.close();

out.close();

sock.close();

2019.01.23

InputStream を閉じる

OutputStream を閉じる

Socket を閉じる

Page 17: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

注意事項

今日のサンプルプログラムは

(単純な通信プログラムですが)、

セッションハイジャックなどに使われる手口と類似のものです。

絶対に悪用しないでください。

2019.01.23

Page 18: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

まとめ

通信するソフトウェアが扱う概念の階層

通信するプログラム

Socket

プロトコル

Web上のプログラミング

クライアントで動くプログラム

サーバで動くプログラム

…ネットワークを使うプログラムの下位層から上位層まで概観した

2019.01.23

Page 19: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

余談

技術者や研究者になろうとしている人たちへ:

仕組みを知ってください

仕組み:

下位層の技術をどう使ってできているか

情報技術のいろいろな階層にプログラミングが現れます。プログラムは仕組みを表現したものです。プログラムの読み書きを忘れないで。

2019.01.23

Page 20: ネットワークプログラミング 演習sun.ac.jp/prof/yamagu/2018NP/NP15.pdf2019.01.23 プロトコルの階層 通信規約にも階層がある 下位の層:IPを使うならTCP

授業アンケートにご協力ください

記入後、専用ポストに投函してください。

2019.01.23

回答は個人を特定されないように、氏名・学年・学籍番号を伏せた上で、教員にフィードバックされます。