Comments
Description
Transcript
ネ クプ グ グ ネットワークプログラミング ネットワークプログラミング演習
ネットワークプログラミング ネ クプ グ グ ネットワ クプログラミング演習 ネットワークプログラミング演習 21001教室 第2 回 2013/9/23 岩井将行 2013/9/23 1 授業資料 • http://www.cps.im.dendai.ac.jp • http://www.cps.im.dendai.ac.jp/index.php?Classes%2F2013netpro 2013/9/23 2 講師紹介 • http://cps.im.dendai.ac.jp/index.php?Members%2Fiwai htt // i d d i j /i d h ?M b %2Fi i • 岩井研究室 • http://cps.im.dendai.ac.jp • 岩井研究室の研究分野 • http://cps.im.dendai.ac.jp/index.php?Research%2FTopics • 連絡先 1号館11F 11107b • i iあっと im.dendai iwaiあっと i d d i 2013/9/23 3 TA・SA・副手 • • • • 加藤 佳祐 鉄谷研究室 東京電機大学 未来科学部 情報メディア学科 E‐mail: Keisuke Kato <[email protected]> 2限副手紹介 • 鉄谷研究室M2 鉄 究室 – 多田 真之 tada先輩 先輩 2限 限 – 新井 駿 arashun先輩 2限 2013/9/23 5 成績 • • • • 出席 毎回課題 中間試験 最終試験+最終課題 • ★演習は演習最終発表会を加味 2013/9/23 6 講義内容 第1回 第2回 Java理解度チェック TCP/IPの復習 第3回 TCPサ バ TCPサーバ 第4回 TCPクライアント/サーバ通信 チャットプログラム 第5回 UDP通信 第6回 中間試験 (持ち込み不可 紙提出) 第7回 スレッド基礎 サーバのスレッド化 マルチスレッド 第8回 デザインパターン ファクトリメソッド シングルトン 第9回 ノンブロッキングI/O 第10回 マルチスレッド スレッドプール Twitter4J 第11回 Twitter4J Webクライアント Twitter4J, 第12回 第13回 第14回 WEBサーバ,プロジェクト設計 プロジェクト実装 予備 第15回 学力考査 (持ち込み可 プログラミング提出) 2013/9/23 最終課題に向けた目標設定 7 授業予定日日程 • http://www.soe.dendai.ac.jp/kyomu/portal/2013_schedule_t.pdf • (2)9/16 敬老の日【授業実施日】 • (3)9/23 秋分の日【授業実施日】 • (4)9/30 • (5)10/7 • (6)10/14 体育の日【授業実施日】 中間試験 • (7)10/21 ( ) / • (8)10/28 • 休み 11/4 文化の日 • (9)11/11 • (10)11/18 • (11)11/25 • (12)12/2 • (13)12/9 • (14)12/16 • 休み 岩井出張休講 12/23 • 休み1/13 成人の日 休み1/13 成人の日 • (15)1/20 学力考査 2013/9/23 • ※授業予定日に休講が有る場合は連絡します。 8 概要 • クライアント/サーバモデル、TCP/IPネット バ デ ネ ク ア リケ シ ン グラ ングインタ ワークのアプリケーションプログラミングインタ フェースの基本および、ネットワークアプリ ケ ションを効率的に動作させるためのマル ケーションを効率的に動作させるためのマル チスレッドプログラミングを講義する。この基 本の後 チャット等の対話型アプリケ ション 本の後、チャット等の対話型アプリケーション、 Twitter4J等のアプリケーション開発の実例を 講義する。 講義する 2013/9/23 9 ゴール • 通信ネットワークを利用したアプリケーション ソフトウェアを、TCP/IP を意識したレベルで作 / 成できる力を養成することを目標とする。 2013/9/23 10 参考書 • 購入の必要はありません。 – – – – – – – – – 2013/9/23 TCP/IPソケットプログラミング JAVA編 –ISBN4‐274‐06520‐0 –オーム社 オ 社 •[改訂第2版]JAVA言語プログラミングレッスン上 –ISBN4‐7973‐3211‐5 –SoftBankCreative •[改訂第2版]JAVA言語プログラミングレッスン下 –ISBN4‐7973‐3212‐3 ISBN4 7973 3212 3 –SoftBankCreative 11 持ち物 • Laptop pc –Eclipse環境が整っていること p • PDF アクロバットリーダ PDF アクロバットリ ダ • LANでネットワークに接続できること。 • Macでもよい 2013/9/23 12 日本語版eclipse • http://mergedoc.sourceforge.jp/ 2013/9/23 13 • Eclipseをまだインストールしていない人は急 をまだ な 急 いでダウンロードからインストール 2013/9/23 14 基本型 • • • • • • • boolean 論理型 論 (true または また false) char 整数型(文字型) (0以上65535以下) char 整数型(文字型) (0以上65535以下) byte 整数型 (‐128から127まで) int 整数型 (符号付き32ビット) long 整数型 (符号付き64ビット) long 整数型 float 実数 (単精度浮動小数点型) double 実数 (倍精度浮動小数点型) 演算子 • • • • • + ‐ * / % (余り) % (余り) 次の計算を答えを表示する プログラムを作ろう • • • • • 3 + 5 18 – 7 18 32 × 5 10 ÷ 2 300 ÷ 12 の余り 300 ÷ 12 の余り 実行してみよう • ファイル一覧を取得 覧を 得 *.classファイルがあるか がある 確認 • >dir • 実行 • >java Hello 2013/9/23 18 変数と値 • 変数:値を入れておくもの – 変数の作成(変数宣言) – 値を入れる(代入) – 値を見る(参照) • 型:どういった種類の値か – Int – Char – string 2013/9/23 19 If/switch If/switch • 条件分岐 – – – – If(条件){処理} If(条件){処理}else{処理} If(条件){処理}else if(条件){処理}else{処理} Switch(式){ Case 定数式: 処理 break; Default: 処理 } 2013/9/23 20 for/while 繰り返 繰り返し • for(初期化; 条件式; 次の一歩){繰り返す処理} • while(条件式){繰り返す処理} 2013/9/23 21 配列 • 複数の変数を番号をつけてまとめる 複数 変数を番 を ま る – 宣言 • 型名[] 配列名 = new 型名[要素の個数] • –代入 代入 – ten[0]=34; • –参照 – ten[1] ten[1] 2013/9/23 22 クラスとインスタンス • • • • クラス 一般的な設計書 般的な設計書 インスタンス 実体 2013/9/23 23 ネジクラスの実装 P bli l N ji{ Public class Neji{ double length; //ネジの長さ int pitch; //ピッチ幅 p ; // ッ 幅 String material; //材質 public Neji(double l, int p, String m){ length l pitch p material m length=l; pitch=p; material=m; } public String Sound(){ for(int I=0; I < (int)length*10/10; i++){ System.out.println(“ギュッ”); } } } 2013/9/23 24 インスタンス • ネジクラスの実体化 ネジ 実体 – 材質をどうするか 材質を うする – ピッチ幅はどうするか • クラス名 インスタンス名 = new クラス名(イン クラス名(イン スタンス引数); – Neji n1 = new Neji(2.5, 1, “ステンレス”); – ステンレスで出来た2.5mmでピッチ幅1mmのネジ (n1)が出来る 2013/9/23 25 コンストラクタとメソッド • コンストラクタ – クラスの初期化処理をまとめたもの • メソッド – 処理をまとめたもの 2013/9/23 26 Static修飾子 • Newによってインスタンスを生成 タ を生成 – インスタンスのメソッドやフィールド(変数)が使用 インスタンスのメソッドやフィ ルド(変数)が使用 可能となる • Static修飾子の付いているメソッド/フィ Static修飾子の付いているメソッド/フィールド ルド – プログラムの起動時にインスタンス化される – Newせずとも使用可能 – Mainメソッド – public static void main(String args[]){} 2013/9/23 27 The Internet The Internet インタ ネットの規模 インターネットの規模 • • インターネットの爆発的な成長 908 585 739 hosts at Jul 2007 908,585,739 hosts at Jul 2007 経路制御機構の重要性,要求される能力 (http://ftp.isc.org/www/survey/repo rts/2012/07/ 29 プロトコル TCP/IP プロトコルとは 通信をする上での約束ごと 例えば。Kyoto Protocol=京都議定書 FTP, SMTP, telnet, TCP/IP, AppleTalk, …. こんにちは Hello IP ネットワークを介してホストからホストへ通信を行うための プロトコル。 プロトコル ホストの識別にはIPアドレスが用いられ、アドレス長はバー ジョンによって32ビットのものと128ビットのものに分かれる。 IPではデータ転送時の信頼性は保証していない IPではデ タ転送時の信頼性は保証していない。(メッ (メッ セージが必ず相手に届くという保証はない) 何を規定すれば通信が行えるのか? AからBへ“Hello”を送るには あて先の指定 ネ ト上で つ ネット上で一つ Hello A Hello B Hello IPアドレス インターネットなどのネットワークに接続されたコン インタ ネットなどのネットワ クに接続されたコン ピュータの識別番号 当然コンピュ タは01が計算しやすい 当然コンピュータは01が計算しやすい 人間は理解し難いので8ビット毎に区切る 202.23.129.104 202.23.129.101 202 23 29 02 202.23.129.102 202.23.129.103 10111111 11001000 11111110 11111110 2進数と10進数の復習 • • • • • • • • 0(2)=0(10) 1(2)=1(10) 10(2)=2(10) 11(2)=3(10) 100(2)=4(10) 101(2)=5(10) 110(2)=6(10) 111(2)=7(10) • 練習問題 – 33(10)は2進数で? – 11011(2)は10進数で? – 111(2)の4倍は2進数で – 33(10)の32倍は2進数で いくつ? IPv4アドレス表記方法 • IPv4アドレスは32bit ド は • 例:203.178.142.130 • 10進数で1バイトずつ表記(0~255) • ピリオドで区切る • 実際には 203 . 178 . 142 . 130 11001011 10110010 10001110 10000010 16 32 64 128 842 1 128 + 8 + 4 + 2 =142 most ← (significant bit) → least most ← (significant bit) → least MSB LSB AからCへ“Hello”を送るには転送してあげる メッセ ジを必要がある メッセージを必要がある A B Hello Hello Hello Hello Hello C Hello •ネットワークの表示 ネ トワ クの表示 •ネットワークを橋渡すマシンの表示 ネットワークの階層構造 OSI7層モデル • 各層の役割をプロトコルという 各 役割をプ う 物理層 Ethernet (1) • Xerox社が開発したLANの規格 • のちにEthernet 2.0として制定 – DEC, Intel, Xeroxによる(DIX仕様) よる( 仕様) • 現在はISOプロトコル層を考慮して IEEE802.3として規定 • LANの規格として最も普及 Ethernet (2) • • • • 伝送速度: 10Mbps/100M/1G ケ ブル UTP ケーブル: CSMA/CD方式 スター型のネットワークトポロジ 光ファイバー FTTH ‐ Fiber To The Home • 最近は10G/40G/100G 最近は / / ハブ ハブ • 1つのホストから受信したデータをそのまま他の端末すべてに送信 するハブ。最も原始的なハブの形態で、ハブで行う処理はせいぜ い波形の調整程度 • リピータハブはデータの送り先を限定しないため、送信先以外の ホストはまったく関係ないデータをいったん受け取ることになる。 • 関係ないデータを受け取ったホストはそのデータを傍受することも 可能なため、リピータハブは機密性の高いデータを送受信する用 途には利用できない。 • また、リピータハブの「送信先を限定しない」という特徴は、ネット ワーク上を流れるパケットを増やす原因となる。 意味のない ケットが増加するとネットワ クの利用効率が低下 • 意味のないパケットが増加するとネットワークの利用効率が低下 するため、リピータハブは大量のデータが行き交う環境にも適さな い。 ルーティング データの作成と解析 TCPセッションの制御 IPパケットの送受信 イーサネットフレーム送受信 物理媒体への送受信 アプリケーション ソフトウェア ホスト 終点は 終点は どっちだ? どっちだ? ル タ ルータ ル タ ルータ 終点は どっちだ? ル タ ルータ アプリケーション ソフトウ ア ソフトウェア ホスト 経路表 • シンプルな構造 – 宛先が共有(同 宛先が共有(同一)ネットワーク )ネットワ ク → 直接転送 → 直接転送 – 宛先が別のネットワーク → 経路表に基づき転送 • ルーティングテーブル ル ティングテ ル 終点 終点 終点 終点 次ホップ 次ホップ 次ホ プ 次ホップ 次ホップ 方向(interface) 方向(interface) 方向(interface) 方向(interface) Ver IHL TOS Identification TTL IPパケット ペイロード 終点は どっちだ (経路検索) 終点は どっちだ (経路検索) パケット長 Flag gFlagment g Offset Protocol Header Checksum 始点IPアドレス 終点IPアドレス IPヘッダ ネットワークアドレス ネットマスク ネットワーク部とホスト部の切れ目を示す IPアドレス:192.168.6.121 11000000 10101000 00000110 01111001 ネットワーク部 ホスト部 サブネットマスク:255 255 255 0 サブネットマスク:255.255.255.0 11111111 11111111 11111111 00000000 ネットワーク部 ホスト部 クラス ネットワークの規模によりIPアドレスは 3つのクラスに分かれる クラスA 224=約1600万台 約1600万台 クラスB 216=約65000台 クラスC 28=約250台 ネットワーク部 ホスト部 IPアドレスのクラス • • • • • • • • • • • • 上図のように、 上図のように クラスA・・・先頭ビットが0で始まる クラスB・・・先頭ビットが10で始まる クラスC・・・先頭ビットが110で始まる クラスD・・・先頭ビットが1110で始まる となる。 「ネットワーク部」は クラスA・・・先頭から8ビットがネットワーク部 クラスB・・・先頭から16ビットがネットワーク部 クラ クラスC・・・先頭から24ビットがネットワーク部 先頭 ら ッ ネッ ク部 クラスD・・・先頭から32ビットがネットワーク部 となる。 これより、10進数のIPアドレス範囲は クラスA・・・0.0.0.0~127.255.255.255 クラスB クラスB・・・128.0.0.0~191.255.255.255 128 0 0 0 191 255 255 255 クラスC・・・192.0.0.0~223.255.255.255 クラスD・・・224.0.0.0~239.255.255.255 となる。 太字部分がネットワーク部となる。 また、それぞれで使用できるホスト数は クラスA・・・約1678万個 クラスB・・・65534個 クラスC・・・254個 クラスD・・・0個 となる。 IPアドレスの構造の理由 – Aまで行ければBにもCにも行ける(ARPで) – BとCを区別する必要があるのはAのみ – 「現地に行けば分かる」 「現地に行けば分かる A D N1 B C E 複数のネットワークをまとめて一つの ネットワークとして扱う (アドレス集約 プレフィックス) (アドレス集約,プレフィックス) 複数 複数のホストをまとめて一つのネットワーク として扱う (ネットワークアドレス) ネットワ クアドレスとネットマスク ネットワークアドレスとネットマスク • • • • IPアドレスの範囲を指定 203 178 142 128~159の31個のアドレス範囲 203.178.142.128~159の31個のアドレス範囲 例:203.178.142.128 netmask 0xffffffe0 例:203 178 142 128/27(プレフィックス) 例:203.178.142.128/27(プレフィックス) . . . 203 178 142 130 11001011 10110010 10001110 10000010 11111111 11111111 11111111 11100000 0x 255 ff . 255 ff . 255 ff . 224 e0 203 . 178 . 142 . 128 / 27 11001011 10110010 10001110 100***** 自分のIPアドレスの場合 IPアドレス : 192.168. 0. 1 サブネットマスク : 255.255.255. 0 この場合 192.168.0.1/24と表現されることもある。 /24はサブネットマスクのことで 11111111 11111111 11111111 00000000 となりネットワ となりネットワークアドレスを24 クアドレスを24 ビット分確保を意味する。 (もし/16であったなら 11111111 11111111 00000000 00000000 となる。) 上のIPアドレスとサブネットマスクを二進数に変換してAND演算する。 上のIPアドレスとサブネットマスクを二進数に変換してAND演算する IPアドレス : 11000000 10101000 00000000 00000001 サブネットマスク : 11111111 11111111 11111111 00000000 AND演算 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ネットワークアドレス: 11000000 10101000 00000000 00000000 このネットワークアドレスを十進数に変換すると以下のようになる。 このネットワークアドレスを十進数に変換すると以下のようになる 相手のIPアドレスの場合 IPアドレス : 192.168. 1. 1 サブネ ト スク サブネットマスク : 255.255.255. 0 これを二進数に変換してAND演算する。 IPアドレス : 11000000 10101000 00000001 00000001 サブネットマスク : 11111111 11111111 11111111 00000000 AND演算 ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ ネットワークアドレス : 11000000 10101000 00000001 00000000 このネットワークアドレスを十進数に変換すると以下のようになる。 CIDR インターネットが全世界で普及するにつれて、クラスによってIPアドレスの枯渇問題が生じている。 インターネットが全世界で普及するにつれて クラスによってIPアドレスの枯渇問題が生じている そのため、クラスという概念を取り除いた「CIDR(サイダー)」という方式が登場した。 <CIDR適用例> 203.183.224.0 / 23 ネットワーク 11001011 10110111 11100000 00000001 から 11001011 10110111 11100001 11111110 まで 510個のホスト数が使用できるネットワークができる。 太字部がネットワ クアドレスとなる。 太字部がネットワークアドレスとなる このような構成の場合、 11111111 11111111 11111110 000000000 がサブネットマスクとなる。 これを十進数に直したものは 255 . 255 . 254 . 0 となる。 CIDRを利用することで、1つのネットワーク内のホスト数をより細かく設計することが出来る。 ゲートウェイ 2つのネットワークを結ぶ働き ゲートウェイ 192.168.0.系統 192.168.1系統 ブロードキャストアドレス ネットワークに接続されている全ての ネ トワ クに接続されている全ての コンピュータと通信するためのアドレス ドメイン名 IPアドレスのかわりに用いる識別名 www.im.dendai.ac.jp -サーバの種類 -組織名称 ピリオドで分かれている -組織種別 組織種別 -国 DNS ドメイン名とIPアドレスを対応付ける www.im.dendai.ac.jp のIPアドレスは? 192.168.6.12です コンピュータ DNSサーバ DNS② DNSの仕組み www.im.dendai.ac.j pのIPアドレスは? 192.168.6.12で す 了解! 192 168 6 12 192.168.6.12 名前解決して下さい jpのDNSなら分かる 名前解決し acのDNS て下さい なら分かる acのDNS jpのDNS 名前解決 して下さい ルートDNS IP version4の問題点(1) アドレス空間32bit=2の32乗 PCユーザの増化 232≒43億 ≪ デバイスの増加 (地球の人口約55億) IPアドレス枯渇の危機! IP version4の問題点(2) セキュリティの不備 経路情報増大によりルータへの負担大 簡単な設定の要求が高まる 簡単な設定 要求が高まる 新しいIPが必要 IP version6の改良点 アドレス空間128bit 128bit≒340澗=3 128bit≒340澗 3.4×10 4×1038 無限大 アドレス枯渇問題解消! セキュリティ技術の導入 アドレス自動生成機能 フローラベルの導入 ほぼ IP version6のアドレス表記ルール IP version6のアドレス表記ルール • IPアドレスは16バイト(128bit) ド は バイト( ) • IPv4と同様の表記は長すぎ – IPv4アドレスと同様の表記をすると、 ド と同様 表記をすると – 123.123.123.123.123.123.123.123.123.123.123.123.123.123.123.123 • • • • 16ビットずつ16進数で表現 ピリオド「.」ではなく、コロン「:」で区切る 16ビットの始まりの0は省略できる コロン間が全て0の連続の場合、1回だけ省略できる 2001 0000 0000 0000 220 0ff f 89 d 8 2001:0000:0000:0000:220:e0ff:fe89:dc8 = 2001::220:e0ff:fe80:dc8 IPv6アドレス表記方法 • IPv6アドレスは128bit IP 6アドレスは128bi • 例: 2001::200:e0ff:fe80:dc8 • 16進数で2バイトずつ表記(0x00~0xff) • コロンで区切る • 実際には 00100000 00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000010 00000000 11100000 11111111 11111110 10000000 00001101 11001000 IPv6ヘッダの改良点 除去 オプションフィールド ルータ処理の ヘッダチェックサム 負担軽減 分割制御フィールド 高速化! 導入 高品質な フローラベル マルチメディア通信が可能 デ 信が 能 MACアドレス Media Access Control Addressの略 ネットワークカードに割り当てられる固有の番号 Ethernet上の機器間の物理的な通信を行う 3bytes 3bytes 00‐a0‐de 00-00-01 製造会社を示す番号 メーカーが独自に割り当てる番号 IPアドレスとの違い IPアドレス ネットワーク層におけるアドレス ソフトで設定可能 MACアドレス デ タリンク層におけるアドレス データリンク層におけるアドレス ネットワークカードによって固定 ッ ク 固定 ARP(Address Resolution Protocol) ARP(Address Resolution Protocol) • ARP ‐ ルーティングテーブルにはIPアドレスしか記載されて いない 実際にはそのIPアドレスを持 MACアドレスに対し ‐ 実際にはそのIPアドレスを持つMACアドレスに対し てデータを送信する必要 ⇒ARPはIPアドレスを元にMACアドレスを問い合わせ るプロトコル ARP Address Add R Resolution l ti P Protocolの略 t lの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする Broadcastアドレスに対して,ホスト(1.1.1.2)を尋ねる 1.1.1.1 1.1.1.2 1.1.1.3 1.1.1.4 ARP Address Resolution Protocolの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする ホスト(1.1.1.2)は,MACアドレスを返す 1.1.1.1 1.1.1.2 1.1.1.3 1.1.1.4 ARP Address Resolution Protocolの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする MACアドレスを使用して,通信を行う 1.1.1.1 1.1.1.2 1.1.1.3 1.1.1.4 トランスポートプロトコル • トランスポ トランスポート層はOSI7階層モデルのトランスポート層 ト層はOS 階層モデルのトランスポ ト層 に位置している。 ネットワーク層ではホスト同士の通 信について定義していたが 信頼性は保証していない 信について定義していたが、信頼性は保証していない。 • また、送信した順序どおりにデータが届くという保証も ない そこで、トランスポ ない。 そこで トランスポート層ではホスト間で信頼の ト層ではホスト間で信頼の おける通信路を提供するための定義をおこなっている。 • トランスポート層のプロトコルにはTCP(Transmission トランスポ ト層のプロトコルにはTCP(Transmission Control Protocol)とUDP(User Datagram Protocol)があ げられる。 • パケット通信 長いデ タは通信できない 長いデータは通信できない 小さな複数の情報に データM 分割 データm1 データm2 データm3 パケット通信の問題点 パケットの順番 3 4 1 2 4 3 2 1 4 2 3 1 パケットの欠落 3 4 1 2 3 4 3 2 1 4 2 1 TCP • TCPの主な特徴を以下に記す。 の主な特徴を以下に記す ケッ 破壊、重複、喪失、順序 入れ替 • パケットの破壊、重複、喪失、順序の入れ替 わりをチェックする。また応答確認、再送信を 行 、通信 信頼性を高 行い、通信の信頼性を高める。 。 • ホスト間で通信する前に仮想的な通信路を作 る(コネクション指向)。 る(コネクション指向) • 始点と終点間で多重化を行うことで、同時に 複数の通信が行うことができる。 複数の通信が行うことができる • 送信のフローコントロール制御を行う。 TCP TCP : Transmission Control Protocol インターネットの通信プロトコルとして最も普及 ※プロトコル × こんにちは。 ち 。 Bonjour. こんにちは。 ○ こんにちは。 TCP 送信したデータが正しく相手に届いたかを確認 送信したデ タが正しく相手に届いたかを確認 届いてなければ再送する 了解! 了解 もう1度お願いします! もう 度お願 します UDP • UDPの主な特徴を以下に示す。 主な特徴を す • 複雑な制御は提供せず 複雑な制御は提供せず、コネクションレスの コネクションレスの 通信を行う。 • ネ ネットワークが混雑していたとしても、送信量 ト クが混雑し たとし も 送信量 を制御することは無い。 • パケットが失われても再送制御しない。 • 処理がTCPに比べて軽量なので高速に動作 する。 UDP UDP : User Datagram Protocol 正しく相手に届いたかの確認をしない 不確実であるが高速な通信を実現 不確実であるが高速な通信を実現 ・・・・・ TCPとUDP TCPとUDPの違い TCP UDP 高信頼 低信頼 転送速度 低速 高速 転送形式 コネクション型 コネクションレス型 その他 端末間同士の データ転送 上位レイヤからの 送信要求が簡潔 信頼性 TCP v s UDP TCP v.s. UDP • TCPはトランスポート層で信頼性のある通信を実現する必要があ TCPはトランスポ ト層で信頼性のある通信を実現する必要があ る場合に利用される。 TCPはコネクション指向で順序制御や再送 制御を行なうためアプリケーションに信頼性のある通信を提供す ることができる。 ることができる • UDPは高速性やリアルタイム性を重視する通信などに用いられる。 – 例 例としてリアルタイムのストリーミングを挙げる。 グ げ – もしTCPを利用した場合、パケットが途中で失われた場合に再送処理 を行なうため、 その間画像や音が停止するなどの不具合が生じてし まう これに対して、UDPは再送処理を行なわないのでパケットは送 まう。 これに対して UDPは再送処理を行なわないのでパケットは送 信され続ける。 もし多少のパケットが失われていたとしても、一時的 に画像や音声が乱れるだけである。 よって、ストリーム配信サービス ではUDPの方が優れているといえる。 ソケット通信 プログラム同士の通信は ソケットを使ってデータの送受信 ソケットを使った通信 ソケット通信 ソケット 接続の端点」 意味: 「接続の端点 コンピュータとTCP/IPを コンピュ タとTCP/IPを つなぐ出入り口 ソケット TCP/IP ソケット通信 ソケットを使って通信を行うには 2つのプログラムが必要 クライアントプログラム ソケットを用意して ソケ トを用意して サーバに接続要求を行う サーバプログラム ソケットを用意して接続要求を待つ ソケット通信の全体の流れ クライアント サーバ ソケット生成(socket) ( ) ソケット生成(socket) ( ) サ バを探す サーバを探す (gethostbyname) 接続の準備(bind) 接続待機(listen) 識別情報 接続要求(connect) 接続受信(accept) デ タ送受信(send/recv) データ送受信(send/recv) デ タ送受信(send/recv) データ送受信(send/recv) ソケ トを閉じる( l ソケットを閉じる(close) ) ソケ トを閉じる( l ソケットを閉じる(close) ) 識別情報 正しくデータを受け渡しするために 通信する相手を識別する IPアドレス コンピュータのアドレス コンピュータを識別 ポ ト番号 ポート番号 プログラムを識別 プログラムの識別番号 ウェルノウン ポート よく使われているプログラムの ポート番号は決まっている ポート番号 ポ ト番号 プログラム 21 ftp 22 ssh 23 telnet 80 http(web) 1024番以下は全て決められている クライアントプログラム(C) //client.c #include<stdio.h> #include<stdio h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb h> #include<netdb.h> #include<string.h> #define PORT (u_short)10000 #define BUF_LEN 100 char hostname[]="localhost"; char hostname[]= localhost ; char buf[BUF_LEN]; main() { struct hostent *servhost; struct hostent *servhost; struct sockaddr_in server; int s; servhost = gethostbyname(hostname); servhost = gethostbyname(hostname); bzero((char *)&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = PORT; bcopy(servhost >h addr bcopy(servhost‐>h_addr, (char *)&server.sin_addr,servhost‐>h_length); s = socket(AF_INET,SOCK_STREAM,0); connect(s,(void *)&server,sizeof(server)); read(s,buf,BUF_LEN); printf(buf); close(s); } サーバプログラム(C) //server.c me.sin_family = AF_INET; me.sin_port = PORT; #include<stdio.h> #include<sys/types h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<string h> #include<string.h> #define PORT (u_short)10000 char hostname[] = "localhost"; bcopy(myhost >h addr bcopy(myhost‐>h_addr, (char *)&me.sin_addr,myhost‐>h_length); s_waiting = socket(AF_INET,SOCK_STREAM,0); bind(s_waiting,(void *)&me,sizeof(me)); main() listen(s_waiting, 1); { s = accept(s_waiting, NULL, NULL); struct hostent *myhost; close(s waiting); close(s_waiting); struct sockaddr_in me; int s_waiting, s; write(s, msg, strlen(msg)); char msg[] = "Hello char msg[] = Hello World!!¥n World!!¥n";; close(s); myhost = gethostbyname(hostname); bzero((char *)&me, sizeof(me)); } クライアントプログラム(Java) import java.io.*; import java.net.*; import java.lang.*; //サーバ側から送信された文字列を受信 byte[] buff = new byte[1024]; int a = is.read(buff); System.out.write(buff, 0, a); public class Client{ public static void main( String[] args ){ //ストリーム,ソケットをクローズ is.close(); socket.close(); try{ //ソケットを作成 String host="localhost"; Socket socket = new Socket( host, 10000 ); //入力ストリームを作成 DataInputStream is = new DataInputStream ( new BufferedInputStream( socket.getInputStream())); k ())) }catch(Exception e){ System.out.println(e.getMessage()); l ( ()) e.printStackTrace(); } } } サーバプログラム(Java) //Server.java import java.net.*; import java.lang.*; import java.io.*; //ストリーム,ソケットをクローズ os.close(); (); cliSocket.close(); svSocket.close(); }catch( Exception e ){ System.out.println(e.getMessage()); y p ( g g ()); e.printStackTrace(); } public class Server{ public static void main( String[] args ){ try{ //ソケットを作成 ServerSocket svSocket = new ServerSocket(10000); k k k ( ) //クライアントからのコネクション要求受付 Socket cliSocket = svSocket.accept(); //出力ストリームを作成 //出力ストリ ムを作成 DataOutputStream os = new DataOutputStream( new BufferedOutputStream( cliSocket.getOutputStream())); //文字列を送信 String s = new String("Hello World!!¥n"); byte[] b = s.getBytes(); os.write(b, 0, s.length()); i (b 0 l h()) } } サーバプログラム(Java) ソケット作成,コネクション要求受付待機 ServerSocket svSocket = newServerSocket(10000); Socket cliSocket = svSocket.accept(); 出力ストリーム作成 DataOutputStream os = new DataOutputStream( new BufferedOutputStream( cliSocket.getOutputStream liS k t tO t tSt ()); クライアントプログラム(C) アドレス設定 servhost = gethostbyname(hostname); bzero((char *)&server )&server,sizeof(server)); sizeof(server)); server.sin_family = AF_INET; server.sin_port = 10000; bcopy(servhost->h_addr, (char *)&server.sin_addr, servhost->h_length); h h l h) クライアントプログラム(C) ソケット通信 s = socket(AF_INET,SOCK_STREAM,0); connect(s,(void *)&server,sizeof(server)); read(s,buf,BUF_LEN); printf(buf); close(s); サーバプログラム(C) アドレス設定 myhost = gethostbyname(hostname); bzero((char *)&me )&me, sizeof(me)); me.sin_family = AF_INET; me.sin_port = 10000; bcopy(myhost->h_addr, (char *)&me.sin_addr,myhost->h_length); サーバプログラム(C) ソケット通信 s_waiting = socket(AF_INET,SOCK_STREAM,0); bind(s ( _waiting,(void g,( *)&me,sizeof(me)); ) , ( )); listen(s_waiting, 1); s = accept(s_waiting, t( iti NULL NULL, NULL) NULL); write(s, "Hello World!!¥n", 14); close(s); クライアントプログラム(Java) ソケットを作成 Socket socket = new Socket( “hoge.com”, 10000 ); 入力ストリ ムを作成 入力ストリームを作成 DataInputStream is = new DataInputStream ( new BufferedInputStream( soc et.get putSt ea ())); socket.getInputStream())); クライアントプログラム(Java) サーバ側から送信された文字列を受信 n = is.read(buff); System.out.write(buff, 0, n); ストリーム,ソケットをクローズ is.close(); socket.close(); k l () サーバプログラム(Java) ソケット作成,コネクション要求受付待機 ServerSocket svSocket = newServerSocket(10000); Socket cliSocket = svSocket.accept(); 出力ストリーム作成 DataOutputStream os = new DataOutputStream( new BufferedOutputStream( cliSocket.getOutputStream liS k t tO t tSt ()); サーバプログラム(Java) 文字列を送信 String s = new String("Hello World!!¥n"); byte[] b = s s.getBytes(); getBytes(); os.write(b, 0, s.length()); ストリーム,ソケットをクローズ os.close(); cliSocket.close(); svSocket.close();