あるUAの話その2

rfc3261 にはRecord-Routeというヘッダが決められていて、これはUA間のダイアログがどのようなルートであるかを記述するRouteヘッダを作成するための非常に重要なヘッダだ。
Record-Routeは途中のProxyがダイアログに「関心」がある場合に先頭に挿入するため、常に必要というわけではないが、ISPでは主に課金の都合上Record-Routeしてくる。
複数のProxyを通過するとその分だけRecord-Routeの行数が増えていき、ダイアログを確立する応答であるINVITE 200 OKを受信したUACからみると、Record-Routeは、相手に近い順番で並んでいることになる。したがって、

  • Record-Routeを逆順に並び替えてRouteを作成する
  • ContactをRouteの最後に追加する

これでルートセットが完成する。UASからみると、

  • Record-Routeをそのままの順序で並べてRouteを作成する
  • ContactをRouteの最後に追加する

となる。ともにルートセットの先頭はリクエストを投げる一番近いProxyをさしていることになる。ルートセットからメッセージを作成する際には

  • Routeの先頭のURIに'lr'パラメタがある場合(つまりloose routerである場合)はRouteの最後のURIを削除し、そのURIをリクエスURIにする。
  • そうでない場合には、strict routerであるため、Routeの先頭のURIを削除し、そのURIをリクエスURIにする。

となる。