Upload
evania
View
72
Download
0
Embed Size (px)
DESCRIPTION
ネットワークプログラミング ( CS-B3 選択必修). 峰野博史 [email protected]. 参考書. などなど. ネットワーク OS. ネットワーク機器などを制御する機能を備えた OS 最近の PC 向け OS は全てネットワーク OS 機能を搭載 様々な部品(モジュール)が階層的に組み合わされてネットワークシステムを構築 特定の機能や役割を担う機能ブロックのことで,通常は他のモジュールと取り換え可能. ネットワークソフトウェアの概要. OS 内部のネットワークソフトウェア. トランスポートモジュール - PowerPoint PPT Presentation
Citation preview
参考書
2
などなど
ネットワーク OS
• ネットワーク機器などを制御する機能を備えた OS– 最近の PC 向け OS は全てネットワーク OS 機能を搭載
• 様々な部品(モジュール)が階層的に組み合わされてネットワークシステムを構築– 特定の機能や役割を担う機能ブロックのことで,通常は
他のモジュールと取り換え可能
3
ネットワークソフトウェアの概要
OS 内部のネットワークソフトウェア
• トランスポートモジュール– TCP/UDP の機能を実現し,始点ホストと終点ホストの内部で動
作• 最近は,ほぼ全てのルータに搭載されている
• インターネットモジュール– IP の機能を実現し,経路上の全てのルータ内部で動作
• デバイスドライバ– NIC を制御し,パケットの送信処理,パケットの受信処理
4
プロトコルスタックとパケットの処理
5
FCS (Frame Check Sequence)
通信開始時のアドレス変換処理①• アプリケーションレベル: ホスト名• トランスポートレベル: ポート番号• IP レベル: IP アドレス• Ethernet レベル: MAC アドレス
6
1.ホスト名から IPアドレスを調べる
2.サービス名からポート番号を調べる
通信開始時のアドレス変換処理②• IP アドレスから,次に送るべきホストやルータを決定
7
• IP アドレスから, MAC アドレスを調べる
> route PRINT
> arp -a
ARP (Address Resolution Protocol)
詳細
8
TCB (Transmission Control Block)
ARP (Address Resolution Protocol)
FCS (Frame Check Sequence)
クライアントサーバモデル• クライアント: 処理を要求するプログラム• サーバ: 要求を受けて処理するプログラム
9MTA (Mail Transfer Agent),Web Proxy Server など
ソケットを用いたシステムコールと内部処理
• ソケット– アプリケーションとトランスポ
ートモジュールとのインタフェース
– 関数呼び出しのような形でシステムコールを呼び出しメッセージ送受信
• アプリケーション– ユーザモードで動作– 資源へのアクセスは制限され,許
可外にアクセスすると” Segmentation fault (core dumped)” し,システム動作には影響を与えない
• カーネル– カーネルモードで起動– システム起動後にメモリに常駐す
る OS の中心部– メモリ保護機能は働かず,全ての
資源にアクセス可能で,不正処理時はシステム全体へ波及する可能性がある
• バッファ– データを一時的に記憶しておくメ
モリ領域(有限)• キュー(待ち行列)
– FIFO に分類されるバッファの一形態
10
send システムコールと内部処理• sendシステムコールは, OS に「送信処理を依頼する」だけで,
実際の送信処理は OS 内部の様々なモジュールを介して実行① ソケットモジュールは,ユーザのメモリ空間に存在する送信メッセ
ージをカーネルのメモリ空間へコピーし,ソケットのバッファ(送信キュー)へ渡す
② TCP のバッファが空いている場合,ソケットのバッファにたまっているメッセージを順番に TCP モジュールのバッファ( TCP 送信キュー)へ入れ, TCP に処理を任せる. TCP のバッファが一杯の場合は, TCP のバッファに空きができるまで処理を待つ
③ TCP モジュールがバッファに格納されているメッセージを IP モジュールに渡す時には,チェックサムを計算したりポート番号を挿入した TCP ヘッダを付加して, TCP セグメントの形にしてから IPモジュールのバッファ( IP 送信キュー)へ入れる
④ IP モジュールは,ルーティング等の処理や始点・終点 IP アドレスを挿入した IP ヘッダを付加して, IP パケットを NIC デバイスドライバのバッファ( I/F 送信キュー)へ入れる
⑤ NIC デバイスドライバは,始点・終点 MAC アドレスを挿入したMAC ヘッダと FCS を含んだMACトレイラを付加して,MACフレームをバッファ( NIC 送信キュー)へ入れる
⑥ MAC フレームの送信 11
recv システムコールと内部処理• recvシステムコールは,データの受信処理をしているわけではな
く「ソケットのキューにたまっている受信データを取り出している」にすぎない① NIC が MAC フレームを受信② ハードウェア割込み( IRQ: Interrupt ReQuest )によって,それま
で行われていた処理は一時的に中断し,ハードウェア割込みで指定された OS 内部のデバイスドライバへ処理を渡すために,受信したMAC フレームをバッファ( I/F 受信キュー)へ入れる
③ NIC デバイスドライバは, MAC フレームヘッダ・トレイラの除去と処理を行い,取り出した IP パケットをバッファ( IP 受信キュー)へ入れ,ソフトウェア割込みを発行(上位層の IP受信キューが一杯であれば, IPパケットを渡さずに破棄)
④ ソフトウェア割込みされた IP モジュールを起動し, IP ヘッダの除去と処理を行い,取り出した TCP セグメントをバッファ( TCP 受信キュー)へ入れ,上位層モジュールを呼び出す
⑤ 上位層モジュールが TCP ならば, TCP モジュールへ TCP セグメントを渡し, TCP ヘッダの除去と処理を行い,取り出したメッセージをバッファ(ソケット受信キュー)へ格納(アプリケーションがデータを受信可能に)
⑥ recv が実行されていれば, recv 処理を実行し,アプリケーションのバッファに受信メッセージがコピーされる. recv が実行されてなければ, recv 実行までバッファに格納されたまま残る(受信データが無ければプログラムは処理を停止しブロックされる)
12
バッファ管理とメモリコピー,ポインタ
• メモリ上のパケットをキューに出し入れする時は,メモリコピーの回数ができるだけ少なくなるように処理
• キューの出し入れにメモリコピーをすると,処理に時間がかかり,通信性能が低下
• ポインタによる参照でキューへの出し入れを実現
• ヘッダ処理は,ポインタによるリスト構造の追加・削除で実現– Linux: skbuff 構造体– BSD: mbuf 構造体
– ポインタとデータ長13
Raw IP とデータリンクアクセスI/F
• ソケット I/F では, IP パケットやMAC フレームを直接,送受信することも可能– raw ソケット, raw
IP とも呼ぶ– MacOS/FreeBSD
では, BPF ( BSD Packet Filter )を用いる
– ping コマンドで利用する ICMPエコー要求や,ルーティングプロトコルの OSPF 等で利用 14
多重化とバッファ①(キュー)
• クライアントから複数要求があっても,同時に処理できるのは1つだけ
• 到着順にキューに入れられて順番に処理
15
多重化とバッファ②(マルチプロセス)
• 処理要求を受け付ける度に子プロセスを生成し,応答処理を子プロセスに任せる( fork )
• 通常,1つの処理要求に対して1つのプロセスが処理担当
• 各プロセスはメモリ保護されて並列動作するため安定• ただし,一般的にプロセスの切り替えはスレッドの切り替えに比べて遅いため,プロセス切り替え(コンテキストスイッチ)が頻繁に起きる場合には処理性能が低下
16
多重化とバッファ③(マルチスレッド)
• 処理要求を受け付ける度にスレッドを生成し,応答処理をスレッドに任せる( pthread )
• スレッドは,1つのプロセスの中で並列実行する処理形態で,並列処理される部分はメモリ保護されないため,スレッドが1つでも異常動作すると,プロセス全体が誤動作する可能性がある
• スレッド切り替えはプロセス切り替えよりも短時間
17
多重化とバッファ④( select システムコー)ル
• 同一のプロセスやスレッドで,受信したメッセージを区別しながら処理
• それぞれの要求処理が無関係でなく,関係がある場合によく利用される–同一クライアントから複数のコネクションをサ
ーバと確立して,処理要求を送信する場合など
18
プログラムとプロトコル• プログラム=データ構造+アルゴリズム
• プロトコル=パケットの構造+動作の定義
– 1年生: TCP/IP ネットワークコンピューティング入門
• どんなブラックボックスがあるか一通り認識してもらう
– 2年生:コンピュータネットワーク講義• 各種講義でブラックボックスの中身を勉強していく
–3年生:ネットワークプログラミング演習• 実験系科目で中身をより深く体感してもらう 19
ARP の動作(要求)
20
ARP (Address Resolution Protocol)
Ethenet ブロードキャスト
アドレス
ARP パケット
ターゲットプロトコルアドレス
ターゲットハードウェアアドレス(不明:知りたい)
ARP の動作(応答)
21
ARP テーブルに書込み(数分間経過後に消去)
IP の動作
22
【ルーティングテーブルの書式】「 IPアドレス」 /「ネットワーク部のビット長」 「転送先」
宛先 IP アドレスの先頭ビットから「ネットワーク部のビット長」を取り出し,「 IP アドレス」に一致したら「転送先」へ送る
IP の動作
23
IP フラグメント• IP データグラムを複数のフレームへ分割
– フラグメント処理(リアセンブルは終点 でのみ)ノード• データリンク毎に送信可能な最大のフレームサ
イズが決まっているため– MTU: Maximum Transmission Unit– Ethernet は 1500 ,オクテット FDDI は 4352 ,オクテット IP
over ATM は 9180 ,オクテット PPPoE は 1492 オクテッ,ト Ethernet はジャンボフレーム 8000~ 15000 等オクテット
24
IP ヘッダのフォーマッ
ト
IP フラグメントの問題点• 途中ルータでフラグメント処理するのは問題
– ルータの負荷上昇– フラグメントされた IP データグラム喪失時の転送効率の低下(通常,リアセンブルのためにしばらくバッファにためられるが,その後は全て廃棄)
• 昨今主流の FTTH や ADSL 等で利用されるPPPoE の MTU は最大 1492 のため,一般オクテット的な Ethenet の 1500 では,オクテット IP データグラムのフラグメントが発生するか,経路 MTU探索が実行され通信性能が低下する場合がある– NTT東日本の場合, 1454 or 1448 が最適値らしい– 1 オクテット ≅ 8 ビット (=1 byte )– 実は 1byte が何 bit かは文脈に依存するため,通信分野ではオク
をよく使っているテット25
バイトオーダ• 2バイト以上の整数データをメモリに格納する時の順序( CPU に依存
)• ビッグエンディアン
– データの値の最上位ビットがアドレスの先頭(小さい番地)に来るよう格納
– Sun の SPARC ,稼働 CPU に関係なく Java仮想マシン• リトルエンディアン
– データの値の最上位ビットがアドレスの最後尾(大きい番地)に来るよう格納
– インテルの x86系など• ネットワークバイトオーダ
– ネットワーク中を流れるパケットでは,ビッグエンディアンと同じように,上位ビットを先頭に配置する順番
– htonl() で「 host のバイトオーダを network バイトオーダへ long型で変換」でき,コンピュータによらずコンパイラが正しく変換してくれる
26
バイトスワップ処理• ネットワークバイトオーダ(ビッグエンディアン)をリトルエ
ンディアンへ変換する(バイトスワップ)• ビットシフト演算によるバイトスワップ
– 「<<」(上位 bit (左)へシフト),「>>」(下位 bit (右)へシフト)
– 一般的に CPU は算術演算よりもシフト演算の方が高速(実は,コンパイラで最適化されてシフト演算に置き換えられているのだが)
• 左シフトで2で乗算,右シフトで2で除算した結果と同じになる• 2つのレジスタを用いたバイトスワップ
– 上位 bit と下位 bit を入れ替えて,別のレジスタへデータ転送
27
元の 16bit長 をデータ右に 8bit 分 したシフト
データ元の 16bit長 をデータ左に 8bit 分 したシフト
データ論理和をとれば
バイトスワップ完了
2 つの を用レジスタいて上位 8bit と下位 8bit を入れ
替え可能バイトスワップ
UDP ( User Datagram Protocol )• 途中でデータ欠損しても問題の少ない通信でよく利用
– VoIP ( Voice over IP ),ビデオストリーミング• TCP に比べ圧倒的に処理が軽い
– IP の機能をほとんどそのまま利用– TCP が提供するような機能を自前で用意するアプリケー
ションでは, UDP を使う方が無駄を省ける
28
UDP ヘッダのフォーマット
struct udphdr {u_short uh_sport; /* source port */u_short uh_dport; /* destination port */u_short uh_ulen; /* udp length */u_short uh_sum; /* udp checksum */
}
UDP ヘッダの構造体
TCP ( Transmission Control Protocol )
• 信頼性の提供– 3-way handshake– シーケンス番号と Ack– チェックサム
• ウィンドウフロー制御– 送信 ,受信バッファ バッファ
29
struct tcphdr {u_short th_sport; /* source port */u_short th_dport; /* destination port */u_short th_seq; /* sequence number */u_short th_ack; /* acknowledgement number */
# if BYTE_ORDER == LITTLE_ENDIANu_int th_x2:4, /* (unused) */
th_off:4; /* data offset */ #endif#if BYTE_ORDER == BIG_ENDIAN
u_int th_off:4, /* data offset */th_x2:4; /* (unused) */ #endif
u_char th_flags;u_short th_win; /* window */u_short th_sum; /* checksum */u_short th_urp; /* urgent pointer */ };
TCP ヘッダのフォーマット
TCP ヘッダの構造体
TCP のコネクション確立
30
TCP のコネクション切断
31
参考書
32
などなど