در دنیای امروز نیاز به ارتباطات سریع و بیوقفه بیش از هر زمان دیگری احساس میشود. وب سوکت (Websocket) در پاسخ به این نیاز پا به عرصه گذاشته و انقلابی در نحوه تعامل مرورگرها با سرورها ایجاد کرده است. برخلاف پروتکلهای سنتی وب که مبتنی بر درخواست و پاسخ هستند، وب سوکت یک اتصال دوطرفه و مداوم بین مرورگر و سرور برقرار میکند. وب سوکت (WebSocket) پروتکلی است که از طریق یک اتصال طولانیمدت، امکان برقراری ارتباط دوطرفه و بیدرنگ بین کلاینت و سرور را فراهم میکند. وب سوکتها در سالهای اخیر به دلیل توانایی آنها در ارائه ارتباطات با تاخیر کم و بیدرنگ در وب اپلیکیشنها محبوبیت پیدا کردهاند. در این مقاله توضیح میدهیم که وب سوکت چیست و چگونه کار میکند و سپس به بررسی برخی از کاربردهای رایج آن میپردازیم.
وب سوکت چیست؟
وب سوکت یک پروتکل ارتباطی مبتنی بر TCP است که به طور خاص برای برنامههای وب طراحی شده است. این پروتکل به شما امکان میدهد یک اتصال مداوم بین مرورگر وب و سرور ایجاد کنید، که به نوبه خود امکان تبادل دادهها در زمان واقعی را فراهم میکند. وب سوکتها بخشی از HTML5 هستند و توسط تمام مرورگرهای وب مدرن پشتیبانی میشوند. آنها معمولا با استفاده از جاوا اسکریپت در سمت کلاینت و یک فناوری سمت سرور مانند Node.js یا جاوا در سمت سرور پیادهسازی میشوند.
نحوه کار وب سوکت به چه صورت است؟
براساس تعریف موسوم، وب سوکت یک پروتکل دوطرفه است که عمدتا در کانال ارتباطی کلاینت-سرور استفاده میشود. ماهیت آن دوطرفه است و این یعنی ارتباط از کلاینت به سرور و برعکس اتفاق میافتد.
این اتصال که با استفاده از وب سوکت ایجاد شده است، تا زمانی که هر یک از طرفهای شرکتکننده آن را متوقف کند ادامه دارد. هنگامی که یکی از طرفین اتصال را قطع میکند، طرف دوم نمیتواند ارتباط برقرار کند زیرا اتصال متقابل آن به طور خودکار قطع میشود.
وب سوکت برای شروع اتصال به پشتیبانی از HTTP نیاز دارد. تا جایی که به جریان بیوقفهی دادهها و ترافیک ناهماهنگ مختلف مربوط باشد، وب سوکت ستون اصلی توسعه اپلیکیشنهای مدرن تحت وب است.
وب سوکت به طور کلی از طریق مراحل زیر عمل می کند:
1. هندشیک:
- مرورگر یک درخواست HTTP به سرور ارسال می کند و سرور با یک پاسخ HTTP که شامل یک کلید منحصر به فرد است پاسخ می دهد.
- مرورگر و سرور از این کلید برای تأیید اتصال و ایجاد یک کانال ارتباطی امن استفاده می کنند.
2. تبادل دادهها:
- پس از برقراری اتصال، مرورگر و سرور می توانند به طور آزادانه داده ها را در هر دو جهت ارسال و دریافت کنند.
- این تبادل داده ها می تواند به صورت متن، JSON، باینری یا هر فرمت دیگری باشد.
3. بسته شدن اتصال:
- هر یک از طرفین (مرورگر یا سرور) می تواند در هر زمان با ارسال یک فریم خاص اتصال را ببندد.
- طرف دیگر پس از دریافت فریم بسته شدن، اتصال را به طور مرتب می بندد.
کاربردهای وب سوکت چیست؟
وب سوکتها معمولا در انواع وباپلیکیشنهای بیدرنگ (Real-Time) استفاده میشوند. در این بخش به چند مورد از کاربردهای رایج این پروتکل اشاره میکنیم.
اپلیکیشنهای چت
وب سوکتها معمولا در اپلیکیشنهای چت برای ارائه پیامهای بیدرنگ بین کاربران استفاده میشوند. با وب سوکت میتوان پیامها را به صورت بیدرنگ ارسال و دریافت کرد که یک تجربه چت سریع و پاسخگو را ارائه میکند.
بازی آنلاین
وب سوکت همچنین در بازیهای آنلاین برای برقراری ارتباط بیدرنگ بین بازیکنان و سرور بازی استفاده میشود. با وب سوکت میتوان رویدادهای بازی را به صورت بیدرنگ ارسال و دریافت کرد که تجربهای تعاملی و همهجانبه را برای گیمرها فراهم میکند.
داشبوردهای بیدرنگ
وب سوکتها همچنین میتوانند برای ایجاد داشبوردهای بیدرنگ که به روزرسانیدادهها را در لحظه نمایش میدهند مورد استفاده قرار بگیرند. با وب سوکتها دادهها را میتوان در زمان واقعی به داشبورد منتقل کرد و این امکان را به کاربران میدهد تا آخرین بهروزرسانیها را در صورت وقوع مشاهده کنند.
اپلیکیشنهای معاملاتی
وب سوکتها معمولا در اپلیکیشنهای معاملاتی برای ارائهی بیدرنگ بهروزرسانیهای قیمت سهام و سایر دادههای مالی استفاده میشوند. با وب سوکت دادهها را میتوان در لحظه ارسال و دریافت کرد و این امکان را به تریدرها میدهد تا براساس آخرین اطلاعات بازار تصمیمات آگاهانه بگیرند.
مقایسه وب سوکت و HTTP
از آنجایی که هم HTTP و هم وب سوکت برای ارتباط اپلیکیشنها استفاده میشود، مردم معمولا در انتخاب بین آنها دچار سردرگمی میشوند. به همین دلیل در این بخش این دو پروتکل را با یکدیگر مقایسه کردیم تا درک بهتری نسبت به آنها پیدا کنید.
همانطور که قبلا گفته شد، وب سوکت یک پروتکل فریم شده و دوطرفه است. در مقابل، HTTP یک پروتکل یکطرفه است که در سطح بالاتر پروتکل TCP کار میکند.
از آنجایی که پروتکل وب سوکت قادر به پشتیبانی از انتقال مداوم داده است، عمدتا در توسعهی اپلیکیشنهای بیدرنگ یا Real-Time استفاده میشود. HTTP بدون وضعیت (State) است و برای توسعه اپلیکیشنهای RESTful و SOAP استفاده میشود. اگرچه برای پیادهسازی Soap میتوان از HTTP استفاده کرد، اما REST به طور گستردهای گسترش یافته و استفاده میشود.
در وب سوکت، ارتباط در هر دو انتها اتفاق میافتد که باعث میشود به یک پروتکل سریعتر تبدیل شود. در HTTP، اتصال در یک انتها ساخته شده است و نسبت به وب سوکت کمی کندتر محسوب میشود.
وب سوکت از یک اتصال TCP یکپارچه استفاده میکند و برای پایان دادن به اتصال به یک طرف نیاز دارد. تا زمانی که این اتفاق نیفتد، اتصال فعال باقی میماند. HTTP به ایجاد یک اتصال مجزا برای درخواستهای جداگانه نیاز دارد. پس از تکمیل درخواست، اتصال به طور خودکار قطع میشود.
نحوه کار وب سوکت و CDN
اما ارتباط وب سوکت و CDN چیست؟ برخی از CDNها از وب سوکت پشتیبانی میکنند. این یعنی اتصال وب سوکت را میتوان از طریق سرورهای لبه CDN (مشابه نحوه ارائه محتوای استاتیک) هدایت کرد. در این بخش به برخی از مزایای استفاده از CDN به همراه وب سوکت اشاره میکنیم:
- کاهش تاخیر: با ایجاد یک اتصال وب سوکت با یک سرور CDN مجاور، هندشیک اولیه و تبادل داده سریعتر انجام میشود.
- مقیاسپذیری بهتر: CDNها میتوانند حجم بالایی از اتصالات وب سوکت را مدیریت کنند و بار روی سرور مبدا را کاهش دهند.
- بهینهسازی شبکه: CDN به طور بالقوه میتواند مسیرهای کارآمدتری برای انتقال داده بین مشتری و سرور پیدا کند.
اما برای افزایش امنیت ارتباط بین CDN و وب سوکت، نقش دو پروتکل SSL و TLS چیست؟ خرید SSL در ایمنسازی ارتباط بین CDN و وب سوکت، نقش مهمی ایفا میکند که در ادامه آن را بررسی میکنیم:
- رمزگذاری: SSL/TLS دادههای مبادلهشده بین کلاینت، سرور CDN و سرور مبدا را رمزگذاری میکند. این فرایند شامل هندشیک اولیه وب سوکت و هرگونه انتقال دادههای بعدی، محافظت از اطلاعات حساس مانند اعتبار ورود به سیستم یا پیامهای چت میشود.
- احراز هویت: SSL/TLS میتواند برای احراز هویت سرور استفاده شود و اطمینان حاصل کند که کلاینت به سرور CDN قانونی متصل میشود نه یک نمونه فریبکار و مخرب. این امر به ویژه برای اپلیکیشنهای Real-Time که یکپارچگی دادهها ضروری است، اهمیت زیادی دارد.
اتصال وب سوکت چگونه برقرار میشود؟
این فرایند با یک هندشیک (Handshake) وب سوکت شروع میشود که شامل استفاده از یک طرح جدید ws یا wss است. برای درک راحتتر، این دو طرح (Scheme) جدید را به ترتیب معادل HTTP و HTTP امن (HTTPS) در نظر بگیرید.
با استفاده از این طرح، انتظار میرود سرورها و کلاینتها از پروتکل استاندارد اتصال وب سوکت پیروی کنند. برقراری اتصال وب سوکت با ارتقاء درخواست HTTP آغاز میشود که دارای چند هندر مانند Connection: Upgrade، Upgrade: WebSocket، Sec-WebSocket- Key و غیره است.
در این بخش نحوه برقراری این ارتباط را توضیح میدهیم:
درخواست
هدر Connection: Upgrade نشاندهنده هندشیک وب سوکت است. درحالیکه Sec-WebSocket- Key دارای مقدار تصادفی کدگذاریشده با Base64 است. این مقدار به طور درخواه در طور هر هندشیک وب سوکت ایجاد میشود. علاوه بر موارد فوق، هدر Key نیز بخشی از این درخواست است.
هدرهایی که در بالا به آنها اشاره شد، وقتی با هم ترکیب شوند یک درخواست HTTP GET را تشکیل میدهند. در این درخواست دادههای مشابه زیر وجود خواهد داشت:
GET ws://websocketexample.com:8181/ HTTP/1.1 Host: localhost:8181 Connection: Upgrade Pragma: no-cache Cache-Control: no-cache Upgrade: websocket Sec-WebSocket-Version: 13 Sec-WebSocket-Key: b6gjhT32u488lpuRwKaOWs==
برای روشن شدن موضوع، دادهی Sec-WebSocket-Version برای مشخص کردن نسخهای از پروتکل وب سوکت که برای استفاده توسط کلاینت آماده است به کار میرود.
پاسخ
هدر پاسخ (Sec-WebSocket-Accept) دارای ارزش ارسال شده در هدر درخواست (Sec-WebSocket-Key) است. هدر پاسخ با مشخصات پروتکل خاصی مرتبط است و به طور گسترده برای جلوگیری از اطلاعات گمراهکننده استفاده میشود. به عبارت دیگر، این هدر امنیت API را افزایش میدهد و از ایجاد اشتباه در توسعه اپلیکیشن توسط سرورهایی با پیکربندی نامناسب جلوگیری میکند.
در صورت موفقیتآمیز بودن درخواست ارسالشدهی قبلی، پاسخی شبیه به دنباله متنی که در زیر آمده است دریافت خواهد شد:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: rG8wsswmHTJ85lJgAE3M5RTmcCE=
جمع بندی
وب سوکت یک پروتکل قدرتمند برای ارتباط بیدرنگ بین کلاینت و سرور در وباپلیکیشنها است. این پروتکل از طریق یک اتصال طولانیمدت امکان برقراری ارتباط دوطرفه و با تاخیر کم را فراهم میکند. به همین دلیل، وب سوکت برای اپلیکیشنهای Real-Time مانند چت، بازی، داشبورد و ترید یک گزینه ایدهآل است. با پذیرش گستردهی وب سوکت در مرورگرهای وب مدرن، این پروتکل به ابزاری ضروری برای ساخت وباپلیکیشنهای Real-Time تبدیل شده است.