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のサー
バ側
クライアント側のファイルをフォルダに入れて提出
作成したプログラムファイルは、学籍番号・名前を
つけたフォルダの中にまとめる
ファイル名は分かりやすいものをつける
全部とまでは言わないが、プログラムに説明のコメ
ントをつける