ネットワークプログラミング (CS-B3 選択必修) 峰野博史 [email protected] 1 参考書 などなど 2 ネットワークOS • ネットワーク機器などを制御する機能を備えたOS – 最近のPC向けOSは全てネットワークOS機能を搭載 • 様々な部品(モジュール)が階層的に組み合わされ てネットワークシステムを構築 – 特定の機能や役割を担う機能ブロックのことで,通常は 他のモジュールと取り換え可能 3 ネットワークソフトウェアの概要 OS内部のネットワークソフトウェア • トランスポートモジュール – TCP/UDPの機能を実現し,始点ホストと終点ホストの内部で動作 • 最近は,ほぼ全てのルータに搭載されている • インターネットモジュール – IPの機能を実現し,経路上の全てのルータ内部で動作 • デバイスドライバ – NICを制御し,パケットの送信処理,パケットの受信処理 4 プロトコルスタックとパケットの処理 5 FCS (Frame Check Sequence) 通信開始時のアドレス変換処理① • • • • アプリケーションレベル: ホスト名 トランスポートレベル: ポート番号 IPレベル: IPアドレス 2.サービス名からポート番号を調べる Ethernetレベル: MACアドレス 1.ホスト名からIPアドレスを調べる 6 通信開始時のアドレス変換処理② • IPアドレスから,次に送るべきホストやルータを決定 > route PRINT • IPアドレスから,MACアドレスを調べる > arp -a ARP (Address Resolution Protocol) 7 詳細 TCB (Transmission Control Block) ARP (Address Resolution Protocol) FCS (Frame Check Sequence) 8 クライアントサーバモデル • クライアント: 処理を要求するプログラム • サーバ: 要求を受けて処理するプログラム MTA (Mail Transfer Agent), Web Proxy Server など 9 ソケットを用いたシステムコールと内部処理 • ソケット – アプリケーションとトランスポートモジ ュールとのインタフェース – 関数呼び出しのような形でシステム コールを呼び出しメッセージ送受信 • アプリケーション – ユーザモードで動作 – 資源へのアクセスは制限され,許可 外にアクセスすると”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の動作(要求) Ethenetブロードキャスト アドレス ARPパケット ターゲットハードウェアアドレス(不明:知りたい) 20 ARP (Address Resolution Protocol) ターゲットプロトコルアドレス ARPの動作(応答) ARPテーブルに書込み (数分間経過後に消去) 21 IPの動作 【ルーティングテーブルの書式】 「IPアドレス」/「ネットワーク部のビット長」 「転送先」 宛先IPアドレスの先頭ビットから「ネットワーク部のビット長」 を取り出し,「IPアドレス」に一致したら「転送先」へ送る 22 IPの動作 23 IPフラグメント • IPデータグラムを複数のフレームへ分割 – フラグメント処理(リアセンブルは終点ノードでのみ) • データリンク毎に送信可能な最大のフレームサイズ が決まっているため – MTU: Maximum Transmission Unit – Ethernetは1500オクテット,FDDIは4352オクテット,IP over ATMは9180オクテット,PPPoEは1492オクテット,Ethernetジ ャンボフレームは8000~15000オクテット等 IPヘッダの フォーマット 24 IPフラグメントの問題点 • 途中ルータでフラグメント処理するのは問題 – ルータの負荷上昇 – フラグメントされたIPデータグラム喪失時の転送効率の 低下(通常,リアセンブルのためにしばらくバッファにため られるが,その後は全て廃棄) • 昨今主流のFTTHやADSL等で利用されるPPPoE のMTUは最大1492オクテットのため,一般的な Ethenetの1500オクテットでは,IPデータグラムのフラ グメントが発生するか,経路MTU探索が実行され通 信性能が低下する場合がある – NTT東日本の場合,1454 or 1448 が最適値らしい – 1オクテット ≅ 8ビット (=1byte) – 実は1byteが何bitかは文脈に依存するため,通信分野ではオクテット をよく使っている 25 バイトオーダ • 2バイト以上の整数データをメモリに格納する時の順序(CPUに依存) • ビッグエンディアン – データの値の最上位ビットがアドレスの先頭(小さい番地)に来るよう格納 – SunのSPARC,稼働CPUに関係なくJava仮想マシン • リトルエンディアン – データの値の最上位ビットがアドレスの最後尾(大きい番地)に来るよう格納 – インテルのx86系など • ネットワークバイトオーダ – ネットワーク中を流れるパケットでは,ビッグエンディアンと同じように,上位 ビットを先頭に配置する順番 – htonl()で「hostのバイトオーダをnetworkバイトオーダへlong型で変換」でき ,コンピュータによらずコンパイラが正しく変換してくれる 26 バイトスワップ処理 • ネットワークバイトオーダ(ビッグエンディアン)をリトルエンディ アンへ変換する(バイトスワップ) • ビットシフト演算によるバイトスワップ – 「<<」(上位bit(左)へシフト),「>>」(下位bit(右)へシフト) – 一般的にCPUは算術演算よりもシフト演算の方が高速(実は,コン パイラで最適化されてシフト演算に置き換えられているのだが) • 左シフトで2で乗算,右シフトで2で除算した結果と同じになる • 2つのレジスタを用いたバイトスワップ – 上位bitと下位bitを入れ替えて,別のレジスタへデータ転送 元の16bit長データを右 に8bit分シフトしたデータ 元の16bit長データを左 に8bit分シフトしたデータ 論理和をとれば バイトスワップ完了 2つのレジスタを用 いて上位8bitと下 位8bitを入れ替え27 バイトスワップ可能 UDP(User Datagram Protocol) • 途中でデータ欠損しても問題の少ない通信でよく利用 – VoIP(Voice over IP),ビデオストリーミング • TCPに比べ圧倒的に処理が軽い – IPの機能をほとんどそのまま利用 – TCPが提供するような機能を自前で用意するアプリケーショ ンでは,UDPを使う方が無駄を省ける UDPヘッダの フォーマット struct udphdr { u_short UDPヘッダの u_short 構造体 u_short u_short } uh_sport; uh_dport; uh_ulen; uh_sum; /* source port */ /* destination port */ /* udp length */ /* udp checksum */ 28 TCP(Transmission Control Protocol) • 信頼性の提供 – 3-way handshake – シーケンス番号とAck – チェックサム • ウィンドウフロー制御 – 送信バッファ,受信バッファ struct tcphdr { u_short th_sport; TCPヘッダの u_short th_dport; u_short th_seq; 構造体 u_short th_ack; # if BYTE_ORDER == LITTLE_ENDIAN u_int th_x2:4, th_off:4; #if BYTE_ORDER == BIG_ENDIAN u_int th_off:4, th_x2:4; u_char th_flags; u_short th_win; u_short th_sum; u_short th_urp; TCPヘッダの /* source port */ /* destination port */ フォーマット /* sequence number */ /* acknowledgement number */ /* (unused) */ /* data offset */ #endif /* data offset */ /* (unused) */ #endif /* window */ /* checksum */ /* urgent pointer */ 29 }; TCPのコネクション確立 30 TCPのコネクション切断 31 参考書 などなど 32
© Copyright 2024 ExpyDoc