920 likes | 1.13k Views
ネットワーク入門. 廣安知之 + クラスタ研究グループ 同志社大学. ネットワーク 通信. パラレルプログラミングには直接関係無い 現在のシステムでは不可欠 電子メイル, web 各種設定 PC クラスタの構築 分散メモリ型マシンでの並列・分散処理 無線 LAN ,ネットワークストレージ,ネットワークブート. プロトコル TCP/IP. プロトコル. FTP, SMTP, telnet, TCP/IP, AppleTalk, …. こんにちは. 通信をする上での約束ごと. Hello. IP. 何を規定すれば通信が行えるのか?.
E N D
ネットワーク入門 廣安知之 + クラスタ研究グループ 同志社大学
ネットワーク 通信 パラレルプログラミングには直接関係無い 現在のシステムでは不可欠 電子メイル,web 各種設定 PCクラスタの構築 分散メモリ型マシンでの並列・分散処理 無線LAN,ネットワークストレージ,ネットワークブート
プロトコル FTP, SMTP, telnet, TCP/IP, AppleTalk, …. こんにちは 通信をする上での約束ごと Hello
AからBへ“Hello”を送るには あて先の指定 ネット上で一つ Hello Hello A B Hello Hello Hello
IPアドレス • インターネットなどのネットワークに 接続されたコンピュータの識別番号 202.23.129.104 202.23.129.101 202.23.129.103 202.23.129.102 10111111 11001000 11111110 11111110
AからCへ“Hello”を送るには Hello Hello B A Hello Hello Hello C Hello • ネットワークの表示 • ネットワークを橋渡すマシンの表示
ネットマスク • ネットワーク部とホスト部の切れ目を示す IPアドレス:192.168.6.121 11000000 10101000 00000110 01111001 ネットワーク部 ホスト部 サブネットマスク:255.255.255.0 11111111 11111111 11111111 00000000 ネットワーク部 ホスト部
クラス • ネットワークの規模によりIPアドレスは 3つのクラスに分かれる 224=約1600万台 クラスA クラスB 216=約65000台 クラスC 28=約250台 ネットワーク部 ホスト部
ゲートウェイ • 2つのネットワークを結ぶ働き ゲートウェイ 192.168.0.系統 192.168.1系統
ブロードキャストアドレス • ネットワークに接続されている全ての コンピュータと通信するためのアドレス
ドメイン名 • IPアドレスのかわりに用いる識別名 www.doshisha.ac.jp -サーバの種類 -組織名称 ピリオドで分かれている -組織種別 -国
DNS • ドメイン名とIPアドレスを対応付ける doshisha.ac.jpのIPアドレスは? 192.168.6.12です コンピュータ DNSサーバ
DNS② • DNSの仕組み doshisha.ac.jpのIPアドレスは? 名前解決して下さい 192.168.6.12です jpのDNSなら分かる 了解! 192.168.6.12 名前解決して下さい acのDNSなら分かる 名前解決して下さい jpのDNS ルートDNS acのDNS
IP version4の問題点(1) アドレス空間32bit PCユーザの増化 ≪ (地球の人口約55億) 232≒43億 デバイスの増加 IPアドレス枯渇の危機!
IP version4の問題点(2) 新しいIPが必要 • セキュリティの不備 • 経路情報増大によりルータへの負担大 • 簡単な設定の要求が高まる
IP version6の改良点 • アドレス空間128bit 128bit≒340澗=3.4×1038ほぼ無限大 アドレス枯渇問題解消! • セキュリティ技術の導入 • アドレス自動生成機能 • フローラベルの導入
高速化! IPv6ヘッダの改良点 除去 オプションフィールド ヘッダチェックサム 分割制御フィールド ルータ処理の 負担軽減 導入 高品質な マルチメディア通信が可能 フローラベル
MACアドレス 00-a0-de00-00-01 • Media Access Control Addressの略 • ネットワークカードに割り当てられる固有の番号 • Ethernet上の機器間の物理的な通信を行う 3bytes 3bytes 製造会社を示す番号 メーカーが独自に割り当てる番号
IPアドレスとの違い • IPアドレス • ネットワーク層におけるアドレス • ソフトで設定可能 • MACアドレス • データリンク層におけるアドレス • ネットワークカードによって固定
ARP 1.1.1.1 1.1.1.4 1.1.1.2 1.1.1.3 • Address Resolution Protocolの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする Broadcastアドレスに対して,ホスト(1.1.1.2)を尋ねる
ARP 1.1.1.1 1.1.1.4 1.1.1.2 1.1.1.3 • Address Resolution Protocolの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする ホスト(1.1.1.2)は,MACアドレスを返す
ARP 1.1.1.1 1.1.1.4 1.1.1.2 1.1.1.3 • Address Resolution Protocolの略 例えば IPアドレスが(1.1.1.1)のホストが,(1.1.1.2)のホストに対して通信を行うとする MACアドレスを使用して,通信を行う
パケット通信 データM データm1 データm2 データm3 長いデータは通信できない 小さな複数の情報に分割
パケット通信の問題点 4 4 4 2 3 1 3 3 2 2 1 1 3 3 1 1 4 4 2 2 3 4 2 1 • パケットの順番 • パケットの欠落
UDP UDP : User Datagram Protocol • 正しく相手に届いたかの確認をしない • 不確実であるが高速な通信を実現 ・・・・・
TCP TCP : TransmissionControl Protocol • インターネットの通信プロトコルとして最も普及 ※プロトコル こんにちは。 × Bonjour. こんにちは。 ○ こんにちは。
もう1度お願いします! TCP • 送信したデータが正しく相手に届いたかを確認 • 届いてなければ再送する 了解!
TCPとUDP③ • TCPとUDPの違い TCP UDP 信頼性 高信頼 低信頼 転送速度 低速 高速 転送形式 コネクション型 コネクションレス型 その他 端末間同士のデータ転送 上位レイヤからの送信要求が簡潔
UNIXでの通信 • ソケットを使ってデータの送受信 • ソケットを使った通信 ソケット通信
ソケット 「接続の端点」 意味: コンピュータとTCP/IPを つなぐ出入り口 ソケット TCP/IP
ソケット通信 サーバプログラム ソケットを用意して接続要求を待つ クライアントプログラム ソケットを用意して サーバに接続要求を行う • ソケットを使って通信を行うには • 2つのプログラムが必要
ソケット通信とは 接続待ち 接続待ちのサーバを クライアントが探す サーバを探す サーバ側 クライアント側
ソケット通信とは 接続を受信 サーバが見つかったら 接続して通信 サーバを見つけて接続 サーバ側 クライアント側
ソケット通信の流れ 1 ソケット生成 (socket) ソケット生成 (socket) クライアント サーバ
ソケット通信の流れ 2 サーバを探す (gethostbyname) 接続の準備 (bind/listen) クライアント サーバ
ソケット通信の流れ 3 接続要求 (connect) 接続受理 (accept) OK! クライアント サーバ
ソケット通信の流れ 4 通信 (send/recv) 通信 (send/recv) こんにちわ こんにちわ クライアント サーバ
ソケット通信の全体の流れ ソケット生成(socket) サーバを探す (gethostbyname) 接続要求(connect) データ送受信(send/recv) ソケットを閉じる(close) クライアント サーバ ソケット生成(socket) 接続の準備(bind) 接続待機(listen) 識別情報 接続受信(accept) データ送受信(send/recv) ソケットを閉じる(close)
識別情報 • 正しくデータを受け渡しするために • 通信する相手を識別する IPアドレス コンピュータを識別 ポート番号 プログラムを識別 コンピュータのアドレス プログラムの識別番号
ウェルノウン ポート よく使われているプログラムの ポート番号は決まっている 1024番以下は全て決められている
クライアントプログラム(C) //client.c #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<string.h> #define PORT (u_short)10000 #define BUF_LEN 100 char hostname[]="localhost"; char buf[BUF_LEN]; main() { struct hostent *servhost; struct sockaddr_in server; int s; servhost = gethostbyname(hostname); bzero((char *)&server,sizeof(server)); server.sin_family = AF_INET; server.sin_port = PORT; 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 #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> #include<netinet/in.h> #include<netdb.h> #include<string.h> #define PORT (u_short)10000 char hostname[] = "localhost"; main() { struct hostent *myhost; struct sockaddr_in me; int s_waiting, s; char msg[] = "Hello World!!\n"; myhost = gethostbyname(hostname); bzero((char *)&me, sizeof(me)); me.sin_family = AF_INET; me.sin_port = PORT; 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)); listen(s_waiting, 1); s = accept(s_waiting, NULL, NULL); close(s_waiting); write(s, msg, strlen(msg)); close(s); }
クライアントプログラム(Java) import java.io.*; import java.net.*; import java.lang.*; public class Client{ public static void main( String[] args ){ try{ //ソケットを作成 String host="localhost"; Socket socket = new Socket( host, 10000 ); //入力ストリームを作成 DataInputStream is = new DataInputStream ( new BufferedInputStream( socket.getInputStream())); //サーバ側から送信された文字列を受信 byte[] buff = new byte[1024]; int a = is.read(buff); System.out.write(buff, 0, a); //ストリーム,ソケットをクローズ is.close(); socket.close(); }catch(Exception e){ System.out.println(e.getMessage()); e.printStackTrace(); } } }
サーバプログラム(Java) //Server.java import java.net.*; import java.lang.*; import java.io.*; public class Server{ public static void main( String[] args ){ try{ //ソケットを作成 ServerSocket svSocket = new ServerSocket(10000); //クライアントからのコネクション要求受付 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()); //ストリーム,ソケットをクローズ os.close(); cliSocket.close(); svSocket.close(); }catch( Exception e ){ System.out.println(e.getMessage()); e.printStackTrace(); } } }
サーバプログラム(Java) ソケット作成,コネクション要求受付待機 ServerSocket svSocket = newServerSocket(10000); Socket cliSocket = svSocket.accept(); 出力ストリーム作成 DataOutputStream os = new DataOutputStream( new BufferedOutputStream( cliSocket.getOutputStream());