پروتکل XMPP چیست؟ بخش اول معماری

پروتکل XMPP چیست؟ بخش اول معماری

مقدمه 

اینترنت و ارتباطات، یکی از پایه های اصلی تمدن امروزی است. برای این که اینترنت کار کند و انسان ها و سیستم ها بتوانند به وسیله ی آن با هم ارتباط برقرار کنند، پروتکل های فراوانی در لایه های مختلف آن پیاده سازی شده است. برای روشن شدن ماجرا به مدل 4 لایه ی TCP/IP می توان اشاره کرد که در تصویر زیر شمای کلی آن را می بینید.

در این مدل هر لایه به صورت منطقی مسئولیت هایی را بر عهده دارد و هر لایه بالایی در بستر لایه زیرین خود عمل می کند. تقسیم وظایف بین لایه ها در عین ارتباط با یکدیگر، سازنده بستر اینترنت است.

  1. پایین ترین لایه که لایه شبکه یا لینک است، مسئول انتقال بسته های داده بر بستر فیزیکی شبکه که شامل روترها و سوییچ ها و سایر تجهیزات شبکه است، می باشد.
  2. لایه دوم آدرس دهی شبکه بر اساس IP را انجام می دهد. در نتیجه سیستم های مختلف متصل به شبکه، به وسیله آدرس IP می توانند باهم ارتباط برقرار کنند.
  3. لایه سوم که لایه انتقال است، Connection بین سیستم های متصل به شبکه را مدیریت می کند که دو پروتکل اصلی به نام های TCP و UDP دارد.
  4. لایه چهارم لایه ای است که برنامه های مختلف بر اساس پروتکل های مختلف می توانند با هم ارتباط برقرار کنند، مثلا Web Browser ها و Web Server ها بر اساس پروتکل HTTP و سیستم ایمیل با پروتکل های SMTP و POP با هم ارتباط برقرار می کنند.

یکی از مهم ترین نیازمندی هایی که در بستر اینترنت برای آن راه حل ارائه شده، پیام رسانی است. ایمیل یکی از قدیمی ترین تکنولوژی های پیام رسانی است که از حدود دهه 70 میلادی راه اندازی شده است و برای کارکردش از چندین پروتکل مختلف استفاده می شود. در دهه 90 تکنولوژی پیام رسانی آنی IM راه اندازی شد و پروتکل های مختلفی برای آن مثل IRC ایجاد شد. در این مقاله قصد داریم در مورد پروتکل متن باز XMPP برای این منظور صحبت کنیم. 

پروتکل XMPP

پروتکل متن باز XMPP که مخفف Extensible Messaging and Presence Protocol است، توسط انجمن Jabber در سال 1999 به عنوان جایگزین IRC با قابلیت های بیشتر طراحی شد و برنامه های پیام رسان مختلفی بر مبنای این پروتکل ساخته شد. معروفترین آنها WhatsApp است که بعدا ورژن تغییر یافته ای از XMPP را جایگزین کرد. برنامه های دیگر مانند Google Talk و Facebook Messenger از XMPP پشتیبانی می کردند ولی در سال 2015 پشتیبانی از XMPP از برنامه های فوق حذف شد و به مرور XMPP در حوزه ی Messaging به حاشیه رفت. 

اگرXMPP توسط شرکت های بزرگ مورد استفاده قرار می گرفت، اکنون می توانستیم به جای استفاده از چندین نرم افزار پیام رسان که توسط شرکت های مختلف پشتیبانی می شوند، از یک نرم افزار برای پیام رسانی روی شبکه های مختلف مانند ایمیل، استفاده کنیم.

XMPP بر مبنای زبان XML قرار دارد، که نوعی زبان نشانه گذاری گسترش پذیر است و در آن داده ها در قالب یک سری تگ با قواعد و معانی مشخصی قرار می گیرد. به این ترتیب برای ذخیره سازی در انواع ماشین ها یا انتقال در طول شبکه آماده شود. در واقع این یک روش سریال سازی داده است که وابسته به سیستم عامل یا زبان برنامه نویسی خاصی نیست و قابل خواندن توسط انسان هم هست. نمونه ای از کد XML در زیر دیده می شود.

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>

از دیگر کاربردهای XMPP اینترنت اشیا است، که برای انتقال اطلاعات بین سنسور ها و سرور ها استفاده می شود همچنین از XMPP در حوزه ی SOAP Webservice استفاده می شود و به عنوان بخش پیام رسانی در برخی ESB ها کاربرد دارد. همچنین از این پروتکل روی بستر WebSocket برای ارتباط غیر همزمان بین وب سایت و سرور می توان بهره برد. برای ارسال فایل و تماس صوتی و تصویری از Jingle که افزونه P2P برای XMPP است می توان استفاده کرد.

پروتکل های AMQP، MQTT، WAMP، SIMPLE، Matrix و Signal از جمله پروتکل های پیام رسان و ارسال Push Notification هستند که در حوزه های مختلفی رقیب XMPP به حساب می آیند. 

Serialization

ارسال داده ساختارها یا آبجکت ها در شبکه یا ذخیره در دیتابیس ها با دو روش Encoding، binary یا text (ascii) انجام می شود. XML و JSON از جمله روش های سریال سازی متنی بوده و ProtoBuf و Thrift از جمله روش های سریال سازی باینری هستند. البته معمولا در عمل، متن سریال سازی شده هم پس از فشرده سازی تبدیل به باینری شده و ارسال یا ذخیره می شود تا حجم کمتری اشغال کند، اما روش های سریال سازی باینری در مجموع، انتقال سریع تر و حجم کمتر ذخیره سازی را دارند.

معماری XMPP

این پروتکل از معماری Client-Server Decentralized در شبکه استفاده می کند. به این صورت که تعدادی کلاینت و تعدادی سرور در شبکه به شکل زیر وجود دارد. آدرس دهی آن ها شبیه سیستم ایمیل است، مثل "localpart@domainpart/resource" که به آن JID می گویند. در نتیجه آن، کاربران متصل به سرورهای مختلف می توانند با هم ارتباط برقرار کنند.

همچنین XMPP غیرهمزمان است و مانند HTTP فقط از مدل Request/Response استفاده نمی کند، بلکه از مدل Push و Pub/Sub هم استفاده می کند.

نکته دیگر در XMPP وجود اتصال TCP دائمی بین کلاینت ها و سرورها و سرورها با هم است به همین خاطر جریان داده های XML به صورت آنی می تواند از یک نقطه به نقطه دیگر ارسال شود و نیازی نیست به ازای ارسال هر پیام، یک اتصال TCP جدید برقرار شود.

فرایند ارتباطی پروتکل

دو مفهوم مهم در XMPP که امکان تبادل داده ها را فراهم می کند عبارت اند از: 

  • XML Stream: بستر ارتباط بین دو موجودیت را فراهم می کند.
  • XML Stanza: خود پیام یا درخواستی است که رد و بدل می شود.

همان طورکه از اسم آن ها پیداست هر دو بر مبنای زبان XML هستند. 

XML Stream که با تگ  <stream> شروع و با </stream> تمام می شود، به عنوان پاکت پیام است و مانند HTTP Header عمل می کند. مشخصات کانال ارتباط بین دو موجودیت در شبکه را تعیین می کند. به عنوان مثال SASL و TLS در قالب stream راه اندازی می شود.

XML Stanza یا قطعه XML همان حامل اصلی پیام است که می تواند در قالب تگ های <message/> یا <presence/> یا <iq/>، هرکدام با کاربرد خودش، ارسال شود. کاربرد تگ <message> ارسال پیام متنی شبیه SMS،  به طرف مقابل است و به صورت push notification به طرف مقابل می رسد. 

تگ <presence> حاوی اطلاعات آنلاین یا آفلاین بودن و Status است که با مدل Publish/Subscribe ارسال می شود. در واقع نوعی Observer Pattern است و فقط کسانی که برای دریافت Status یک نفر قبلا ثبت نام (Subscribe) کرده باشند، اعلام وضعیت او را دریافت خواهند کرد. البته ارسال این تگ به صورت نفر به نفر مانند تگ message هم امکان پذیر است. 

تگ <iq> یا Info/Query به صورت مدل Request/Response مانندHTTP طراحی شده و برای دریافت یا ثبت اطلاعات در سرور مورد استفاده قرار می گیرد.

هر فرآیند ارتباط در XMPP با ارسال تگ <stream> شروع می شود و پس از آن تعداد بی شماری stanza می تواند ارسال و دریافت شود. هر تگ <stream> به معنای کانالی یک طرفه از فرستنده به گیرنده تلقی می شود. برای اینکه گیرنده هم بتواند داده ارسال کند باید ابتدا یک تگ <stream> ارسال کند. برای اعلام پایان ارتباط هم، هرکدام از طرفین ارتباط، باید تگ </stream> را ارسال کنند.

از بهترین نوشته‌های کاربران سکان آکادمی در سکان پلاس


online-support-icon