基本構成

HTTPプロトコル(RFC2616)を下敷きに転送プロトコルを考えてみた。

プロキシ経由の事を考えてRequest-URIとToを分離する

メッセージの形式

KIPPAHメッセージ = リクエスト | レスポンス
リクエスト = リクエスト行 *(メッセージヘッダ CRLF) [メッセージボディ]
リクエスト行 = メソッド SP リクエストURI SP KIPPAHバージョン CRLF
KIPPAH バージョン番号 = "KIPPAH/1.0"
メソッド = "CALL"
         | "MESSAGE"
         | "ACK"
         | "BYE"
ステータス行
リクエストURI = "kippah:" 送信元ユーザ名 "@" サーバIP [ ":" サーバポート番号 ] "/" SenderType "/" 送信先指定
Call-ID = SHA-1によるハッシュ文字列
シーケンス番号

レスポンス = レスポンス行 *(メッセージヘッダ CRLF) [メッセージボディ]
レスポンス行 = KIPPAHバージョン番号 ステータス
ステータス = 200  ; OK
            | 404 ; Resource Not Found

メッセージヘッダ = フィールド名 ":" [ フィールド値 ]
フィールド名     = 英数字文字列
フィールド値     = *(フィールドコンテント | LWS )
フィールドコンテント = 英数字文字列 

LWS:連続空白

ステータスコード

暫定: 1xx
      180 Ringing : 呼び出し中
成功: 2xx
      200 OK : 成功
失敗: 4xx
      400 Bad Request : 不正なリクエスト
      403 Forbidden : 禁止
      405 Method Not Allowed : メソッドが許可されていない
      408 Request Timeout : リクエストがタイムアウトした
      415 Unsupported Media Type : サポートされていないメディアタイプ
      416 Unsupported URI Scheme : サポートされていないURIスキーム
      481 Call/Transaction Does Not Exist : 呼またはトランザクションが存在しない
      486 Busy Here : ここはビジー
      487 Request Terminated:リクエストが終了させられた
      488 Not Acceptable Here : ここでは受け入れ不能

メッセージヘッダ

To: リクエスト受信者のURI
From: リクエスト送信者のURI
Contact: 自身のアドレス情報
Call-ID: メッセージの識別子
CSeq: シーケンス番号
Content-Length: ボディのバイト長
Content-Type: ボディに含まれるタイプ
Accept: サポートするメディアのリスト
Allow: サポートするメソッドのリスト

メッセージボディ

RFC4556(SDP)

テスト用データ

CALL kippah:twainy@10.10.10.10:400 KIPPAH/1.0
HEADER:AAA:13AA
HEADER:BB:333AA
FEFWEFWEFWE333
FEEWFWE