イニシエーターとレスポンダーの間の通信は、①「セッション」(論理的な接続), ②「トランザクション」(オペレーションからレスポンスまでの一連の通信), ③「オペレーション, ④「レスポンス」などの概念や仕組みによって定義されます
「セッション」とは、イニシエーターとレスポンダーの間の論理的な接続を意味します。ほとんどのオペレーションはセッションが開かれた状態でなければ実行できませんが、デバイスのケイパビリティを取得するためのGetDeviceInfoオペレーションはセッションが閉じられた状態でも実行することができます。
セッションは必要に応じて小まめにオープン/クローズするのが正しい作法かも知れませんが、Windows XPのようにStill Image Capture Device クラスの設定が終わった後、PTPの最初のオペレーションとしてセッションを開き、いくつかのオペレーションを実行した後もオペレーションを閉じずにそのまま使い続けるケースも良くあります。
セッションはSessionID(符号無し32ビット値)によって特定されます。通常、同時にイニシエーターが複数のセッションが開くことはなくレスポンダーもそれに対応することはありませんが、PTPの仕様では通信データがどのセッションのものであるか、SessionIDで識別可能ですのでマルチセッションにも対応することができます。正常に開かれているセッションのSessionID値は0x00000001以上の値となります。0x00000000はセッションが開かれていないなど特別な意味を持ちます。
セッションを開くにはOpenSession、閉じるにはCloseSessionオペレーションを使います。
イニシエータが一つのオペレーション要求を送ってから、レスポンダが(オペレーションを実行して)そのオペレーションの実行結果を返すまでの一連の通信を「トランザクション」と呼びます。イニシエーターは同一セッション内で前のオペレーションのレスポンスが返るまで、次のオペレーションを要求することは出来ません。
トランザクションには、①オペレーション リクエスト フェーズ、②データ フェーズ、③レスポンス フェーズの三つのフェーズがあります。
「オペレーション リクエストフェーズ」では、オペレーション コードやパラメータなどがイニシエーターからレスポンダーへ送られます。
「データ フェーズ」は、オペレーションによって存在する場合としない場合があります。さらに転送の方向もオペレーションによってイニシエーターからレスポンダー方向への転送の場合と、その逆方向の転送の場合があります。データ フェーズが存在する場合、オペレーション リクエスト フェーズの次に置かれます。
「レスポンス フェーズ」はトランザクションの最後のフェーズです。このフェーズでは、オペレーションの実行結果(レスポンス コードやパラメータ)がレスポンダーからイニシエーターに送られます。
それぞれのトランザクションはセッション内でユニークなSesstionID値(符号無し32ビット値)を持ちます。transactionID値は0x00000001始まる値でトランザクションが発行される度にインクリメントされ、0xFFFFFFFEに達すると0x00000001に折り返します。TransactionID値の0xFFFFFFFFは特別な状態を示すために用いられ、詳しい意味は状況ごとに異なります。
それぞれのデータフェーズのヘッダ部分にはTransactionIDが含まれます。OpenSessionオペレーションなど、セッション外のトランザクションのTransactionIDはゼロとなります。