実験 6 通信基礎実験 1 目的 ネットワークを通じてデータ転送を行うことを体験的に学ぶために 本実験ではT CP/IPプロトコルを使い ワークステーション間で通信を行うクライアントサーバモデルのプログラムを作成する 2 解説 1 ネットワークとプロトコルネットワーク ( コンピュータネットワーク

Similar documents
4 実験結果 // 用意されたヘッダファイル #include < stdio.h> #include < fcntl.h> #include < netdb.h> #include < sys/types.h> #include < sys/socket.h> #include < sys/sta

2. ネットワークアプリケーションと TCP/IP 2.1. クライアント / サーバモデル TCP/IP プロトコルに従うネットワークアプリケーションの典型的モデルは, クライアント / サーバモデルである. クライアント / サーバモデルでは, クライアントからの要求に対してサーバがサービスを提

演算増幅器

情報通信の基礎

通信プログラムの試作ーーー UDP を用いたじゃんけんゲームシステム ーーーー裘彬濱 南山大学情報理工学部 ソフトウェア工学科青山研究室

IP L09( Tue) : Time-stamp: Tue 14:52 JST hig TCP/IP. IP,,,. ( ) L09 IP (2017) 1 / 28

file:///C:/www/

スライド 1

TFTP serverの実装

ネットワーク実験

ソフトウェア開発実践セミナー ネットワークの基礎と UNIX ネットワークプログラミング 金子勇 土村展之 情報理工学系研究科数理情報学専攻 2002 年 11 月 6 日 ( 第 4

PowerPoint Presentation

目次 1. DB 更新情報受信 SW 仕様書 構成および機能 全体の構成 DB 更新情報受信 SW の機能 ソフトウェアの設計仕様 DB 更新情報受信 SW の仕様 資料編... 5

エラー処理・分割コンパイル・コマンドライン引数

untitled

演算増幅器

BSDソケットによるIPv6プログラミングを紐解く

アマチュア無線のデジタル通信

2.5 トランスポート層 147

ソケット API プロセス間通信の汎用 API プロセス : プログラムのひとつの単位 ex)./a.out とかやると 1 つのプロセスが立ち上がる ソケット API IPv4 IPv6 UNIX domain (UNIX 計算機内プロセス間通信 ) 本実験では IPv4 の TCP および UD

多言語ドメイン名の実装 mdnkit 石曽根信 ( 株 ) SRA 2001/12/04 日本語ドメイン名解説 / mdnkit 1 mdnkit 多言語ドメイン名を扱うためのツールキット 正規化 エンコード変換等を提供するライブラリとコマンド 既存アプリケーシ

12.1 インターネットアドレス インターネットアドレス インターネットアドレス 32 ビットの長さを持つインターネットに接続されたマシンを識別するのに使う インターネットアドレスは ピリオドで区切られたトークンの並びで表現されることもある インターネットアドレス

chapter 3 chapter 単純な HTTP クライアント / サーバ 61 HTTP クライアントの実装 62 HTTP サーバの実装 Chapter2 のまとめ 67 UDP 3-1 UDP の特徴とプログラミング UDP のプログラミング 71

Microsoft PowerPoint pptx

情報ネットワーク演習 2006年10月5日

本資料について

ポインタ変数

2006年10月5日(木)実施

NetLec17TCPIP1.ppt

PowerPoint プレゼンテーション

センサーデバイスへの仮想IP割り当て実験

Microsoft PowerPoint - kougi6.ppt

ファイル入出力

Microsoft Word - IPC-intro.docx

Microsoft PowerPoint - kougi9.ppt

Prog1_12th

PowerPoint プレゼンテーション

// このクラスの有効期間中の各呼び出しに使用される キャッシュされた Socket オブジェクト Socket socket = null; // 非同期処理が完了したことを通知するために信号を送るオブジェクト static ManualResetEvent clientdone = new Ma

Cプログラミング1(再) 第2回

Taro-ファイル処理(公開版).jtd

<4D F736F F F696E74202D DB A B C C815B E >

main main Makefile Makefile C.5 Makefile Makefile Makefile A Mech (TA ) 1. Web ( iku

ファイル入出力

3 3.1 LAN ISDN (IP) 2 TCP/UDP IP IP IP IP (Ethernet) Ethernet LAN TCP/UDP LAN Ethernet LAN 2: Ethernet ATM, FDDI, LAN IP IP IP 3 IP 2 IP IP IP IP IP 3

Microsoft PowerPoint - 10Com2.ppt

注意 2013 年くらいに調べた話なので 変化していることもあるかもしれません 2

r4.dvi

情報ネットワーク演習 2007 年 10 月 11 日 ( 木 )

Microsoft Word - Cプログラミング演習(9)

コマンドラインから受け取った文字列の大文字と小文字を変換するプログラムを作成せよ 入力は 1 バイトの表示文字とし アルファベット文字以外は変換しない 1. #include <stdio.h> 2. #include <ctype.h> /*troupper,islower,isupper,tol

1) // 2) I/O 3) Japan Advanced Institute of Science and Technology 2013/07/26 1

MPサーバ設置構成例

システムインテグレータのIPv6対応

情報処理演習 B8クラス

4-5. ファイアウォール (IPv6)

4-4. ファイアウォール (IPv4)

Microsoft PowerPoint - kougi2.ppt

Mobile IPの概要

Microsoft Word - surfing

PowerPoint プレゼンテーション

slide4.pptx

01-introduction.ppt

Microsoft Word - EGX100によるH663通信手引

ポインタ変数

書式に示すように表示したい文字列をダブルクォーテーション (") の間に書けば良い ダブルクォーテーションで囲まれた文字列は 文字列リテラル と呼ばれる プログラム中では以下のように用いる プログラム例 1 printf(" 情報処理基礎 "); printf("c 言語の練習 "); printf

ネーミング(1)

Microsoft PowerPoint - 第3回目.ppt [互換モード]

TCP UDP TCP UDP send()sendto()sendmsg() recv()recvfrom()recvmsg() OS Passive Active TCP UDP IP TCP UDP MTAMail Transf

オペレーティングシステムとネットワークプログラミング 担当 : 吉藤英明 yoshfuji+camp2008 AT wide.ad.jp セキュリティ & プログラミングキャンプ /08 OS プロトコルスタック (C)2008 YOSHIFUJI Hideaki,

講座内容 第 1 回オープンネットワークの概念と仕組み ( 講義 90 分 ) 基本的なネットワークの構成及び伝送技術について大規模化 マルチプロトコル化を中心に技術の発展と 企業インフラへの適用を理解する その基本となっている OSI 7 階層モデルについて理解する (1) ネットワークの構成と機

C プログラミング演習 1( 再 ) 2 講義では C プログラミングの基本を学び 演習では やや実践的なプログラミングを通して学ぶ

課題 4 クライアント GUI プログラム 再実験 / 追加課題 UDP 通信プログラム 2

Makefile, TCPソケットサーバ, コマンドライン引数

Microsoft PowerPoint - netprog_2015_07.ppt [互換モード]

Microsoft PowerPoint - kougi11.ppt

Microsoft PowerPoint - CproNt02.ppt [互換モード]

III 1 R el A III 4 TCP/IP プロトコルと 関連する各種上位プロトコルの基礎を学ぶ 具体的には 各プロトコルを実装したコマンド ( アプリケーションプログラム ) を実行し 各プロトコルの機能等を確認する また 同じプロトコルを実装したコンピュータ間では OS

中村隼大 鈴木秀和 内藤克浩 渡邊晃 名城大学理工学部愛知工業大学情報科学部

全体ロードマップ インターネット電話 音の符号化 ( 信号処理 ) 今日 音の録音 再生 ネットワーク ( ソケット ) プログラミング ファイル入出力 インターネットの基礎 C プログラミング基礎

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

【注意事項】RXファミリ 組み込み用TCP/IP M3S-T4-Tiny

ゴール インターネットの動作原理を理解する インターネットは様々な技術が連携して動作する 家族に聞かれて説明できるように主要技術を理解する

<4D F736F F F696E74202D F836F E837B815B839382CC8D5C927A82C6836C F815B834E90DD92E8>

インターネット,LAN,ネットワークに関する知識

第5回_ネットワークの基本的な構成、ネットワークの脆弱性とリスク_pptx

第5回 ネットワークプランニング18 (CS・荒井)

GIGA光SW-HUB

/*

計算機システム概論

第1回 ネットワークとは

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

Microsoft Word - u-CAT’Ý™è…K…C…

1013  動的解析によるBOTコマンドの自動抽出

問 2 ( 型変換 ) 次のプログラムを実行しても正しい結果が得られない 何が間違いかを指摘し 正しく修正せよ ただし int サイズが 2 バイト long サイズが 4 バイトの処理系での演算を仮定する #include <stdio.h> int main( void ) { int a =

スライド 1

Packet Tracer: 拡張 ACL の設定 : シナリオ 1 トポロジ アドレステーブル R1 デバイスインターフェイス IP アドレスサブネットマスクデフォルトゲートウェイ G0/ N/A G0/

A/B (2018/10/19) Ver kurino/2018/soft/soft.html A/B

NUMAの構成

Managed Firewall NATユースケース

赤堀蒼磨, 納堂博史, 鈴木秀和, 内藤克浩, 渡邊晃 名城大学理工学部 愛知工業大学情報科学部

Transcription:

実験 6 通信基礎実験 1 目的 ネットワークを通じてデータ転送を行うことを体験的に学ぶために 本実験ではT CP/IPプロトコルを使い ワークステーション間で通信を行うクライアントサーバモデルのプログラムを作成する 2 解説 1 ネットワークとプロトコルネットワーク ( コンピュータネットワーク ) とは2 台以上のコンピュータが何らかの線でつながったものである しかし 線で接続されているだけではコンピュータ間で通信を行うことが出来ず コンピュータ間の通信を行う物理的な手順 ( ネットワークカードなどのハードウェアに関する通信方法 ) 論理的な手順 ( アプリケーションにおけるソフトウェアに関する通信方法 ) を与える必要がある このようなコンピュータ間の通信手段の取り決めをプロトコルという インターネットとは 大学や企業などの組織内で構築されたネットワークを相互に接続する広域ネットワークで インターネットプロトコル (IP) と呼ばれるプロトコルによって通信が行われる 通信線には電話線 イーサネットケーブル 同軸ケーブル 光ケーブル 鳩などがある 2 TCP/IP TCP/IPはアメリカ国防省の高等研究計画局 (Advanced Research Projects Agency, ARPA) のネットワークであるARPANET 上で開発された 当初 ARPANETはパケット交換を使用して広域ネットワークを構築するために設計されたが TCP/IPプロトコルはLANにも適用されるようになった 1980 年代始めに発表されたUNIX4.2BSDにおいてTCP/IPが実装されていたことから ワークステーションの通信プロトコルとして実質的な標準となり 1983 年にはARPANETの標準プロトコルとして使用されるようになった 3 UDP UDPはトランスポート層のプロトコルで アプリケーションからアプリケーションへの通信を提供する IPがインターネットアドレスをともにパケットの交換を行うのに対し UDPはポートという概念でパケットの交換を行う IP で確立された通信路上にポートという出入り口を持った通信路が仮想的に複数確立される -1-

UDPはTCPのコネクション型通信と比べ 信頼性の低いコネクションレス型の通信を行い 誤り制御 順序付け フロー制御を行わない そのため UD Pモジュールの処理が単純になり TCPに比べ 高速なデータ転送が可能になる このようにIPがもつ最低限の機能のみをユーザーアプリケーションに提供しているため 誤り制御などの信頼性については上位のプロトコルで対処する必要がある 4 IPアドレスネットワークに接続されたパソコンやワークステーションで通信を行うためには それぞれのコンピュータを区別するためのアドレスが必要である インターネット上の ( 正確にはインターネットプロトコルで通信を行う ) 装置に割り当てられるアドレスをインターネットアドレス (IPアドレス) と言い 172. 24.4.1 のようにドットで区切られた4つの10 進数で表される インターネットに接続される全ての装置にはユニークなIPアドレスが割り当てられるようになっており それらはすべてNIC( Network Information Center) で管理されている そのなかでも 日本で使用されるIPアドレスはJPNIC で管理されている しかし インターネットが急速に普及するにつれてIPアドレスの不足が心配されるようになったきた そのため 組織内部だけのクローズなLAN 環境では インターネットにアクセスする場合だけ本来のユニークなアドレス ( グローバルアドレス ) を割り当てる方法が利用されるようになった プライベートアドレス空間からグローバルアドレス空間 ( インターネット ) を アクセスできるようにする仕組みとしては プロキシや NAT(Network Address Translator) が利用される 5 クライアントサーバモデルのネットワークプログラミングクライアントサーバモデルはネットワークアプリケーションの形態の1つで 1つのアプリケーションがクライアント( サービスを要求するもの) とサーバ( サービスを提供するもの ) で構成されている クライアントとサーバはネットワーク上でお互いに通信を行いながら具体的な処理を行う 一般的にサーバはクライアントからの要求を待ち 要求に対応した処理を行い その結果をクライアントへ送信する たとえば WWWはクライアントサーバモデルのシステムであり Netscape Navigator Internet Explorer などのクライアントと Apache Netscape Enterprise Server などのサーバがHTTPによる通信を行っている 本実験では クライアントとサーバの2つのプログラムがネットワーク上でお互いに通信を行いながら具体的な処理を行うプログラムを作成する -2-

6 ソケットインターフェースソケットインターフェースは, トランスポート層とアプリケーション層の間の インターフェースで, ユーザが作成するアプリケーション層のプログラムから, トランスポート層のプロトコルモジュール ( TCP,UDP) を呼び出すために使用される TCP か UDP どちらかを選択できるが, ここでは UDP によるコネクションレス型通信の基本的手順を説明する ソケットインターフェースのシステムコールを使用する例を下図に示す プログラム内で呼ばれるシステムコールを説明する client process server process socket() socket() bind() bind() request sendto() recvfrom() recvfrom() sendto() reply close() close() 1 socket() クライアント, サーバともに通信の最初に呼び出すシステムコール 通信のための通信ポートの作成, 使用するプロトコルを設定 2 bind() 作成したソケットを識別するためのアドレスを与える 3 sendto (), recvfrom() 通信相手のソケットアドレスを指定して, メッセージの送受信を行う クライアントは sendto() で要求して, recvfrom() で受け取る 4 close() データ転送終了時にソケットをクローズする処理を行う -3-

7 ポート番号 ポート番号にはユーザが自由に使える物と, すでにきめられたサービスのために割り当てられているものがある 以下に一般に割り当てられているポートの一覧を示す ポート番号 用途 0-255 ウェルノウンポート ( telnet, ftp など良く使われるサービス用 ) 256-1023 予約済ポート ( スーパーユーザプロセスのみ利用可能 ) 1024-5000 自動割り当てポート ( ポートを指定しなかった場合に自動的にシステムが割り当てる ) 5001-65535 ユーザが自由に使えるポート 3 実験 1 週目は文字通信プログラムを作成する 通信で送られてきた ASCII 文字 ( 半角英数字 ) を大文字にしてクライアントへ返信するサーバープログラムと, 通信で文字を送り, また送られてきたデータを受信 表示するクライアントプログラムを使用して, ソケット通信を学ぶ -4-

4 実験結果 #include < stdio.h> #include < sys/types.h> #include < sys/socket.h> #include < netinet/in.h> #include < netdb.h> #define MAXLINE 512 #define SERV_UDP_PORT 35567 / * 穴埋め : 使用するポート番号を定義する*/ #define Error fprintf main( argc, argv) int argc; char *argv[]; { int n, sockfd, servlen, dummylen; struct sockaddr_in serv_addr, cli_addr; struct hostent *host; char *hname; char *program; char sendline[ MAXLINE ], recvline[ MAXLINE + 1 ]; int errno; program = argv[ 0 ]; if ( argc == 1) { fprintf( stderr, " 引数 ( サーバーホスト名 ) を指定してください. n" ); /* 穴埋め : 引数で指定したサーバ情報を host に代入する*/ if (( host = gethostbyname( argv[ 1 ])) == NULL) { 5 fprintf( stderr, "%s n", h_errno ); /* serv_addr にサーバアドレスを設定する*/ bzero(( char *) &serv_addr, sizeof( serv_addr )); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = inet_addr( inet_ntoa( host-> h_addr )); serv_addr.sin_port = htons( SERV_UDP_PORT ); /* 穴埋め :socket() */ if (( sockfd = socket( serv_addr.sin_family, SOCK_DGRAM, 0 )) == -1) { fprintf( stderr, "Socket Error: %d n", errno ); -5-

/* cli_addr にローカルアドレスを設定する*/ bzero(( char *) &cli_addr, sizeof( cli_addr )); cli_addr.sin_family = AF_INET; cli_addr.sin_addr.s_addr = htonl( INADDR_ANY ); cli_addr.sin_port = htons( 0 ); /* 穴埋め :bind() */ if ( bind( sockfd, ( struct sockaddr *)&cli_addr, sizeof( cli_addr )) == -1) { fprintf( stderr, "Bind Error: %d! n", errno ); /* main loop */ printf (" 終了する場合は Ctrl+D を入力してください. n" ); while( printf ("%%"),fgets( sendline, MAXLINE, stdin )!= NULL) { n = strlen( sendline ); /* 穴埋め: ループ内の処理 */ if (( servlen = sendto( sockfd, &sendline, n, 0, ( struct sockaddr *)&serv_addr, sizeof ( serv_addr ))) == -1) fprintf( stderr, "Send Message is failed!: %d n", errno ); continue; if ( ( recvfrom( sockfd, &recvline, servlen, 0, ( struct sockaddr *) &cli_addr, &dummylen)) == -1) { fprintf( stderr, "Receive Message is failed!: %d n", errno ); continue; recvline[ n ] = 0; fputs( recvline, stdout ); printf (" 終了します n" ); close( sockfd ); 入力した文字列がサーバに送られ 大文字になって帰ってくる様子を確認 -6-

5 考察 1 本実験では UDP というコネクションレス型の通信プログラムを作成したが TCP を利用してプログラムを作成する場合 どのような点が異なるか 2.2.2 の手順と比較して具体的に説明せよ クライアント側クライアント側では, socket (),connect(),write(),read(),close() の 5 つのシステムコールを使用する. UDP とは違い, 一度繋ぐと通信路を確保して接 続をし続けるため, クライアント側に返すために宛先が必要ないため,bind () は存在しない. write() read() はそれぞれ sendto() recvfrom() に対応しており, データの送信受信を行う. サーバ側サーバ側では, socket (),bind(),listen(),accept(),write(),read(),close() の 7 つのシステムコールを使用する. こちら側は相手から繋いでもらうためにソケットにアドレスを設定しないといけないため, bind() が存在する. listen() は接続待ち状態であり, クライアント側の connect() を待つ ( また, 接続されるクライアント数もここで設定する 3). accept() はクライアントから connect() されたときにその接続を受け, 接続された場合にクライアント側に通知する. write() read() はクライアント側とデータの送受をするための関数である. このように, TCP プロトコルを使った通信では, 確実に相手に情報を届けることができ, 送ることができなかった場合もちゃんとエラーが返すことができるようになっている. MSN メッセンジャーなどが TCP で動いている例である. 2 本実験で作成したプログラムを, 効率的なプログラム, 他人から見て読みやすいプログラムに改良するとしたら, どのような点が考えられるか検討せよ. プログラムの穴を埋めているときに気になったのが変数に注釈文がついていないこと 変数を使おうと思ったときにどの変数を使って良いのか分からず 新しい変数を作ってしまった これは明らかな無駄である 宣言型変数名 ; // 変数の使用目的などの形にすれば改善は可能 3 本実験を行って, 難しかった点, 興味を持った点などについて感想を述べよ 穴埋めプログラムのはずが 変数宣言や エラー処理などで穴埋めで無い部分を加えすぎてしまったので組み直すことになってしまった 明らかな無駄である かといって1から組めるわけでもないので全部組めと言われても困るところがある プログラム全体を見れば何を行っているのかだいたい想像はつくが 1 行 1 行に注釈文を付けることは無理である この状態で次の実験がうまくいくのか心配である -7-

-8-