NetworkLecture

Download Report

Transcript NetworkLecture

Windows Network
Programming
中京大学
情報理工学部 情報システム工学科
H107002 秋田大輔
目次
 ネットワークとプロトコル
 Winsock
 課題
プロトコルとは
 ネットワークで通信を行うときの約束事
コンピュータ同士が正しく通信するために必要
例:電話のプロトコル
受話器を取り、相手
の番号をダイヤル
受話器のベルが鳴る
呼び出し音がとまる
受話器を取る
受話器を置く
自分側
通話
受話器を置く
相手側
OSI基本参照モデル
OSI基本参照モデル
ネットワーク・プロト
コル
ネットワーク機
器
第7層
アプリケーション層
第6層
プレゼンテーション層
第5層
セション層
SSL
第4層
トランスポート層
TCP, UDP
ゲートウェイ
第3層
ネットワーク層
IP, ICMP, ARP
ルータ
第2層
データリンク層
ブリッジ
第1層
物理層
リピータ
HTTP, SMTP, FTP
データリンク層・物理層
 物理層
 デジタルデータを電圧に変換し、機器へ送る
 データリンク層
 ネットワーク上で繋がれた機器同士の通信方
式を定める
 電気信号の誤り訂正や、再送信要求、フレー
ムの判別などを行う
ネットワーク層
 経路の選択、宛先の管理
 実際にパケットを送るのはココ
 同じネットワークだけでなく、異なるネット
ワーク媒体上に接続されているコンピュータ間
でも通信を行えるようにする
 ⇒IP(Internet Protocol)

ネットワークに参加している機器のアドレス付や
経路選択を行うプロトコル。
 IPアドレス
 通信を行う際に、宛先を判別するために使う
 MACアドレス(物理アドレス)
 Ethernetにある固有番号
 カード間での送受信はこれを用いる
IPに関するプロトコル
 ARP(Address Resolution Protocol)
 IPアドレスからMACアドレスを求めるプロトコル

⇔RAPR(Reserve ARP)
 ICMP(Internet Control Message Protocol)
 IPのエラー・制御メッセージを転送する
 エラー通知や診断などの問い合わせ
IPアドレスについて
 IPアドレスはIPv4プロトコルに基づく32bitのアド
レス空間
しかし、最近IPアドレスの枯渇問題が浮上している
 ネットワーク部+ホスト部で構成されている
 A~Eの5つのアドレスクラスに分けられている
 10101100.00010000.11111
110.00000001
172
1
.
16
.
254
.
IPアドレスのクラス
 Aクラス
 ネットワーク部8bit、ホスト部24bit
 0-から始まる
0
2^24=1600万
 Bクラス
 ネットワーク部16bit、ホスト部24bit
 10-から始まる
10
2^16=6553
6
 Cクラス
 ネットワーク部24bit、ホスト部8bit
 110-で始まる
110
2^8=
256
 Dクラス
 ネットワーク部32bit、ホスト部0bit
 IPマルチキャスト専用
 ホストアドレスは無い
1110
 クラスE
 将来のために予約されている
 1111-で始まる
 IPアドレスの例外
 ホストアドレスが全て1

⇒ブロードキャストアドレスとして使われる
 ホストアドレスが全て0

⇒IPアドレスがわからない時に使われる
 この二つはホストアドレスとして使えない
サブネットマスク
 IPアドレスのうち、何bitをネットワークアドレ
スに割り振るかを定義する32bitの数値。
 例えばサブネットマスクが2進数で
11111111 11111111 11111
111 00000000
ならば、IPアドレスのうち上位24ビットが
ネットワークアドレス、下位8ビットがホスト
 サブネットワーク
 ネットワークをサブネットマスクによって細
かく分けた内の1つのネットワーク
トランスポート層
 通信を行うプログラム間で使用する仮想的
な回線の提供
 通信相手にデータが確実に届いたかどうか
の確認、再送信などの処理
データを確実に相手に届ける役割を担う
TCPとUDPの違い
 TCP(Transmission Control Protocol)
 コネクション型通信
 相手との接続を確立したかどうかを確認して
から通信を行う
 届かなければ再送信を自動で行う
低速だが、データ転送の信頼性を確保している
TCPとUDPの違い
 UDP(User Datagram Protocol)
 コネクションレス型通信
 相手との通信を確立せずに通信を開始
 データが抜け落ちても再送は行わない
 使用例

skype、ストリーム形式での配信など
確実にデータが届くという保証はないが高速
セション層
 セション(仮想的な回線の開始~終了間)の
管理を行い、送受信の同期をとる機能を提
供する
 効率的にデータを送るための送信方法を決
める、経路の確立・解放も(実際に行うの
はトランスポート層)
送信方法の例
 回線交換方式
 回線を設定し、占有して通信を行う
A
B
交換局
中継局
交換局
常に一定の帯域幅が保証されるが、相応のコストがかかる
 パケット交換方式
 データをパケット(小さなデータ)に分割して通信を行
う
 一部で障害が発生しても、経路変更が可能

あらかじめ回路を確立しておく必要がないため
 回路交換方式に比べてネットワークを有効に利用でき
るのでコスト的に有利になる可能性が高い
A
B
プレゼンテーション層
 ネットワーク上のアプリケーション間で意味を
統一するため、文字コードなどのデータの表現
形式を規定変換する
 コンピュータによって対応する表現形式が違
うため
 データの暗号化や圧縮などを行う機能を提供す
る
アプリケーション層
 ネットワークを使ったサービスを他の人やプロ
グラムに提供する
 メッセージの転送、Webへのアクセス手順な
ど用途に応じて様々なプロトコルがある
ちょっと休憩
 ゼミのノートPCを、ネットに接続する方
法は?
この機会に是非
覚えておこ
う!!
接続方法
 1.コマンドプロンプトを起動
 2.telnet 10.0.255.254
 うまくいかない場合
 ipconfig/release でIPアドレスを解放

IPアドレスが重なっている場合があるため
 ipconfig/renew

IPアドレスをDHCPで更新
 3.選択肢に1
 4.学籍番号とパスワードを入力
259
DHCPって?
 Dynamic Host Configuration Protocol
 インターネットに接続するコンピュータに
IPアドレスなどの情報を自動で割り当てる
 通信が終わると回収される
 利用者にとっては使いやすく
 管理者にとっては管理しやすく
コマンドプロンプトで用いるネットワーク系統の命令
 ipconfig
 TCP/IPに関する設定情報の表示
 ネットワーク構成の確認

ipconfig(-all)だとより詳細に表示される
 netstat
 TCP/IPにおけるネットワークの通信状況を確認
 netstat –a
 有効なコネクションと、接続できるポートを全て表示する
 netstat –e
 イーサネット上にあるインタフェース情報を表示する
 アクセス制御はCSMA/CDが使われる
 netstat –n
 IP アドレスとポート番号を名前ではなく数字で表す
WinSock
 WindowsでTCP/IPの機能を備えたソフトウェア
を開発するために用いるAPI
Windows でネットワークを利用した
通信を行うプログラムが書ける
プログラムを組んでみよう
 今回はC言語を用いる
 『サーバ側』・『クライアント側』で二つのプ
ログラムが必要
 サーバプログラムのホスト名 or IPアドレスを、
クライアントプログラムでわかるようにする必
要がある
#inlcude(winsock2.h)を追加する
大まかな流れ
 クライアント側
 Winsockの初期化
 ソケットを作る
 接続先の設定
 接続できたら通信開始
 終了したら接続を切断
大まかな流れ
 サーバ側
 ソケットを作る
 接続待ちをするIPアドレスとポート番号の設定
 ソケットにアドレス情報を結びつける
 接続を待つ
 クライアントから要求が来たら受付
 通信開始
 ソケットって?
 IPアドレスとポート番号を組み合わせたネットワーク
アドレス
Winsockの初期化・終了
 まずWSADATA型で変数を宣言
 WSADATA wsaData;
 WSAStartup(MAKEWORD(2,0),&wsaData);
 WSAStartup(Winsockのバージョン,
初期化した状態を入れるた
めの変数);
 WSACleanup();
 Winsock機能の終了
ソケットの作成・破棄
 Winsockでソケットは”SOCKET”という変数で表す
全ての通信はSocket()関数が返すSOCKET変数を使う
 まず変数の宣言
 SOCKET sock;
 Socket関数
 socket(アドレスファミリ,ソケットタイプ,プロトコル):


アドレスファミリ:ネットワークアドレスの種類を表すもの
INET=インターネット
 作成
 sock = socket(AF_INET,SOCK_STREAM,0);
 破棄
 closesocket()関数

closesocket( 破棄するソケット);
ソケットの設定
 接続先のIPアドレス・ポート番号を指定
 INADDR_ANY


相手を特に指定しない
サーバー側でよく用いられる(通信相手を探す時)
 INADDR_NONE


IPアドレスが存在しない場合
クライアント側でよく用いられる(サーバを探してエラーが
発生した時)
sockaddr_in構造体
 ネットワークプログラミングを行う上で基本となる構造
体
 接続先のホストや自ホストのIPアドレス・ポート番号を
指定するときに用いる
 使用例(クライアント側)
 接続先(サーバ)を指定
 server.sin_family = AF_INET;
 server.sin_port = htons(123456);
 server.sin_addr.S_un.S_addr = inet_addr(“127.0.0.
1");
ソケットの設定
 接続先のアドレス情報を構造体にまとめる
 inet_addr()関数
 文字列で表現されたIPアドレスを整数に変換

server.sin_addr.S_un.S_addr = inet_addr(“127.0.0.
1”);
 htons()関数
 ポート番号をネットワークバイトオーダーに変換する

server.sin_port = htons(12345);
サーバに接続する
 connect()関数
 サーバに接続要求を送る
 connect(ソケット,接続先アドレス情報が入っている
sockaddr_in構造体をsockaddr構造体に
キャスト
したもの,sockaddr_in構造体の
大きさ);
 sockaddr構造体

ソケットプログラミングを行う上で基本となる構造体
 こんな感じ
 connect(sock, (struct sockaddr*)&server, sizeof(server));
ソケットをアドレスとポートに結びつける(サーバ側)
 bind()関数
 bind(ソケット,アドレス入りのsockaddr_in構造体を
sockaddr構造体にキャストしたもの,
sockaddr_in構造体の大きさ);
 こんな感じ
 bind(sock, (struct sockaddr*)&addr, sizeof(addr));
接続リクエストの受付
 listen()関数
 ソケットを接続待ち状態にする

listen(sock,10);
 listen( ソケット , 待機状態のリクエストが
格納されるキューの大き
さ);
 こんな感じ
 if(!listen(sock,10)){ printf("listenに失敗"); exit(1); }
クライアントからの接続を確立する
 accept()関数
 まずは接続先のアドレス情報の大きさを取得

len = sizeof(接続先のアドレス情報)
 accept(ソケット , 接続先のアドレス情報 ,
接続先アドレス情報の大きさ);
 こんな感じ
 sock2 = accept(sock1, (struct sockaddr*)&client, &len);
データの送受信
 送信
 send()関数

send( ソケット , 送信するデータへのポインタ ,
送信するデータの長
さ , 0 );
 受信
 memset()関数

memset(バッファのポインタ,初期化に使う文字,
初期化するバイト数);
 recv()関数
 recv( ソケット , 受信するバッファへのポインタ ,
受信するデー
タの長さ , 0 );
課題
 1.配布するサンプルプログラムを実際に打ってみて




動作を確認(面倒だけど)
2.五回連続で、クライアントから要求を出せるように
する
3.「stop」とクライアントが入力したら、接続を解除
できる
ように改良
4.二つの整数を入力すると、サーバ側で和の計算を
行って計算結果をクライアントに返し、クライアン
ト側で
計算結果を表示するプログラムを作成
5.自由課題
 これまでの課題の改良(例外処理等)でもいいし、一から
作ってもいい
 どんなプログラムなのかの簡単な説明もtxtファイルで一緒
注意事項
 課題2・3でまとめて一つ、課題4、課題5のサー
バ側
クライアント側のファイルをフォルダに入れて提出
 作成したプログラムファイルは、学籍番号・名前を
つけたフォルダの中にまとめる
 ファイル名は分かりやすいものをつける
 全部とまでは言わないが、プログラムに説明のコメ
ントをつける