VOIP - SIP - Thư viện mã nguồn mở Linphone

VOIP

VoIP (Voice over Internet Protocol) - giao thức truyền giọng nói qua mạng internet. Tín hiệu thông qua máy nguồn sẽ được mã hoá thành tín hiệu số sau đó sử dụng giao thức TCP/IP để truyển tải đến máy đích và được giải mã ngược lại.

VoIP là sự kết hợp giữa đường và sữa của 2 loại giao thức Signaling protocol và Media Protocol :

  1. Signaling Protocol: sử dụng để thiết lập và điều khiển các cuộc gọi. Các loại signaling protocols bao gồm: SIP, H.323, MGCP, Megaco/H.248 ...
  2. Media Protocols: điều khiển việc truyền tải voice data qua môi trường mạng IP. Các loại Media Protocols như: RTP ( Real-Time Protocol) ,RTCP (RTP control Protocol) , SRTP (Secure Real-Time Transport Protocol), và SRTCP (Secure RTCP)

RTP là giao thức truyền dữ liệu bằng UDP, đây là phương thức truyền thông tin không tin cậy nghĩa là gói tin nó gửi đi không cần xác nhận là có đến được đích hay không tuy nhiên chính vì thế mà số lượng gói tin được giảm đi đáng kể và rất phù hợp với truyền các packet nhỏ trong voice call và video call bởi vì việc mất một vài gói tin nhỏ không làm ảnh hưởng quá nhiều tới chất lượng âm thanh, hình ảnh mà máy đích nhận được.

Trái ngược với RTC là RTCP sử dụng TCP đây là giao thức truyền thông tin tin cậy , nó luôn yêu cầu phía đích phải phản hồi khi nhận được gói tin, do đó RTCP được sử dụng như một phương thức để xác định chất lượng đường truyền, và tính toán tỷ lệ mất gói tin trên đường truyền để điều chỉnh lưu lượng data bằng cách tăng giảm chất lượng âm thanh hình ảnh đảm bảo việc truyền dữ liệu một cách tối ưu.

SRTP và SRTCP là hai giao thức tương đương với RTP và RTCP, tuy nhiên nó có thêm lớp bảo mật đường truyền TSL (Transport Layer Security).

SIP

SIP ( Session Initiation Protocol ) - Giao thức khởi tạo phiên : đây là một giao thức báo hiệu giúp thiết lập và điều khiển phiên truyền dữ liệu real-time. SIP được ứng dụng để tham gia vào quá trình tạo ra các dịch vụ voice call, video call, messaging...

(Sơ đồ các thành phần của giao thức SIP )

Quan sát mô hình phía trên ta có thể thấy một hệ thống thiết lập phiên truyền media với 4 thành phần chính :

  1. Alice đóng vai trò là người khởi tạo kết nối truyền dữ liệu tới Bod
  2. Bob đóng vai trò là người nhận lời mời từ Alice và thực kết nối ngược lại để tạo ra một đường truyền giữa 2 người
  3. Redirect Server có nhiệm vụ lấy địa chỉ IP của Bob dự trên thông tin mà Alice truyền lên
  4. Proxy là nơi đóng vai trò nhận gói tin từ Alice chuyển cho Bob và ngược lại nhận gói tin từ Bob chuyển về cho Alice

Tôi sẽ mô tả lại chi tiết quá trình từ khi bắt đầu đến khi kết thúc phiên bằng giao thức SIP :

Chắc bạn vẫn nhớ cái thời mà nhà nhà người người vẫn sử dụng điện thoại bàn. Một ngày chủ nhật đẹp trời, bạn muốn có một cuộc hẹn với ai đó và nhưng bạn chẳng nhớ số bàn của người ấy OH ! SHIT !!! Làm sao bây giờ ???? Thật may mắn, bạn còn có cuốn bí kíp "danh bạ thần chưởng" dày cộp cung cấp đầy đủ thông tin số điện thoại mà bạn cần tìm kiếm. Trong SIP, Redirect Server đóng vai trò cuốn bí kíp đó, nó giúp bạn tìm kiếm mọi địa chỉ người dùng đang online.

Alice giống như bạn, muốn gọi cho Bob nên gửi gói tin INVITE (F1) tới cho Redirect Server. Redirect Server sẽ tìm xem địa chỉ của Bob và gửi trả về cho bạn (F2) . Redirect Server sẽ liên tục gửi thông tin cho tới khi nào nhận được bản tin ACK (F3) từ Alice, báo hiệu đã nhận được địa chỉ để đảm bảo không bị mất gói tin. Sau khi Alice có được địa chỉ của Bob nó điền thông tin vào bản tin INVITE (F4) và gửi cho Bob qua Proxy và chờ phản hồi từ Proxy, nếu sau một thời gian nhất định không nhận được phản hồi từ Proxy nó sẽ cố gắng gửi lại bản tin INVITE. Proxy sẽ đọc bản tin và gửi cho Bob (F5) theo đúng địa chỉ mà nó đọc được đồng thời gửi bản tin 100 Trying (F6) trờ lại cho Alice để thông báo là nó đang cố gắng để liên lạc với Bob. Bob sau khi nhận được bản tin INVITE từ Alice sẽ gửi bản tin 180 Ringing (F7) cho Alice thông qua Proxy để thông báo rằng mọi chuyện ổn và đây là lúc lý tưởng để bọn nó có thể tạo đường truyền media và Proxy sẽ chuyển thông điệp này (F8) lại cho Alice. Chú ý rằng lúc này Alice vừa bấm số để gọi cho Bob và điện thoại của Bob thì gửi gói tin 180 Ringing thông báo là nó đang đổ chuông và chờ ông Bob đến bấm nhấc máy và media vẫn chưa được truyền. Khi Bob nhấc máy lúc này một bản tin 200 OK (F9) được gửi đi và Proxy sẽ chuyển cho Alice (F10), bản tin này có mục đích là báo đã sẵn sàng mở đường truyền media. Tuy nhiên lúc này media vẫn chưa được truyền mà nó phải chờ thêm 1 bản tin ACK ( F11) xác nhận từ phía Alice, và một đường truyền media được tạo giữa Alice và Bob khi Bob nhận được ACK (F12).

Trong mô hình trên bạn có thể thấy Media được truyền trực tiếp giữa Alice và Bob mà không thông qua server, đó là đường truyền Peer-To-Peer (P2p). Tuy nhiên trên thực tế khả năng p2p diễn ra là rất thấp đặc biệt với việc sử dụng mạng 3G, 4G thì khả năng 99% là không thực hiện được do đặc tính IP thay đổi liên tục. Thông thường media vẫn phải truyền qua server trung gian kéo làm tăng độ trễ của đường truyền và chất lượng phụ thuộc nhiều vào khả năng tải của server.

Khi muốn kết thúc truyền media, chỉ cần truyền gói tin BYE cho đối phương và chờ bản tin 200 OK để xác định rằng đối phương đã nhận được lệnh kết thúc truyền media.

Trên đây là một mô hình cơ bản của SIP, bạn có thể cải tiến nó để phù hợp với nhu cầu và chứng năng mà bạn muốn sử dụng trong ứng dụng của mình, ví dụ như bạn muốn tạo một ứng dụng gọi điện mà thay vì nghe tiếng nhạc chờ nhàm chán lúc bản tin Ringing (F7) được gửi đi, bạn có thể khởi tạo media ngay từ bước này (early media), Bob sẽ có thể phát 1 bài nhạc cài sẵn và gửi cho Alice, chắc chắn rằng Alice sẽ rất sảng khoái trong lúc chờ để được nói chuyện với Bob.

Thư viện mã nguồn mở Linphone

Linphone là một dự án mã nguồn mở được viết bằng ngôn ngữ C được công bố năm 2001. Nó cung cấp dịch vụ VOIP giúp mọi người giao tiếp với nhau thông qua video, voice và tin nhắn văn bản trên môi trường internet. Linphone được xây dựng dựa trên SIP, do đó nó tương thích với bất cứ hệ thống VOIP nào sử dụng SIP Trải qua quá trình phát triển hiện nay linphone đã được triển khai trên cả desktop (Windows, MacOSX, Linux ), mobile (IOS, android, Windows phone, Blackberry ) và web platforms.

Phía trên chúng ta có thể thấy một cách trực quan kiến trúc hệ thống mà dự án Linphone triển khai. Nó gồm có 5 tầng chính :

1. LINPHONE Đây là tầng cao nhất trong kiến trúc, giao tiếp với giao diện người dùng, thư viện phía dưới được build ra đầy đủ các ngôn ngữ để hỗ trợ lập trình viện có thể sử dụng một cách dễ dàng để viết ra ứng dụng của mình trên một hệ điều hành nào đó.

2. LIBLINPHONE Nằm ở vị trí thứ 2 trong kiến trúc hệ thống, đây là tầng quản lý mọi logic liên quan tới thiết lập cuộc gọi và gửi tin nhắn. Có thể nói các logic SIP được triển khai ở tầng này, ngoài ra nó còn làm nhiệm lớp trung gian nhận các cấu hình liên quan tới các bộ codecs (bộ mã hoá và giải mã video, audio). Tầng này sẽ cài đặt kịch bản thực hiện một cuộc gọi, lắng nghe các gói tin, đọc và phân loại đâu là bản tin báo hiệu đâu là tin nhắn,... và sẽ đẩy thông báo lên cho tâng cao nhất hiển thị cho người dùng.

3. MEDIA STREAMER2 Nằm ngay phía sau tầng LIBLINPHONE, nhiệm vụ chính của tầng này mã hoá và giải mã dữ liệu, Linphone cung cấp nhiều module để nhà phát triển có thể lựa chọn các codecs phù hợp với mục đích sử dụng miễn phí hay trả phí. Các audio codecs OPUS, SILK, SPEEX, G722, AMR-WB (G722.2), AMR-NB, GSM 6.10, ILBC, G729, ISAC, BV16, G711, Codec2 và video codecs : VP8, H264, MPEG4 hỗ trợ chất lượng video HD

4. BELLE-SIP Tầng này nằm gần cuối trong kiến trúc Linphone, quản lý và cấu hình các gói tin SIP, thực hiện các nhiệm vụ liên quan tới phân chia cổng đón nhận gói tin và quản lý kết nối socket sử dụng các giao thức UDP, TCP, TLS để truyền các gói tin.

5. oRTP Đây là tầng thấp nhất trong kiến trúc Linphone có nhiệm vụ truyền các gói tin real-time. Ngoài việc phân nhỏ gói tin để truyền đi, tầng này còn có nhiệm vu đo đạc tỷ lệ gói tin bị mất để thông báo lên các tầng phía trên qua đó đưa ra các giải pháp để thay đổi cấu hình codecs giúp tăng hoặc giảm kích thước dữ liệu gửi đi.

Như vậy là tôi đã giới thiệu sơ bộ cho các bạn về dự án mã nguồn mở LINPHONE, đây là một dự án VOIP sử dụng SIP làm giao thức khởi tạo cho truyền dữ liệu cuộc gọi và tin nhắn. Các bạn có thể tải mã nguồn của dự án,nghiên cứu nó và đóng góp cho cộng đồng hoặc cũng có thể tải về các bộ SDK đã được build sẵn để tự xây dựng cho mình một ứng dụng VOIP với SIP server

Cảm ơn các đã theo dõi bài viết ! Trong những bài tiếp theo tôi sẽ trình bày chi tiết hơn về cách hoạt động trong từng tầng của dự án này để bạn bạn có thể hiểu rõ hơn về việc truyền tải gói tin cũng như xử lý mã hoá giải mã dữ liệu.