Simple Blue

ネットワークプログラミング
(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