第 7 章 トランスポート層(TCP と UDP) 7.1 トランスポート層の機能 トランスポート層の主な機能は以下の 3 点である。 1. 上位層データのセグメントによるカプセル化とアンカプセル化 2. プロセス間通信の実現 3. 高信頼性通信のサポート トランスポート層では,上位層データをセグメントでカプセル化・アンカプセル化する ことにより,ネットワーク上の通信機器(ノード)内のプロセス(プログラム)とのプロ セス間通信を実現する。 ネットワーク層の機能を使用すると他のネットワーク上の通信機器(ノード)とのデー タ(パケット)交換が可能となるが,この層の機能を使用することにより,始めてノード 内のプロセス(プログラム)との直接的なデータ交換が可能となる。 さらに,トランスポート層では,このプロセス間通信をより信頼性の高いものにするた めの様々な機能もサポートしている。 TCP/IP プロトコルのトランスポート層のプロトコルは TCP(Transmission Control Protocol)と UDP(User Datagram Protocol)である。TCP と UDP は非常に対照的なプロト コルで,UDP はトランスポート層のプロトコルであるにもかかわらず,高信頼性通信の機能 を全くサポートしない。逆に TCP は高信頼性のプロトコルであり,現在では信頼性が高す ぎて「重いプロトコル」であるとさえ言われている。 TCP/IP は 1982 年には既に,現在使用されているものとほぼ同機能のものが完成しており (Version4) ,非常に古いプロトコル(ソフトウェア)であると言える。TCP/IP の IP 部分 は現在,次期バージョンである IPv6 への移行が進められているが,TCP と UDP に関する根 本的な改良は殆ど進められていないのが現状である。 また,TCP/IP にはセッション層とプレゼンテーション層の上位層が存在しないため,TCP および UDP ではアプリケーションデータがセグメントにより直接カプセル化される。 7.2 TCP(Transmission Control Protocol) TCP はコネクション指向のストリーム型通信を行うプロトコルである。つまり,通信を行 う際にはプロセス間に仮想的な通信路が形成され,その通信路を介してコネクションが張 られる。TCP による通信は,よく電話に例えられ,絶えず相手との確認を取りながら通信が 行われる。 TCP では,高信頼性通信を実現するために,以下の機能がサポートされている。 1. 確認応答によるセグメントの再送処理 2. ウィンドウサイズによるフロー制御 3. シーケンス制御 4. エラー検査 7.2.1 TCP におけるコネクションの確立 TCP では 3 方向ハンドシェイク(Three Way Handshake)と呼ばれる方法により,相手と のコネクションを確立する。3 方向ハンドシェイクの手順を以下に示す(図 7.2.1) 。なお, 下記説明文中のコードビットとは TCP セグメントの種類を示す 6bit のフラグで,それぞれ のビットは URG(緊急データ),ACK(確認応答),PSH(直にアプリケーションへデータを渡 すことを要求),RST(コネクションのリセット),SYN(問い合わせ),FIN(コネクション の終了)を表している。 3 方向ハンドシェイクの手順 1. 接続側から被接続側に,コードビットの SYN フラグが ON になったセグメントを送信す る。(例えば,電話の「もしもし。XXさんのお宅ですか?」に相当) 2. 被接続側から接続側に,コードビットの SYN フラグと ACK フラグが ON になったセグメ ントを返信する。(例えば,電話の「はい。どちら様ですか?」に相当) 3. 接続側から被接続側に,SYN セグメントに対する返答である ACK セグメントを送信する。 (例えば,電話の「はい。私はXXと申します。 」に相当) 以上の計 3 回のやりとり(3 方向ハンドシェイク)によりコネクションが確立する。また これらの通信中に,以降の通信で使用する 最大セグメント長(MSS: Maximum Segment Size), 初期シーケンス番号,初期ウィンドウサイズが決められる。最大セグメント長とは,一つ のセグメント内に格納可能な,アプリケーションデータの最大長のことである(シーケン ス番号,ウィンドウサイズについては後述)。 被接続(サーバ)側 接続(クライアント)側 CLOSE SYN_SENT LISTEN ① SYN ② SYN + ACK SYN_RCVD PiggyBack ESTABLISHED ③ ACK ESTABLISHED 図 7.2.1 3 方向ハンドシェイク 図 7.2.1 の PiggyBack(ピギーバック)とは,他の通信データ(セグメント)に確認応答 (ACK)の信号を相乗りさせて返す手法である。この場合は,問い合わせ(SYN)用のセグ メントに,一つ前の SYN の対する確認応答(ACK)を相乗りさせて,一つのセグメントとし て送信している。TCP は重いプロトコルなので,なるべく通信量を減らすためにこのような 手法が用いられる。 また図中の CLOSE や LISTEN などの英字は TCP の状態変化を示している(TCP の状態遷移 については,図 7.2.13 を参照) 。 7.2.2 TCP におけるコネクションの終了 【中級】 コネクションの一般的な終了は以下の手順で行なわれる(図 7.2.2) 。なお,切断のリク エストを発信した切断側の処理をアクティブクローズと呼び,リクエストを受けた被切断 側の処理をパッシブクローズと呼ぶ。 一般的なコネクションの終了手順 1. 切断側から被切断側に,コードビットの FIN フラグが ON になったセグメントを送信す る。 2. 被切断側から切断側に,FIN セグメントへの返答である,コードビットの ACK フラグが ON になったセグメントを返信する。もしこの時,被切断側に未送信のデータが残ってい れば,引き続き切断側に残りのデータが送信される。このときの切断側の状態をハーフ クローズ状態(FIN_WAIT_2 状態)と呼ぶ。ハーフクローズ状態とは,データの送信は終 了しているが,受信は可能な状態のことである。 3. 被切断側から切断側に,コードビットの FIN フラグが ON になったセグメントを送信す る。もし 2 で被切断側に未送信のデータがなければ,PiggyBack により,2 の最初の ACK と合わせて FIN + ACK のセグメントを送信してもよい。この場合,切断側はハーフクロ ーズ状態(FIN_WAIT_2 状態)になることはない。 4. 切断側から被切断側に,FIN 対する ACK の返答セグメントを返す。ただし,この ACK セグ メントが被切断側に届かない場合を考慮し,切断側は最大セグメント寿命(MSL:Maximum Segment Lifetime:セグメントを送信するのに必要な最大時間)の 2 倍の時間だけ,3 における被切断側からの FIN セグメントの(あるかどうか分らない)再送を待つ (TIME_WAIT 状態) 。なお,TCP のソケットオプションにより,この待ち時間を 0 にする ことも可能である(推奨はされない)。 5. 切断側は,被切断側からの FIN セグメントの再送待ちがタイムアウトすれば,そのまま コネクションを切断する。FIN セグメントの再送があれば,ACK の返答セグメントを返 して,再び,FIN セグメントの再送を 2MSL だけ待つ(TIME_WAIT 状態)。 6. 最後の ACK セグメントが被切断側に届けば,被切断側はコネクションを切断する。 被切断側 切断側 ESTABLISHED ESTABLISHED アクティブクローズ ① FIN FIN_WAIT_1 パッシブクローズ CLOSE_WAIT ② ACK 残Data の送信 FIN_WAIT_2 残Data ハーフクローズ状態 残Dataに対するACK 切断処理 ③ FIN LAST_ACK ④ ACK TIME_WAIT ⑤ FIN 2MSL ⑥ ACK CLOSE CLOSE 図 7.2.2 一般的な TCP コネクションの終了 コネクションの終了において,特別な場合として,通信を行っている両者が(ほぼ)同 時にクローズ処理を行う(FIN セグメントを送信する)場合がある (同時クローズ。図 7.3.3)。 この場合は,お互いに CLOSING 状態と呼ばれる状態に移行した後,相手の ACK セグメン トの受信により TIME_WAIT 状態(相手の再送を 2MSL だけ待つ状態)に遷移し,タイムアウ トにより通信をクローズする。 切断側 切断側 ESTABLISHED ESTABLISHED アクティブクローズ FIN_WAIT_1 CLOSING ① FIN ② ACK ① FIN ② ACK TIME_WAIT アクティブクローズ FIN_WAIT_1 CLOSING TIME_WAIT 2MSL 2MSL CLOSE CLOSE 図 7.2.3 TCP の同時クローズ 7.2.3 ウィンドウ制御による通信の効率化とフロー制御 【中級】 TCPでは,送信したデータセグメントについては,ACKセグメントによる確認応答を期待 する。ACKセグメントによる確認応答では,受信側が次に期待するデータのバイト番号(何 バイト目から送信して欲しいか)を指定する確認応答番号が送信側に伝えられる。 送信側では,データセグメントを送信後,再送タイムアウト(RTO: Retransmission Time Out)の時間内に確認応答が返って来なければ,データセグメントの再送を行う。ただし, この確認動作を1セグメント毎に行っていたのでは,通信効率が非常に悪くなってしまう (図7.2.4) 。 そこで,確認応答を待たずに処理可能なデータのサイズを決めて,先送りでデータを転 送してしまう手法が用いられる(図 7.2.5) 。これはウィンドウ制御と呼ばれ,確認応答を 待たずに処理可能なデータのサイズをウィンドウサイズ(バイト単位)と呼ぶ。ウィンド ウ制御によって,一度に転送できる最大セグメント数は ウィンドウサイズ / 最大セグメント長(MSS) となる。 受信側 送信側 データ①を送信 データ①のACK, データ②の要求 データ②を送信 再送タイム アウト(RTO) × データ②を再送信 データ②のACK, データ③の要求 図 7.2.4 確認応答とデータの再送 図 7.2.5 では,一度に転送できるセグメント数は 5 であり,送信側が①~⑤のセグメン トを送信後に,③に対する転送要求(②に対する ACK)を受信した段階で,⑥,⑦のセグメ ントが送信可能になる。この時のウィンドウの様子を図 7.2.6 に示す。 ウィンドウ制御におけるウィンドウは送信バッファに付けられた処理用の窓のようなも のである。送信バッファ内のデータはこのウィンドウ(窓)を通して操作される。送信側 は,転送要求の ACK を受信する度にウィンドウを右方向に移動(スライド)させ,それに 従って新たなデータが次々に送信可能となる。このようにして,ウィンドウをスライドさ せる手法をスライディングウィンドウと呼ぶ(図 7.2.5)。 ウィンドウがスライドした直後の状態では,ウィンドウに対応する送信バッファ中のデ ータは,「送信済みであるが ACK を未受信」か「送信可能」の何れかになる。また,ウィン ドウの左端は,必ず直近に受信側から要求されたセグメントが対応する。 また,ウィンドウ制御では,ウィンドウサイズを動的に変化させることにより,TCP によ るフロー制御を実現することができる。 例えば,送信側からのデータ転送のスピードを遅くしたい場合には,ウィンドウサイズ を小さくして送信側に通知すればよい。またウィンドウサイズを 0 にして送信側に通知す れば,送信側からのデータ転送を中断させる事が可能である。 送信側 ⑤を送信後に,②の ACK( ③の要求 )を 受信した時点で,⑥ ⑦が送信可能になる 受信側 ①を送信 ②を送信 ③を送信 ④を送信 ⑤を送信 ①のACK,②の要求 ②のACK,③の要求 ③のACK,④の要求 ④のACK,⑤の要求 ⑤のACK,⑥の要求 ⑥を送信 ⑦を送信 ⑧を送信 ⑨を送信 ⑩を送信 ⑥のACK,⑦の要求 ⑦のACK,⑧の要求 ⑧のACK,⑨の要求 ⑨のACK,⑩の要求 ⑩のACK,⑪の要求 図 7.2.5 ウィンドウ制御下でのデータ転送 直近の要求(確 認応答番号が指 す)セグメント データ ウィンドウの位置と重なる バッファのデータは,ACK 未受信か送信可能な状態に ある ウィンドウ ウィンドウサイズ 送信バッファ ① ACK を 受 信 す る 度 に右方向へスライ ドさせる ② ACK受信済み ③ ④ ⑤ ACK未受信 ⑥ ⑦ ⑧ 送信可能 ⑨ ⑩ 送信不可 図 7.2.6 ウィンドウ(前図で②の ACK を受信した直後の状態) 7.2.4 TCP の確認応答と不着処置 【中級】 送信側からデータが送信された後に,受信側からの ACK セグメントが送信側に到着しな い原因としては,1) 受信側からの ACK セグメントが途中で欠落(ロス)した場合と,そも そも 2)送信側からのデータが受信側に届いていない場合が考えられる。 1) 受信側からの ACK セグメントが送信側に届かない場合 TCP のウィンドウ制御では,受信側からの任意の ACK セグメントが送信側に届かなくとも, その後のいずれかの ACK セグメントが送信側に届けば,特に問題は発生しない(ただし通 信の効率は落ちる。図 7.2.7)。これは直近に受信した ACK の確認応答番号によりウィンド ウがスライドするためである(図 7.2.8)。 簡単に言えば,ウィンドウ制御では,送信側が任意の送信データに対する ACK セグメン トを受信した場合には,それ以前の送信データも全て正しく受信側に受信されたと認識さ れるのである。 ただし,最終データの送信の場合は,その ACK が送信側に届かなければ,送信側では再 送タイムアウト後にデータの再送が行われる。受信側では同じものを複数受信することに なるが,重複したデータは破棄される。 受信側 送信側 ①を送信 ②を送信 ③を送信 ④を送信 ⑤を送信 ④のACK(⑤の要求) を受信した時点で,⑧ ⑨が送信可能となる ①のACK,②の要求 ②のACK,③の要求 ③のACK,④の要求 ④のACK,⑤の要求 ⑤のACK,⑥の要求 × ⑥を送信 ⑦を送信 ⑧を送信 ⑨を送信 × ⑦のACK(⑧の要求) を受信した時点で, ⑩~⑫が送信可能と なる ⑥のACK,⑦の要求 ⑦のACK,⑧の要求 × 図 7.2.7 ACK が不着の場合 直近の要求(確認 応答番号が指す) セグメントデータ ウィンドウ 送信バッファ ① ② ACK受信済み ACK未受信 ③ ④ ACK受信済み ⑤ ⑥ ACK未受信 ⑦ ⑧ ⑨ 送信可能 ⑩ 送信不可 図 7.2.8 前図で④の ACK を受信した状態でのウィンドウ 2) 送信側からのデータセグメントが受信側に届かない場合 送信側からのデータセグメントが受信側にと届かない場合,受信側は送信側に,ACK セグ メントの確認応答番号を使用して,届かなかったセグメントの送信(再送)を届くまで繰 り返し要求する。 送信側では,任意のデータセグメントについて,受信側から連続して 3 回の送信要求を 受信した時点でデータの再送を行う(図 7.2.9) 。受信側では,再送要求を出したデータセ グメントを受信した場合,(シーケンス制御により)既に受信を完了しているデータに統合 し,次のデータの要求を載せた ACK セグメントを返す。 図 7.2.9, 図 7.2.10 では,送信側に⑦の要求を含んだ ACK セグメントが返ることによっ て,ウィンドウのスライディングが発生し,⑦~⑪までのセグメントが送信可能に変化し ている。 受信側 送信側 ①を送信 ②を送信 ③を送信 ④を送信 ⑤を送信 ②の要求を3回受 信したので,②を 再送する × ①のACK,②を要求 ⑥を送信 ③のACK,②の要求 ④のACK,②の要求 ⑤のACK,②の要求 ②を再送 ⑥のACK,②の要求 ⑦の要求を受信した 時点で,⑦~⑪が送 信可能となる ②のACK,⑦の要求 ⑦を送信 ⑧を送信 ⑨を送信 ⑩を送信 ⑪を送信 図 7.2.9 送信データが不着の場合 ACK受信済 み ① ACK未受信 ② ACK受信済み ③ ④ ACK未受信 ⑤ ⑥ 送信可能 ⑦ ⑧ ⑨ ⑩ ⑪ 前図で②を再送した時点でのウィンドウ 前図で⑦の要求を受信した時点でのウィンドウ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ 送信可能 ACK受信済み 図 7.2.10 前図におけるスライディングウィンドウ TCP の確認応答は非常に厳密な処理であるが,これは開発当時のネットワークの回線状態 が現在のよりも非常に悪く,ノイズによる誤りが発生し易いものであったためである。現 在のネットワーク回線の品質を考えれば,TCP の確認応答処理は厳密すぎる(オーバースペ ックである)と言われている。 7.2.5 シーケンス制御とエラー処理 TCP 通信においては,図 7.2.9 に見られるように,セグメントの順番が前後して受信側に 届く場合がある。この場合,受信側ではシーケンス番号を元に,データの並べ替えを行う。 この並べ替えの機能をシーケンス制御と呼ぶ。 なお,シーケンス番号とは TCP のコネクションを維持するためのセグメントの順序番号 のことであるが,その一部に転送データ全体に対するそれぞれのセグメントデータのバイ ト位置を示す情報が含まれている。シーケンス制御ではこの情報を利用してセグメントデ ータの並び替えを行う。 また,TCP では TCP チェックサムと呼ばれる独自のエラーチェックが行われる。TCP チェ ックサムは通常のチェックサムではなく,CRC とも違う独自のものである。 もし,TCP チェックサムによりエラーが検出された場合には, (そのデータは受信側に届 かなかったのと同等であるので)7.2.4 節の「2) 送信側からのデータセグメントが受信側に届 かない場合」と同じ手法により,データの再送処理が行われる。 7.2.6 シーケンス番号によるコネクションの制御 【中級】 TCP 通信では,通信相手との間にコネクションを張ってストリーム型の双方向通信を行う。 しかしながら,通信相手とのコネクションは仮想的なものであり,電話回線のように物理 的な接続回線が存在するわけではない。 仮想的なコネクションを維持するために,TCP では前節のシーケンス番号と確認応答番号 を使用する。TCP では,セグメントをやり取りする際に,シーケンス番号と確認応答番号を 順次増加させて行き,一連のシーケンス番号と確認応答番号を持つセグメントを同じコネ クションとして認識する(図 7.2.11) 。 シーケンス番号は受信側の受信済みデータの分だけ増加する(受信済みデータ量は ACK の確認応答番号より知る)ので,前節のようにセグメントを正しく並べ替える際にも利用 される。 簡単に言えば,シーケンス番号は送信するデータのバイト番号(+自分の初期シーケンス 番号)であり,確認応答番号は次に送信して欲しいデータのバイト番号(+相手の初期シー ケンス番号)である。 即ち,(データ通信中では,)自分が送信したセグメントの確認応答番号と,相手から送 られてきたセグメントのシーケンス番号が一致することにより,コネクションが維持され る(図 7.2.11)。 被接続(サーバ)側 接続(クライアント)側 CLOSE SEQ: 80000 SYN_SENT LISTEN SYN 初期シーケンス 番号 SYN + ACK SEQ: 80001 ACK: 60001 初期シーケンス 番号 SEQ: 60000 ACK: 80001 SYN_RCVD ACK ESTABLISHED ESTABLISHED SEQ: 80001 ACK: 60001 Request 300Byte送信 SEQ: 60001 ACK: 80301 ACK Response SEQ: 80301 ACK: 61001 SEQ: 60001 ACK: 80301 1000Byte送信 ACK SEQ: 80301 ACK: 61001 Request 400Byte送信 ACK ……… SEQ: シーケンス番号 ACK: 確認応答番号 SEQ: 61001 ACK: 80701 図 7.2.11 シーケンス番号,確認応答番号の推移 TCP のコネクションはシーケンス番号(と確認応答番号)により維持される。従って,も し第 3 者がシーケンス番号を予測することが可能であるなら,TCP のコネクションはこの第 3 者に乗っ取られてしまう可能性がある。TCP のシーケンス番号を予測して,コネクション を乗っ取る攻撃法を TCP シーケンス番号予測攻撃と呼ぶ。 短い時間内に接続を繰り返すような TCP 通信を行っている場合,通信中のネットワーク 盗聴により,シーケンス番号を予測することは一般には困難である(TCP のコネクションが 十分長い時間維持されるような場合には,予測および攻撃は可能) 。しかしながら,初期シ ーケンスの生成パターンを予測することができれば,以降の通信でのシーケンス番号を予 測することは比較的容易となる。 従って,現在の TCP の実装では,初期シーケンス番号の生成アルゴリズムとして,容易 に推測することが困難なアルゴリズムが使用されている。 7.2.7 TCP セグメントの構造 【中級】 TCP/IP での TCP セグメントの構造を以下に示す。 ( ) 内は該当データのビット長。 送信元ポート番号(16) 宛先ポート番号(16) シーケンス番号(32) 確認応答番号(32) ヘッダ長(4) 予約(6) コードビット(6) TCP チェックサム(16) ウィンドウサイズ(16) 緊急ポインタ(16) ヘッダオプション(可変長) アプリケーションデータ(可変長) シーケンス番号:転送するデータの順序番号。 確認応答番号:受信側が次に期待するデータのバイト番号(何バイト目から送って欲しいか 指定する) ヘッダ長:ヘッダの長さ(4O バイト単位) 。ヘッダオプションがない場合は 5(200Byte) 。 予約:将来のための予約領域。通常は 0。 コードビット:セグメントのタイプ(USG, ACK, PSH, RST, SYN, FIN)を示すフラグ。 ウィンドウサイズ:一度に受信可能なウィンドウのサイズ(バイト単位)。 TCP チェックサム:TCP セグメント全体のチェックサム(特殊な計算方法によるチェックサム。 CRC ではない) 緊急ポインタ:緊急データ(URG)を処理中の場合,緊急データの終わりを表す。 ヘッダオプション:最大セグメント長(MSS)の通知に使用される。長さは最大 40 バイト. アプリケーションデータ:アプリケーションが使用するデータ。 図 7.2.12 TCP セグメントの構造 7.2.8 TCP State Diagram 【中級】 以下に TCP の状態遷移の図を示す。TCP では,SYN,ACK,FIN のコードビットが設定された セグメントの送受信により,図のように状態が変化する。 Active Open, or send SYN CLOSED Close Close received SYN, send SYN + ACK Passive Open send SYN LISTEN received SYN, send ACK SYN_RCVD received ACK of SYN SYN_SENT received SYN+ACK, send ACK ESTABLISHED send FIN send FIN FIN_WAIT_1 received FIN, send ACK received FIN, send ACK received FIN+ACK, send ACK received ACK of FIN FIN_WAIT_2 received FIN, send ACK CLOSE_WAIT CLOSING received ACK of FIN send FIN LAST_ACK TIME_WAIT Passive Close Active Close CLOSED 2SML time out received ACK of FIN 図 7.2.13 TCP の状態遷移図 7.3 UDP(User Datagram Protocol) 7.3.1 UDP のコネクションレス指向通信 UDP は TCP と違い,コネクションレス指向のデータグラム型通信のプロトコルである。そ のため UDP での通信はコネクションを張らず,それぞれの通信は1回限りの送信または受 信のみで終了する。 信頼性の全く無い,ベストエフォート型(最大努力型:努力はするが,結果は保証でき ないということ)で,相手がセグメントを受信したかどうかの確認は一切行われない。無 論エラー検査も行われない。UDP の通信は,しばしば手紙に例えられ,ポストへの投函以降, 手紙の配達状況を全く知ることができない状況に良く似ている。 しかしながら,TCP のように一々確認応答を行わないので,単純で動作が軽く,高速に大 量のデータを転送することが可能である。その特性のため,データの品質より速度が優先 されるような状況で使用される。 例えば音声や動画データの通信では,大量のデータを高速に転送する必要があるが,途 中でデータが少しばかり欠落(ロス)しても,相手が人間であれば十分に理解可能である ので,信頼性はあまり問題にならない場合が多い。 UDP を使用する代表的なプロトコルとしては,インターネット上の最も重要なシステムで ある DNS(Domain Name System)やセッション管理用の SIP(Session Initiation Protocol), 音声や映像をストリーミング再生するための RIP(Real-time Transport Protocol)などが ある(詳細については「第 8 章 ネットワーク上のアプリケーション」の章を参照) 。 7.3.2 UDP セグメントの構造 【中級】 TCP/IP での UDP セグメントの構造を以下に示す。TCP セグメントに比べてかなり単純な 構造となっている。 ( )内は該当データのビット長 送信元ポート番号(16) 宛先ポート番号(16) UDP データ長(16) UDP チェックサム(16) アプリケーションデータ(UDP データ:可変長) UDP データ長:アプリケーションデータのデータ長 (バイト単位)。 UDP チェックサム:UDP セグメント全体のチェックサム(特殊な計算方法によるチェックサム。 CRC ではない) アプリケーションデータ:アプリケーションが使用するデータ。 図 7.3.1 UDP セグメントの構造 7.4 ポート番号 7.4.1 ポート番号によるプロセスの識別 TCP や UDP でプロセス間通信を行う場合,相手のプロセス(接続しようとするプロセス) はポート番号と呼ばれる番号(0~65535:16bit の符号なし整数)で識別される。ポート番 号のイメージとしては,ノード内のプロセスはそれぞれポートと呼ばれる通信データ用の 入出力口に繋がっており,そのポートを介して通信が行われるような状況を思い浮かべれ ば良い(図 7.4.1).この場合,それぞれのポートには識別用の番号が割り振られており, それがポート番号である。 また,TCP と UDP では別々のポートが使用されるため,同じ番号のポートを TCP と UDP で 同時に使用することも可能である。 なお,ここでのポートは論理的な通信データの入出力口であり,スイッチングハブなど の物理的な通信ポートとは全く別物である。 プロセス空間 プロセス空間 ポート 図 7.4.1 ポートを介したプロセス間通信のイメージ あるノード内の任意のプロセスは IP アドレスとポート番号が分れば,ネットワーク上で 一意的に識別する事が可能となる。特定のプロセスを指定するのに,IP アドレスとポート 番号を:(コロン)で繋げて,IP アドレス:ポート番号 の形で指定する場合もある。例え ば,IP アドレス 202.26.158.1 のノード上で 80 番のポート番号を持つプロセスは 202.26.158.1:80 と表される。 なお,特定のプロセスとの通信は,そのプロセス専用の通信プロトコルを使用して行わ れるので,プロセスとプロトコルを同一視して,ポート番号をプロトコルを表す番号とし て用いる場合も多い。 7.4.2 ポート番号の割り当て ポート番号と実際のプロセスとの対応付けはノード管理者の責任であるが,勝手に対応 付けを行うと他のマシンから接続できない状況が発生するので,特別な場合を除いては標 準的な番号が割り振られる。 特にポート番号が 1023 番以下のポートは ウェルノンポート(well known port)と呼ば れ,代表的なサーバプロセスがそれらのポートを使用することになっている(例えば WEB サーバは 80 番,メールサーバは 25 番など)。なお,ウェルノンポートに割り当てられるポ ート番号の管理は,ICANN の IANA によって行われている。 (IACNN,IANA については「5.2 IP アドレス」の注釈を参照) ポート番号の 1024~49151 番は,各ソフトウェアベンダーが自社のソフトウェア用に INANA(ICANN)に申請したもので,登録ポート(Registered Port)と呼ばれる。 また,それ以上の 49152~65535 番のポートは,ダイナミック/プライベートポートと呼 ばれている。ダイナミックポートはエフェメラルポート(Ephemeral Port:短命ポート) とも呼ばれ,システムが使用するポートであり,クライアント(接続)側などで,特にポ ート番号を明示的に指定しないでポートをオープンした場合などに,この範囲のポート番 号が自動的に割り振られる(次節参照) 。プライベートポートのポート番号は,一般のユー ザが自由に使用しても良いポート番号である。 INANA(ICANN)の http://www.iana.org/assignments/port-numbers には INANA(ICANN) が管理するウェルノンポートおよび登録ポートの一覧が記載されている。また,Linux や Unix では, /etc/services と言うファイルにも,主なプロセスとそのポート番号の対応が 記述されている。 表 7.4.2 に代表的なプロセス(プロトコル)とその標準的なポート番号を示す。 ポート番号 プロトコル 説 明 20 FTP-data 21 FTP ファイル転送用プロセスのコントロール 22 SSH 暗号化されたリモートシステムへの接続 23 TELNET 25 SMTP メールサーバ 53 DNS ドメインネームシステム 80 HTTP WWW サーバ 110 POP3 メールの受信 443 HTTPS 暗号化された WWW サーバ ファイル転送用プロセスでのデータの送受信 リモートシステムへの接続 表 7.4.2 代表的なプロセス(プロトコル)のポート番号 7.4.3 クライアント・サーバ(C/S)モデルでのポート番号 サーバプロセスは,ネットワーク上でサービスを提供するプログラムであり,クライア ントプロセスは,サーバプロセスからのサービスを利用するプログラムである.一般的に, この通信体系を クライアント・サーバ(C/S)モデルと呼ぶ。 ネットワーク上のサーバプロセスは,その起動時に,明示的に指定された番号を持った ポートを開いて,クライアントプロセスからの接続を待ち受ける(例えば WEB サーバなら ば 80 番) 。従って,クライアントプロセスがサーバプロセスに接続するためには,ノード (サーバ)の IP アドレス注)とプロセスのポート番号が予め必要となる。 (以後,サーバプ ロセスをサーバ,クライアントプロセスをクライアントと記述する) クライアントが IP アドレスとポート番号を使用して,サーバに接続した場合,クライア ントがオープンしたポートには,通常では,システムにより自動的にポート(ダイナミッ クポート/エフェメラルポート)番号が割り振られる(プログラミングの段階で明示的に番 号を指定することもできる) 。サーバ側では,クライアントからの最初の接続時に,その通 信データからクライアントの IP アドレスとポート番号を知ることができるので (図 7.4.3), これらを利用してクライアントに返答を返す。 結局のところ,クライアント・サーバモデルでのクライアント側では,自身の IP アドレ スとポート番号についは,全く気にする必要は無いことになる サーバ クライアント サーバの IPアドレスとポート番号 を指定して接続 クライアントの IPアドレスと ポート番号も通知される ポート番号は,通常はシステムが 自動的に付与する サーバポートのポート番号は 明示的に指定される。 図 7.4.3 クライアント・サーバモデルでのポート番号 注)ドメイン名(正確には FQDN)を指定してもネットワーク上のノード(サーバ)を指定 可能であるが,ドメイン名(FQDN)は結局は IP アドレスに変換されるので,ここではドメ イン名(FQDN)の事は考慮しないこととする。 7.5 ポートスキャン 7.5.1 ポートスキャナ サーバマシンで稼動しているサーバプロセス(ポート)のチェックを行う行為をポート スキャンと呼び,ポートスキャンを行うプログラムをポートスキャナと呼ぶ。 ポートスキャナは,通常ではサーバマシンを攻撃する場合に,事前にそのマシンの情報 収集を行うために実行される(自分の管理するサーバマシンのセキュリティホールを検査 するために用いられる場合もある)。ポートスキャナは,サーバに接続ログ(記録)を残さ ないようにしたり,ちょっとした反応からサーバプロセスのバージョンを割り出すなど, 非常に巧妙な手法でサーバマシンの情報を収集する。 従って,サーバ上では不要なサーバプロセスは必ず停止するようにしないと,クラッカ ー(攻撃者)に有益な情報を与えてしまうことになる。 7.5.2 telnet コマンドによる手動 TCP ポートスキャン 【中級】 telnet コマンドを利用すると,TCP のポートに直接接続することが可能となる。TCP ポー トに接続して,サーバプロセスに対してコマンドを入力することも可能だが,単に指定し た TCP ポートでサーバプロセスが作動しているかどうかの確認としても使用できる。 例えば,サーバ名 www.tuis.ac.jp,ポート番号 80 番(WWW サーバ)に接続する場合は, telnet www.tuis.ac.jp 80 とする。 接続に失敗した場合は,接続失敗のエラーメッセージが表示される。接続に失敗したと 言うことは,指定したポートでサーバプロセスが稼動していないことになる。 一方,接続に成功した場合は,何も表示されないか,またはエラーメッセージ以外のメ ッセージが表示される(メッセージの内容はサーバプロセスの種類による) 。接続に成功し た場合は,指定したポートでサーバプロセスが稼動していることになる。 接続に成功した場合は,その後,クライアントからのキー入力(リクエスト)待ちとな る場合が多い。大抵の場合は,この状態で何か入力すると,コマンドエラーで telnet コマ ンドから抜けるが,どうしても telnet コマンドから出られない場合は,Ctrl+] とキー入 力し,telnet> のプロンプト(入力要求)が表示されたら,quit と入力すれば telnet か ら抜けることができる。 例) telnet> quit 【MS Windows】 MS Windows では,コマンドプロンプトから telnet コマンドを入力する。 ただし,MS Widows の Vista は標準では telnet コマンドを使用できない。Vista で telnet コマンドを使用できるようにするには,コントロールパネルから「プログラム」を選択し, さらに「プログラムと機能」を選択する。コントロールパネルをクラシック表示にしてい る場合は,コントロールパネルから直接「プログラムと機能」のアイコンをクリックする。 「プログラムと機能」が起動したら,タスクの「Windows 機能の有効化または無効化」を クリックし,次に表示された画面で「Telnet クライアント」にチェックを入れ,OK をクリ ックする。 図 7.5.1 に MS Windows の telnet で接続に失敗した例を示す。接続に成功した場合は, 前節にあるように接続エラー以外の何らかの反応が返る(反応の内容はサーバプロセスに よって異なる)。 C:\Users\guest> telnet 192.168.27.7 30 接続中: 192.168.27.7...ホストへ接続できませんでした。 ポート番号 30: 接続に失敗しました 図 7.5.1 MS Windows で telnet が接続に失敗した場合 【Linux/Unix】 Linux/Unix の場合はそのままコンソールから telnet コマンドを起動することができる。 図 7.5.2 に Linux での接続失敗の例を示す。接続に成功した場合は,接続エラー以外の 何らかの反応が返る。 $ telnet 192.168.27.7 30 Trying 192.168.27.7... telnet: connect to address 192.168.27.7: Connection refused telnet: Unable to connect to remote host: Connection refused 図 7.5.2 Linux で telnet が接続に失敗した場合 7.6 練習問題 【問題】 1. トランスポート層の機能を 3 つ選択しなさい。 □ a. 違うネットワークのマシンにセグメントを転送する □ b. 暗号化と復号化 □ c. 上位データをセグメント化する □ d. 通信経路の決定 □ e. プロセス間通信 □ f. 高信頼性通信 2. TCP 通信でフロー制御を行うために動的に変化させるパラメータは何か? ○ a. UNIX サイズ ○ b. Linux サイズ ○ c. Mac サイズ ○ d. Window サイズ ○ e. BSD サイズ 3. TCP, UDP において,通信相手のプロセスを識別する手段は何か? ○ a. プロセス番号 ○ b. MAC アドレス ○ c. ポート番号 ○ d. プロセス名 ○ e. IP アドレス 4. TCP 通信において,データ通信に先だって行われるハンドシェイクの方法を俗に何と呼 ぶか? ○ a. 3 方向ハンドシェイク ○ b. 2 方向ハンドシェイク ○ c. 1 方向ハンドシェイク ○ d. TCP ハンドシェイク ○ e. デュアルハンドシェイク 5. TCP/IP において,トランスポート層で接続を維持しない低信頼性のプロトコルは何 か? ○ a. RIP ○ b. TCP ○ c. UDP ○ d. イーサネット ○ e. IP 6. トランスポート層の高信頼性通信を保障する機能を 3 つ選択しなさい。 □ a. トークンパッシング □ b. CSMA/CD □ c. 伝送データの訂正機能 □ d. 伝送データの誤り検出と再送要求 □ e. データフロー制御 □ f. シーケンス制御 7. 【中級】自組織内のサーバに対して,次に示すポートへ telnet でアクセスし,サーバ プロセスが作動しているかどうか確認せよ(必要なら事前に管理者に連絡を入れておく こと) 21, 22, 23, 25, 80, 110, 443, 3306 【解答】 1. c, e, f 2. d 3. c 4. a 5. c 6. d, e, f 7. -
© Copyright 2024 Paperzz