2009年4月25日土曜日

謎の用語を解明しよう: Latch(とRelatch)

仕事で飛び交っている謎の言葉、Latch。アクセスライン側からエッジルータへパケットを投げるときに、「Latchする」みたいな使い方をしています。先輩に聞いてみましたが、言葉の定義がいまいちはっきりしません。「飛んできたパケットのソースIPアドレスを覚えること」というようなものだと説明は受けましたが、ルータやセキュリティの話には耳をふさいできた私には、とても理解できませんでした。。。:(

調べてみると、NAPT機能を実現するときに、MGCMGに対して投げる命令の様です。

しかし情報がないですねー。ググってみると、LatchとはH.248.37で定義されているMegacoのipnapt packageのパラメータの様です。仕様書はITU-T H-series RecommendationsからPDF形式でダウンロードできます。

H.248.37の概要には以下の様に書いてあります。

H.248.37 Abstract
Gateway Control Protocol: IP NAPT Traversal Package

原文

Session Border Controllers (SBCs) are becoming an important part of the Internet infrastructure. Some of these Session Border Controllers are being split into Media Gateway Controller (MGC) and Media Gateway (MG) components. One important function of a SBC is to perform Network and Address and Port Translation (NAPT). H.248.37 allows the MGC to instruct a MG to latch to an address provided by an incoming Internet Protocol (IP) application data stream rather than the address provided by the call/bearer control. This enables the MG to open a pinhole for data flow.

拙訳

SBCはインターネットインフラにおいて重要部分になってきている。これらのSBCの中にはMGCとMG機能を分けているものがある。SBCの1つの大事な機能はNAPTを実現することである。H.248.37では、MGCがMGにIPアドレスを指定する方法として、Call Bearer Controlのものを提供するのではなく、流れてくるIPアプリケーションデータからIPアドレスをLatchできるようにすることを定義している。

いやー「Latchする」とかさらっと言われても分かりませんね :s 英語が分かる人はイメージが伝わるのでしょうか。CiscoのASR 1000のページに幾分説明が載っていました。

Latch and Relatch Support

When the LATCH value is set, the DBE ignores the addresses received in the RemoteDescriptor. Instead, the DBE uses the source address and source port from the incoming media streams to be the destination address and destination port of the outgoing streams.

要するにLatchというのは、MGがストリームの通信先を決める方法の1つで、普通は発信者が指定したアドレス+ポートをMGCがMGに設定するのだけど、MGCが「Latchしろ」と言った時はその設定を無視し、最初にパケットが飛んできたときに、そのパケットのソースアドレス+ポートを「Latchし」、通信先として動的に認識する方法のこと、らしいです(英語的に、Latch onto ~は「~を理解する」「手に入れる」という意味)。

もっと具体的に言うと、普通、発信者は自分がメディアを受け取りたいアドレス+ポートをINVITEのSDPのc行に載せ、それをMGCがMGにAddするときにRemoteDescriptorに記述するんだけど、そのときにipnapt/latch{ napt=LATCH,stream=1 }みたいに指定されると、RemoteDescriptorに記述された発信者のアドレス+ポート設定をMGは無視する。その代り、LocalDescriptorに記述されたアドレス+ポート(=MGがメディアを通したいアドレス+ポート)に最初に飛んできたパケットのソースアドレス+ポートを通信先として認識する、ということを「Latchする」というようです。文字だけで書くとややこしいですね。

上記は音声通話を開始するまでの流れを(かなり簡略化して)図示したものです。図中にオレンジの●が2つありますが、これが音声を流すポート番号です。この番号をお互いが認識しあえれば、音声通話を開始できます。Latch指定がされない場合、図中の数字の箇所では以下の動作をします。

  1. 発信者から着信先に対してINVITEを出す(このときに発信者側の音声を送受信用のポート番号をSDPに載せる)
  2. MGCからMGへ、発信者のポート番号を載せたAddを出す
  3. MGがMG側の音声送受信用ポートを決定し、Add Replyを出す(ここでMGはRemoteとLocal両方のポート番号を決定)
  4. Add Replyの情報を発信者に伝える。また、着信者側へも同様の操作を行うためにINVITEを転送する
  5. MG側のポート番号が分かったため、音声を流せるようになる

一方Latch指定された場合は以下の様になります。

  1. 発信者から着信先に対してINVITEを出す(このときに発信者側の音声を送受信用のポート番号をSDPに載せる)
  2. MGCからMGへ、発信者のポート番号を載せたAdd(Latch指定付)を出す。
  3. MGがMG側の音声送受信用ポートを決定しAdd Replyを出すが、Latch指定されているため、MGCが指定した発信者のポート番号を無視し、MG側音声送受信用ポートに入ってくるパケットを待つ
  4. Add Replyの情報を発信者に伝える。また、着信者側へも同様の操作を行うためにINVITEを転送する
  5. MG側のポート番号が分かったため、音声を流せるようになる
  6. (図中にはないけど)MGは最初に飛んできたパケットのソースアドレスとポートを発信者のアドレス+ポート番号として認識し、通信できるようになる

また、RELATCHが指定された時は以下の様な動作をします。

  1. 現在LatchされているIPアドレスとポート番号で通信を行う
  2. 通信中に、発信者のソースポートが変わった場合、それを検出して新しいソースポート番号をRelatchし、通信先のポート番号として再設定する
  3. Relatch後に、元のソースポート番号からパケットが飛んできても、そのパケットは不許可パケットとして弾く

ものすごい適当な説明ですが、これで伝わったでしょうか。。?実際にはLatch/Relatchを指定するときはgm/rsamでIPアドレスを絞ります(きっと)。そうしないとRELATCHを指定したときに流れパケットを通してしまいますから。

0 件のコメント:

コメントを投稿