Giới thiệu về SIP SIMPLE
Trong hành trình sử dụng SIP, chúng ta thường tập trung vào các cuộc gọi (như INVITE, ACK, BYE, RTP...). Nhưng SIP không chỉ đơn thuần là giao thức gọi điện thoại.
SIP SIMPLE là một framework mở rộng cho phép thực hiện nhắn tin tức thời, hiện diện và thông báo sự kiện thông qua SIP. Bài viết này sẽ giới thiệu về SIP SIMPLE, lý do ra đời của nó và hướng dẫn một số tình huống ví dụ.
SIP SIMPLE là gì?
SIP for Instant Messaging and Presence Leveraging Extensions (SIMPLE) là một tập hợp các mở rộng SIP được định nghĩa bởi nhiều RFC.
Mục tiêu của SIMPLE là biến SIP thành một giao thức không chỉ dành cho cuộc gọi điện thoại bằng cách thêm các tính năng sau:
- Hiện diện → Cho biết người dùng có đang có mặt, bận hay ngoại tuyến.
- Đăng ký → Cho phép client đăng ký nhận thông báo về các sự kiện.
- Nhắn tin → Gửi các tin nhắn ngắn tức thời qua SIP.
Các yêu cầu SIP trong SIMPLE
SIMPLE tái sử dụng các phương thức yêu cầu SIP hiện có và bổ sung thêm một số phương thức mới:
- SUBSCRIBE → Client đăng ký nhận thông tin về hiện diện/sự kiện.
- NOTIFY → Server thông báo cho người đăng ký về các cập nhật (ví dụ: thay đổi trạng thái hiện diện).
- MESSAGE → Nhắn tin tức thời.
- PUBLISH → Người dùng công bố trạng thái hiện diện của mình.
Hiện diện với SIMPLE
Hiện diện là việc cho phép người khác biết trạng thái của bạn.
Ví dụ về luồng hiện diện:
Watcher (UA A). Presence Server
SUBSCRIBE (presence of B) -------->
<--------------------------- 200 OK
<--------------- NOTIFY (B=offline)
...
<---------------- NOTIFY (B=online)
- UA A (Watcher) gửi
SUBSCRIBE
đến server để nhận thông tin về hiện diện của UA B. - Server hiện diện phản hồi với 200 OK và sau đó
NOTIFY
các cập nhật khi trạng thái của B thay đổi.
Ví dụ yêu cầu SUBSCRIBE
SUBSCRIBE sip:bob@example.com SIP/2.0
From: sip:alice@example.com;tag=1111
To: sip:bob@example.com
Call-ID: pres-1234@example.com
CSeq: 1 SUBSCRIBE
Event: presence
Expires: 3600
Ví dụ yêu cầu NOTIFY
NOTIFY sip:alice@example.com SIP/2.0
From: sip:bob@example.com;tag=2222
To: sip:alice@example.com;tag=1111
Call-ID: pres-1234@example.com
CSeq: 2 NOTIFY
Event: presence
Subscription-State: active
Content-Type: application/pidf+xml
>
<presence entity="sip:bob@example.com">
<tuple id="t1">
<status>
<basic>open</basic>
</status>
</tuple> >
</presence>
Nhắn tin với SIMPLE
SIP SIMPLE cũng định nghĩa MESSAGE, một yêu cầu nhẹ để gửi các tin nhắn tức thời.
Khác với MSRP (Message Session Relay Protocol, được sử dụng cho các phiên chat/tệp lớn), MESSAGE là nhắn tin theo chế độ trang — giống như SMS.
Ví dụ luồng nhắn tin
UA A UA B
MESSAGE "Chào Bob!" ------------->
<------------------------- 200 OK
Ví dụ yêu cầu MESSAGE
MESSAGE sip:bob@example.com SIP/2.0
From: sip:alice@example.com;tag=aaaa
To: sip:bob@example.com
Call-ID: msg-5555@example.com
CSeq: 1 MESSAGE
Content-Type: text/plain
Content-Length: 7
>
> Chào bạn!
Công bố hiện diện với SIMPLE
SIP PUBLISH là cách mà người dùng thông báo cho mạng “đây là trạng thái hiện tại của tôi” — trực tuyến, bận hoặc đi vắng.
- Hãy nghĩ về PUBLISH như việc đăng một cập nhật trạng thái trong SIP — các server hiện diện sẽ đọc nó và các watcher sẽ nhận thông báo.
- PUBLISH không đi từ người dùng này đến người dùng khác; nó là tín hiệu gửi đến server hiện diện, nơi sẽ chuyển tiếp thông tin.
- Mỗi PUBLISH kèm theo một thời gian hết hạn — giống như nói “Tôi đang trực tuyến trong 30 phút tới trừ khi tôi cập nhật.”
- Với PUBLISH, người dùng SIP chia sẻ ngữ cảnh (sẵn sàng chat, đang trong cuộc gọi, không làm phiền) qua mạng.
Ví dụ luồng công bố hiện diện
Presentity (UA B) Presence Server
PUBLISH (Tôi đang trực tuyến) ---------------->
<-------------------------------- 200 OK
NOTIFY tất cả người đăng ký
( Server thông báo cho các watcher )
<-------------------------------- NOTIFY
Ví dụ yêu cầu PUBLISH
PUBLISH sip:presence.example.com SIP/2.0
Via: SIP/2.0/UDP alicepc.example.com;branch=z9hG4bK776sgdkse
Max-Forwards: 70
From: "Alice" <sip:alice@example.com>;tag=1928301774
To: <sip:alice@example.com>
Call-ID: a84b4c76e66710@alicepc.example.com
CSeq: 314159 PUBLISH
Contact: <sip:alice@alicepc.example.com>
Event: presence
Expires: 3600
Content-Type: application/pidf+xml
Content-Length: 178
>
> <presence xmlns="urn:ietf:params:xml:ns:pidf"entity="sip:alice@example.com">
> <tuple id="t123">
> <status>
> <basic>open</basic>
> </status>
> <note>Sẵn sàng chat</note>
> </tuple>
> </presence>
So sánh SIMPLE với XMPP
XMPP (Extensible Messaging and Presence Protocol) được thiết kế từ đầu cho chat và hiện diện.
👉 Giao thức chuyên dụng cho các hệ sinh thái nhắn tin.
SIP SIMPLE được tạo ra cho các môi trường đã sử dụng SIP, để tránh việc phải chạy một giao thức hoàn toàn riêng biệt cho nhắn tin/hiện diện.
👉 Mở rộng những gì bạn đã có trong các mạng SIP.
So sánh luồng hiện diện
+---------------------------+ +----------------------------+
| SIP SIMPLE | | XMPP |
+---------------------------+ +----------------------------+
| UA A (Watcher) | | Client A |
| SUBSCRIBE presence ---->| | <presence to="server"> |
| | |--------------------------->|
| Presence Server | | XMPP Server |
| 200 OK ---------------->| | Chuyển tiếp đến danh bạ của B|
| NOTIFY (offline/online)>| | Phát hiện hiện diện |
| | |<---------------------------|
| UA A biết trạng thái | | Client B trạng thái đến A |
+---------------------------+ +----------------------------+
- SIMPLE → Hiện diện được quản lý rõ ràng và đăng ký với SUBSCRIBE/NOTIFY.
- XMPP → Hiện diện được phát tự động bởi server khi trạng thái của client thay đổi.
Tình huống thực tế với SIMPLE
Alice đăng ký nhận thông tin hiện diện của Bob, biết khi nào Bob trực tuyến, và sau đó gửi cho anh ta một tin nhắn.
Alice (Watcher) Presence Server Bob (Presentity)
--------------------------------------------------------------------------
SUBSCRIBE (hiện diện của Bob) ------->
<---------------------------- 200 OK
<-------------- NOTIFY (Bob=offline)
<------------------ PUBLISH (trực tuyến)
200 OK ---------------------------->
<--------------- NOTIFY (Bob=online)
MESSAGE "Chào Bob!" ---------------------------------------------------->
<---------------------------------------------------------------- 200 OK
- Alice đăng ký nhận thông tin hiện diện của Bob.
- Ban đầu, Bob ngoại tuyến.
- Sau đó, Bob công bố “Tôi đang trực tuyến.”
- Server thông báo cho Alice rằng Bob giờ đã trực tuyến.
- Alice gửi một MESSAGE.
Kết luận
Các yêu cầu tin nhắn SIP SIMPLE
Yêu cầu | Mục đích |
---|---|
SUBSCRIBE | Yêu cầu theo dõi một sự kiện (ví dụ: hiện diện) |
NOTIFY | Gửi cập nhật đến người đăng ký |
MESSAGE | Gửi một tin nhắn ngắn |
PUBLISH | Công bố trạng thái của bản thân (thông tin hiện diện) |
- SIP SIMPLE biến SIP thành một giao thức không chỉ cho giọng nói.
- Nó cho phép hiện diện, nhắn tin và đăng ký thông qua các giao dịch SIP tiêu chuẩn.
- SIMPLE nổi bật trong các môi trường sử dụng SIP nhưng ít phổ biến hơn so với XMPP hoặc các giải pháp chat WebRTC hiện đại.
- SIMPLE xây dựng trên framework thông báo sự kiện của SIP (RFC 3265).
- Ngoài hiện diện, SUBSCRIBE/NOTIFY có thể theo dõi:
- Tóm tắt tin nhắn → Các chỉ báo hộp thư thoại (MWI)
- Trạng thái hội nghị
- Trạng thái đăng ký
👉 Theo dõi @sip_gamesto để mở khóa cấp độ tiếp theo.