...

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

by user

on
Category: Documents
3

views

Report

Comments

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();
Fly UP