9.10.2 HTTPパケット入力コネクター定義

HTTPパケット入力コネクター定義(HttpPacketInputConnectorDefinitionタグ)は,入力用CB定義(InputCBDefinitionタグ)の子要素として定義します。

なお,HTTPパケットの入力の処理については,「11.3 HTTPパケットの入力」を参照してください。

<この項の構成>
(1) 記述形式
(2) 定義の詳細
(3) 記述例
(4) WinDumpを使用する場合のcommandタグの指定内容
(5) tcpdumpを使用する場合のcommandタグの指定内容
(6) フィールド名に指定できる識別子
(7) フィールド値に格納されるデータのJavaのデータ型

(1) 記述形式

<HttpPacketInputConnectorDefinition>
 <input buffersize="<入出力バッファーサイズ>"
  assemblingtime="<分割パケット組み立て時間>">
   <packetdata
    globalheader="<グローバルヘッダー領域長>"
    packetheader="<パケットヘッダー領域長>"
    packetoffset="<パケットデータサイズ領域オフセット>"
    packetlength="<パケットデータサイズ領域長>"
    timeoffset="<タイムスタンプ領域オフセット>"/>
   <command path="<コマンドパス名>"
    parameter="<コマンドパラメーター>"/>
 </input>
 <output unit="<最大出力単位>">
   <record name="<レコード名>" type="{REQUEST|RESPONSE}">
     <field name="<フィールド名>"/>
   </record>
 </output>
</HttpPacketInputConnectorDefinition>

(2) 定義の詳細

HttpPacketInputConnectorDefinitionタグ(全体情報の定義)
HTTPパケット入力コネクター定義の全体情報を定義します。この定義は必ず1個だけ記述します。
inputタグ(読み込み定義)
HTTPパケットの入出力情報を定義します。この定義は必ず1個だけ記述します。
buffersize="<入出力バッファーサイズ>"
入力バッファーに格納できるHTTPパケット(単位:パケット),および出力バッファーに格納できる共通形式レコード(単位:レコード)の最大数を1~12288の整数で指定します。省略した場合,4096が仮定されます。
assemblingtime="<分割パケット組み立て時間>"
分割パケット組み立て時間(単位:ミリ秒)を1~5000の整数で指定します。省略した場合,2000が仮定されます。
分割パケットとは,最大セグメント長(MSS:Maximum Segment Size)に従ってTCP階層で分割されたパケットデータのことです。HTTPパケット入力コネクターが取得したデータが分割パケットの場合は,TCPプロトコルヘッダーの情報を基にパケットを組み立てます。分割パケット組み立て時間とは,新たな分割パケットが到着してから,到着済みのパケットと連結して組み立てるまでに掛かる時間のことで,分割パケットが連結されるごとにリセットしてカウントされます。なお,IP階層で分割されるパケットデータの組み立てはしません。
分割パケットの組み立てで,ここで指定した時間を超えた場合は,組み立て中の分割パケットは破棄されます。また,組み立てに使用した分割パケットの最新の時刻情報は,タイムスタンプとして使用されます。
packetdataタグ(HTTPパケット定義)
取得するHTTPパケットのフォーマットを定義します。この定義は必ず1個だけ記述します。
globalheader="<グローバルヘッダー領域長>"
グローバルヘッダー領域の長さ(単位:バイト)を1~128の整数で指定します。省略した場合,24が仮定されます。
packetheader="<パケットヘッダー領域長>"
パケットヘッダー領域の長さ(単位:バイト)を9~128の整数で指定します。省略した場合,16が仮定されます。
packetoffset="<パケットデータサイズ領域オフセット>"
パケットヘッダーの先頭からパケットデータサイズ領域までのオフセット(単位:バイト)を0~127の整数で指定します。省略した場合,8が仮定されます。
packetlength="<パケットデータサイズ領域長>"
パケットデータサイズ領域の長さ(単位:バイト)を1~4の整数で指定します。省略した場合,4が仮定されます。
timeoffset="<タイムスタンプ領域オフセット>"
パケットヘッダーの先頭からタイムスタンプ領域までのオフセット(単位:バイト)を0~120の整数で指定します。省略した場合,0が仮定されます。
タイムスタンプ領域とは,パケットアナライザーがHTTPパケットをキャプチャーしたときのタイムスタンプを格納している,パケットヘッダーの領域です。タイムスタンプ領域のフォーマットを次の図に示します。

図9-2 タイムスタンプ領域のフォーマット

[図データ]
commandタグ(コマンド定義)
使用するパケットアナライザーの起動コマンドの情報を定義します。この定義は必ず1個だけ記述します。
Stream Data Platform - AFでは,パケットアナライザーとしてWindowsの場合はWinDump,Linuxの場合はtcpdumpを使用できます。
WinDump,またはtcpdumpを使用する場合に,この定義で指定する内容については,「(4) WinDumpを使用する場合のcommandタグの指定内容」,または「(5) tcpdumpを使用する場合のcommandタグの指定内容」を参照してください。
path="<コマンドパス名>"
パケットアナライザーの起動コマンドの絶対パス名を1~100文字の半角文字(ASCIIコードの32~126)で指定します。
parameter="<コマンドパラメーター>"
パケットアナライザーの起動コマンドに渡すパラメーターを1~100文字の半角文字(ASCIIコードの32~126)で指定します。
outputタグ(出力定義)
HTTPパケット入力コネクターがHTTPパケットを共通形式レコードに変換する際の,共通形式レコードの出力情報を定義します。この定義は必ず1個だけ記述します。
unit="<最大出力単位>"
共通形式レコードの最大出力単位(単位:レコード)を1~1000の整数で指定します。省略した場合,100が仮定されます。
recordタグ(レコード定義)
共通形式レコードのレコード情報を定義します。この定義は1~2個記述します。
name="<レコード名>"
共通形式レコードのレコード名を1~100文字の半角英数字,およびアンダーライン(_)で指定します。先頭の文字に指定できるのは,半角英字だけです。この属性は省略できません。レコード名は,recordタグ内で一意となるように指定してください。
type="{REQUEST|RESPONSE}"
共通形式レコードの種類を指定します。この属性は省略できません。
指定できる値を次に示します。
  • "REQUEST"
    リクエストレコードです。HTTPプロトコル通信で,クライアントからホストへのリクエスト送信時に発生したデータを格納する共通形式レコードです。
  • "RESPONSE"
    レスポンスレコードです。HTTPプロトコル通信で,ホストからクライアントへのレスポンス送信時に発生したデータを格納する共通形式レコードです。
fieldタグ(フィールド定義)
共通形式レコードを構成するフィールドの情報を定義します。この定義は1~16個記述します。
name="<フィールド名>"
フィールド名を指定します。
フィールド名には,HTTPパケットから抽出したいデータの識別子を指定します。ここで指定した識別子に対応したデータが,各フィールドの値に格納されます。
フィールド名は,レコード定義内で一意となるように指定します。
フィールド名に指定できる識別子は,recordタグのtype属性で指定する共通形式のレコードの種類によって異なります。フィールド名に指定できる識別子については,「(6) フィールド名に指定できる識別子」を参照してください。
抽出されたデータは,Javaのデータ型に変換されてフィールド値に格納されます。フィールド値に格納されるデータのJavaのデータ型については,「(7) フィールド値に格納されるデータのJavaのデータ型」を参照してください。

(3) 記述例

<?xml version="1.0" encoding="UTF-8"?>
<root:AdaptorCompositionDefinition
xmlns:hpicon="http://www.hitachi.co.jp/soft/xml/sdp/adaptor/definition/callback/HttpPacketInputConnectorDefinition">
<!-- 途中略 -->

<!-- 入力用CB定義 -->
<cb:InputCBDefinition
class="jp.co.Hitachi.soft.sdp.adaptor.callback.io.packetinput.HttpPacketInputCBImpl" name="inputer2">
 <!-- HTTPパケット入力コネクター定義 -->
 <hpicon:HttpPacketInputConnectorDefinition>
   <!-- 読み込み定義 -->
   <hpicon:input buffersize="096" assemblingtime="2000">
     <!-- HTTPパケット定義 -->
     <hpicon:packetdata globalheader="24" packetheader="16" packetoffset="8"
      packetlength="4" timeoffset="0"/>
     <!-- コマンド定義 -->
     <hpicon:command path="C:¥Program Files¥WinDump¥WinDump.exe"
      parameter=" -i 1 -s 2048 -w - -n &quot;tcp port 80 and host 133.145.224.19&quot;"/>
   </hpicon:input>
   <!-- 出力定義 -->
   <hpicon:output unit="100">
     <!-- レコード定義 -->
     <hpicon:record name="RECORD1" type="REQUEST">
       <!-- フィールド定義 -->
       <hpicon:field name="SEND_IP"/>
       <hpicon:field name="RECEIVE_IP"/>
       <hpicon:field name="SEND_PORT"/>
       <hpicon:field name="RECEIVE_PORT"/>
       <hpicon:field name="MESSAGE_TYPE"/>
       <hpicon:field name="TARGET_URI"/>
     </hpicon:record>
   </hpicon:output>
 </hpicon:HttpPacketInputConnectorDefinition>
</cb:InputCBDefinition>

(4) WinDumpを使用する場合のcommandタグの指定内容

パケットアナライザーとしてWinDumpを使用する場合に,commandタグで指定する内容について説明します。なお,ここでは,WinDumpのバージョン3.9.5を使用する場合の例を示します。WinDumpの起動コマンドの詳細については,WinDumpのドキュメントを参照してください。

HTTPパケット入力コネクターでは,次の書式で記述されたWinDumpの起動コマンド(WinDump.exe)をサポートします。

WinDump.exe△-i△<ネットワークデバイスの番号>△-s△<内部バッファーサイズ>△-w△-△-n△"tcp△port△<ポート番号>△and△host△<IPアドレス>"

書式の「△」は半角スペースを表します。commandタグのparameter属性では,半角スペースを省略しないで記述してください。

書式に示した値について説明します。

WinDump.exe
WinDumpの起動コマンドです。commandタグのpath属性で,WinDump.exeのパスを絶対パスで指定してください。
-i△<ネットワークデバイスの番号>
解析対象のコンピュータに接続されているネットワークデバイスの番号を指定するオプションです。このオプションと値は,commandタグのparameter属性で指定します。
-s△<内部バッファーサイズ>
キャプチャーしたパケットデータを格納する内部バッファーのサイズ(単位:バイト)を指定します。HTTPではTCPのパケットサイズ以上を指定する必要があり,通常は,2,048バイトを指定すれば十分です。このオプションと値は,commandタグのparameter属性で指定します。
-w△-
キャプチャーしたパケットの出力先として,ファイル,または標準出力を指定するオプションです。HTTPパケット入力コネクターを使用する場合には,パケットを標準出力するため,「-w△-」と指定します。このオプションと値は,commandタグのparameter属性で指定します。
-n△"tcp△port△<ポート番号>△and△host△<IPアドレス>"
パケットキャプチャーライブラリー(libpcap)のフィルター書式でキャプチャーフィルターを指定するオプションです。HTTPパケット入力コネクターを使用する場合には,HTTPプロトコルで使用するポート番号と,解析対象のコンピュータのIPアドレスを指定します。このオプションと値は,commandタグのparameter属性で指定します。
なお,ダブルクォーテーション(")は特殊文字に該当するため,「&quot;」と置換して記述してください。

(5) tcpdumpを使用する場合のcommandタグの指定内容

パケットアナライザーとしてtcpdumpを使用する場合に,commandタグで指定する内容について説明します。なお,ここでは,tcpdumpのバージョン3.9.4を使用する場合の例を示します。tcpdumpの起動コマンドの詳細については,tcpdumpのドキュメントを参照してください。

HTTPパケット入力コネクターでは,次の書式で記述されたtcpdumpの起動コマンドをサポートします。

/usr/sbin/tcpdump△-i△<LANインタフェース名>△-s△<内部バッファーサイズ>△-w△-△-n△tcp△port△<ポート番号>△and△host△<IPアドレス>

書式の「△」は半角スペースを表します。commandタグのparameter属性では,半角スペースを省略しないで記述してください。

書式に示した値について説明します。

tcpdump
tcpdumpの起動コマンドです。commandタグのpath属性で,tcpdumpのパスを絶対パスで指定してください。
-i△<LANインタフェース名>
解析対象のコンピュータに接続されているLANインタフェース名を指定するオプションです。このオプションと値は,commandタグのparameter属性で指定します。
-s△<内部バッファーサイズ>
キャプチャーしたパケットデータを格納する内部バッファーのサイズ(単位:バイト)を指定します。HTTPではTCPのパケットサイズ以上を指定する必要があり,通常は,65,535バイトを指定します。このオプションと値は,commandタグのparameter属性で指定します。
-w△-
キャプチャーしたパケットの出力先として,ファイル,または標準出力を指定するオプションです。HTTPパケット入力コネクターを使用する場合には,パケットを標準出力するため,「-w△-」と指定します。このオプションと値は,commandタグのparameter属性で指定します。
-n△tcp△port△<ポート番号>△and△host△<IPアドレス>
パケットキャプチャーライブラリー(libpcap)のフィルター書式でキャプチャーフィルターを指定するオプションです。HTTPパケット入力コネクターを使用する場合には,HTTPプロトコルで使用するポート番号と,解析対象のコンピュータのIPアドレスを指定します。このオプションと値は,commandタグのparameter属性で指定します。

(6) フィールド名に指定できる識別子

fieldタグのname属性のフィールド名として指定できる識別子を次の表に示します。

表9-9 fieldタグのname属性のフィールド名として指定できる識別子

項番識別子データ内容プロトコルレコードの種類ごとの指定可否
リクエストレスポンス
1TIME時刻※1パケットデータが到着した時刻
2PACKET_LENGTHパケットサイズ※2パケットデータの長さ(単位:バイト)
3SEND_MAC送信元MACアドレスパケット送信元のMACアドレスEthernet
4SEND_IP送信元IPアドレスパケット送信元のIPアドレスIP
5RECEIVE_IP送信先IPアドレスパケット送信先のIPアドレスIP
6SEND_PORT送信元ポート番号パケット送信元のポート番号TCP
7RECEIVE_PORT送信先ポート番号パケット送信先のポート番号TCP
8MESSAGE_TYPEメッセージ種別Request,Responseの種別HTTP
9METHOD_NAMEメソッド情報GET,POSTなどのメソッド情報HTTP×
10TARGET_URIURI情報※3アクセス先のURI情報HTTP×
11REFERERReferer※3リンク元のURI情報HTTP×
12COOKIECookie※3 ※4クッキー情報※5HTTP
13STATUS_CODEステータスコード要求の処理結果HTTP×
14CONNECTIONConnection接続の永続性情報HTTP
15CONTENT_LENGTHContent-Lengthコンテンツの長さ(単位:バイト)HTTP
16CONTENT_TYPEContent-Typeコンテンツの種類HTTP
17MESSAGE_BODYメッセージ・ボディ※3実データHTTP※6×
(凡例)
○:識別子を指定できます。
×:識別子を指定できません。
-:該当しません。
注※1
時刻は,パケットヘッダーのタイムスタンプから取得します。
注※2
パケットサイズは,HTTPメッセージの開始行,ヘッダーサイズ,およびHTTPヘッダー"Content-Length"が参照する値の合計値です。"Content-Length"がない場合,"Content-Length"が参照する値は0とします。
注※3
パーセントエンコードされている文字列は,UTF-8でデコードします。
注※4
リクエストレコードとレスポンスレコードでCookieデータの取得方法が異なります。
リクエストレコードの場合は,HTTPヘッダー"Cookie"が参照するデータを取得します。
レスポンスレコードの場合は,HTTPヘッダー"Set-Cookie"が参照するデータを取得します。HTTPヘッダー"Cookie2"と"Set-Cookie2"が参照するデータは取得しません。
注※5
クッキー情報には複数のクッキーが含まれている場合があります。それぞれのクッキーをフィールドとして扱いたい場合は,マッピング定義のmapタグのfunction属性でregexsubstringを指定して,正規表現の文字列を取得するようにしてください。
注※6
メッセージ・ボディは,メソッド情報がPOST,Content-Typeのメディアタイプがtextで(サブタイプの値は問わない),かつContent-Lengthが存在する場合だけ取得できます。

(7) フィールド値に格納されるデータのJavaのデータ型

fieldタグのname属性で指定した識別子に従って抽出された各プロトコルデータは,次の表に示すJavaのデータ型に変換されます。Javaのデータ型への変換の際に,プロトコルデータの値が値の範囲の上限を超えている場合は,上限値までがフィールド値に格納されます。指定した識別子に対応するデータがプロトコルデータにない場合,フィールド値には,String型のときは空文字,Integer型のときは-1が格納されます。

表9-10 フィールド値に格納されるデータのJavaのデータ型

項番データプロトコルJavaのデータ型値の範囲
1時刻Timestamp1970/01/01 00:00:00.000000 ~ 2261/12/31 23:59:59.999999
2パケットサイズInteger0~2,147,483,647
3送信元MACアドレスEthernetString17文字(00:00:00:00:00:00 ~ FF:FF:FF:FF:FF:FF)
4送信元ポート番号TCPInteger0~65,535
5送信先ポート番号TCPInteger
6送信元IPアドレスIPString
  • IPv4の場合
    7~15文字(0.0.0.0 ~255.255.255.255)
  • IPv6の場合
    40文字(0000:0000:0000:0000: 0000:0000:0000:0000 ~FFFF:FFFF:FFFF:FFFF: FFFF:FFFF:FFFF:FFFF)
7送信先IPアドレスIPString
8データ種別HTTPString7~8文字(RequestまたはResponse)
9メソッド情報HTTPString1~127文字(GET,CONNECTなど)
10URI情報HTTPString1~255文字
11RefererHTTPString
12CookieHTTPString1~4,096文字
13ステータスコードHTTPString3文字(200,404など)
14ConnectionHTTPString1~127文字(closeまたはKeep-Alive)
15Content-LengthHTTPInteger0~2,147,483,647
16Content-TypeHTTPString3~255文字
17メッセージ・ボディHTTPString0~2,048文字
(凡例)
-:該当しません。
注※
フィールドに時刻データを指定する場合は,クエリ定義ファイルのCQLデータ型(TIMESTAMP)の有効けた数も合わせて6けた以上を指定するようにしてください。