An Extension to Session Initiation Protocol (SIP) Events for Conditional Event Notification
Extracted elements (28)
Entity-tags are independent of subscriptions, allowing entity-tags generated for fetches or polls to remain valid across subsequent fetches or polls. This enables efficient polling without maintaining long-lived subscription dialogs.
Entity-tags are modeled after HTTP conditional requests and the SIP PUBLISH mechanism. The solution allows subscribers to condition SUBSCRIBE requests on whether state has changed since a previously received notification, suppressing redundant NOTIFYs.
The extension is motivated by the inefficiency of SIP events where every SUBSCRIBE refresh triggers a NOTIFY with full resource state, even when state has not changed. This is analogous to HTTP's repeated GET problem, solved there via conditional requests with entity-tags.
The Subscription-State header field is explicitly excluded from the entity definition, so changes to subscription state alone (e.g., active to terminated) do not force a new entity-tag, preserving the ability to suppress bodies while still reporting subscription state changes.
Some B2BUA devices may be unaware of conditional notification and may treat a NOTIFY with suppressed body as an error or expect all SUBSCRIBEs to have an associated NOTIFY. If subscribers encounter such transient errors, they should disable the feature and fall back to normal subscription behavior.
The mechanism is backwards compatible: unaware subscribers ignore the SIP-ETag header and make unconditional requests; unaware notifiers ignore the Suppress-If-Match header and continue normal operation. No negotiation is required.
A notifier MUST generate entity-tags for event notifications of all resources for which it is responsible. The entity-tag MUST be unique across all versions of all entities for each state of a resource as reported by a given event package.
A successful conditional SUBSCRIBE request MUST extend the subscription expiry time.
A Suppress-If-Match header field with entity-tag value of '*' MUST always evaluate to true, effectively quenching the subscription so only state-change notifications and out-of-dialog SUBSCRIBE responses are received (without body).
For list subscriptions, implementations MUST consider the full resource state of the resource list including RLMI and the entity-header as the entity to which the entity-tag applies.
If the subscriber receives a 204 (No Notification) response to an in-dialog SUBSCRIBE, the subscriber MUST consider the event state and the subscription state unchanged.
Implementations MUST NOT expect entity-tags to be shared between different access mechanisms (e.g., HTTP, SIP PUBLISH, SIP events), unless event packages or specific applications explicitly define such dependencies.
The notifier MUST remember (or be able to recalculate) the entity-tag of an entity as long as the version of the entity is current. The notifier MAY remember the entity-tag longer for implementing journaled state differentials.
The subscriber MUST NOT infer any meaning from the value of an entity-tag; specifically, it MUST NOT assume identical entities for NOTIFYs with identical entity-tag values when those NOTIFYs result from subscriptions to different resources.
When a subscriber receives a NOTIFY request containing a SIP-ETag header field, it MUST store the entity-tag if it wishes to make use of conditional notification. The subscriber MUST be prepared to receive a NOTIFY with any entity-tag value, including previously seen values.
When a suppression condition is true but there are reportable changes in the NOTIFY header (e.g., Subscription-State changed), the notifier MUST suppress the body of the NOTIFY request, setting Content-Length to zero and omitting Content-Type.
When creating a conditional SUBSCRIBE request, the subscriber MUST include a single conditional header field including an entity-tag in the request.
When state differentials (deltas) are sent in a NOTIFY, the SIP-ETag header field MUST contain an entity-tag that corresponds to the full resource state, not the delta.
When the suppression condition is true and the SUBSCRIBE is sent within an established dialog, the notifier MUST suppress the resulting NOTIFY request and generate a 204 (No Notification) response. Notifiers MUST NOT suppress a NOTIFY unless the SUBSCRIBE was sent in an established dialog.
Whenever the data in the NOTIFY body or any of the tracked meta-data (Content-Disposition, Content-Encoding, Content-Language, Content-Length, Content-Type, Event) changes, the notifier MUST produce a new entity-tag.
With partial event notification, implementations MUST consider the full event state (not just the delta) as the version of the entity to which the entity-tag in the NOTIFY applies.
An entity-tag is an opaque token carried in the SIP-ETag header field of NOTIFY requests. It uniquely identifies a specific version of an entity (resource state representation) for a given resource and event package.
The 204 (No Notification) response code indicates a SUBSCRIBE was successful but the associated notification will not be sent. It is valid only in response to a SUBSCRIBE sent within an established dialog.
The Suppress-If-Match header field is added to SUBSCRIBE requests to condition the resulting notifications. It carries an entity-tag value (or wildcard '*') and instructs the notifier to suppress the NOTIFY body or the entire NOTIFY request if the condition is true.
IANA registered the 204 (No Notification) response code under the 'Successful 2xx' category in the SIP methods and response-codes sub-registry.
IANA registered the Suppress-If-Match header field (no compact form) in the SIP header fields sub-registry.
This specification introduces an optimization to SIP event notification and does not alter the security properties of the protocol. Security considerations from RFC 3265 apply in full.
The Suppress-If-Match header field grammar is: `Suppress-If-Match = "Suppress-If-Match" HCOLON ( entity-tag / "*" )`, where entity-tag is an opaque token borrowed from RFC 3903. The wildcard value '*' always evaluates to true.