مفهوم websocket به زبان ساده

توی این مقاله میخوام مثل همیشه به زبان ساده ، یک تکنولوژی رو معرفی کنم . تکنولوژی بنام websocket که این روزها مخصوصا خیلی در دنیای وب و برنامه نویسی پرکاربرد هست . پس بریم سر اصل مطلب ...وب سوکت یا websocket یا ws یا RFC6455 ، در واقع یک پروتکلی هست که ارتباط پایداری بین سرور و کلاینت ایجاد میکنه که از نوع ارتباطات سریع و بلادرنگ هست . درحالت عادی ، همیشه ارتباط بین سرور و کلاینت روی پروتکل http انجام میشه . به این صورت که ابتدا یک اتصالی یا connection بین کلاینت و سرور برقرار میشد و درخواست یا همون request از سمت کلاینت به سرور ارسال میشد و کلاینت ، حالا منتظر جوابی بود که باید از سمت سرور برمیگشت یا همون response و بعد از اون اگر کاری با سرور نبود ، اتصال قطع میشد . ولی ارتباط بین سرور و کلاینت در websocket فرق میکنه . به این صورته که ابتدا درخواستی تحت پروتکل http از کلاینت به سرور ارسال میشه . اگر سرور از websocket پشتیبانی میکرد ، پاسخی موفقیت آمیز به کلاینت ارسال میشه که معروف هست به handshake یا دست دادن که به معنی قبول کردن ارتباط دو طرفه تحت پروتکل websocket هست و نتیجه این پیام ، ارتقاع پروتکل از http به websocket هست. بعد از ارتقا ، یک سوکت بین کلاینت و سرور ایجاد شده و ارتباطات بدون وقفه انجام میشه . تنها زمانی این ارتباط قطع میشه که یکی از طرفین از این سوکت خارج بشه . ( اصطلاحا session بسته بشه )مقایسه این دو پروتکلمعمولا وقتی صحبت از مقایسه بین دو مورد میشه ، اکثر ماها از دید معایب و مزایا به قضیه نگاه میکنیم و به دنبال انتخاب بین یکی از دو مورد میگردیم.باید بگم متاسفانه این مقایسه بین این دو اگر به معنی انتخاب تنها یکدوم از این ها باشه ، اشتباهه .پروتکل http یک پروتکل نیمه دوطرفه هست ( به دلیلی که بالاتر توضیح دادم ) این درحالیه که websocket یک پروتکل کاملا دوطرفه هستش . ینی پس از قبولی ارتباط سوکتی بین کلاینت و سرور ، پیام ها در قالب request و response تبادل نمیشن . بلکه ممکنه یکسری پیام از سمت کلاینت به سرور ارسال بشه و همینطور هم برعکسش . پس هر دو طرف میتونن بدون ایجاد وقفه ای به جهت منتظر موندن برای پاسخ ، داده ارسال کنن . به همین جهت ، معمولا سرعت انتقال داده بین دوطرف در http پایین تر از websocket هست .برای همین از سوکت به عنوان ارتباط بلادرنگ هم یاد میشه .یه موضوع دیگه ای هم که هست ، بحث تعداد کلاینت هایی هست که تمایل به ارتباط با سرور رو دارن . در پروتکل http هرچقدر تعداد کاربران بیشتر باشه ، سرور بار بیشتری رو تحمل میکنه و اگر تعداد درخواست ها در واحد زمان زیاد باشه ، امکان عدم توانایی پاسخگویی سرور هم هست . دلایل مختلفی هم داره . بارزترینش همینی هست که بابت هر درخواستی که به سرور از سمت کلاینت میشه ، باید منتظر پاسخگویی موند و این خودش هم زمان بر هست . حالا شما فکر کن سرور اگر از سخت افزار نسبتا ضعیفی هم برخوردار باشه ، دیگه چه افتظاحی به بار میاد !ولی در مورد websocket به مراتب کمتر این اتفاق میافته . دلیلش هم مشخصه دیگه . websocket صبر نمیکنه که پاسخ از سرور برگرده تا کلاینت درخواست بعدی رو ارسال کنه . میشه پشت سر هم از کلاینت درخواست ارسال بشه بدون اینکه منتظر جوابی موند . ( دقیقا مثل یک اوتوبان دوطرفه ) . این خودش حتی روی تعداد کاربران هم تاثیر زیادی میزاره و باعث افت کارایی سرور نمیشه . شباهت های این دو پروتکلهر دو روی لایه TCP از لایه هفتم OSI در شبکه قرار دارن . هر دوی این پروتکل از secure بودن یا SSL بهره میبرن . یعنی همونطور که برای http ، نسخه https هم داریم که رمزنگاری شده هست ، برای websocket هم wss داریم . ( البته websocket رو به اختصار همیشه با ws نمایش میدن مثل http که خلاصه شده عبارت hyper text transfer protocol هست .) انتخاب بین این دو پروتکلباید بگم که این کاملا بستگی به نرم افزار شما و کارایی مورد انتظار شما از نرم افزار داره که از هر کدوم این پروتکل ها کی و کجا استفاده کنی . اگر نرم افزاری که در حال توسعه اون هستی ، داده هایی داره که نیاز نیست دایما و به قولی به طور زنده یا لایو ، بین کلاینت و سرور انتقال داده بشه ، حتما از http استفاده کن . مثل محتوای اصلی و بدنه یک سایت معمولی یا مدیریت محتوای یک سیستم . ولی اگر داده های نرم افزار دایم در حال تغییر هست و به طور زنده ، بدون رفرش شدن صفحه ، این انتقال انجام بشه ، باید از ws استفاده کرد . مثل شبکه های اجتماعی ، بازی های آنلاین و گروهی ، مشاهده فیلم ، نمودار نوسانات ارزی و ...نحوه استفاده از این پروتکلبرای استفاده از websocket باید هم در قسمت کلاینت و هم در قسمت سرور نرم افزار ، کتابخانه websocket رو فراخوانی کنید . درحال حاظر چون این پروتکل ، به عنوانی یک پروتکل استاندارد ( توسط IETF در سال 2011 به عنوان RFC6455 استاندارد شد ) و جهانی در بستر شبکه شناخته شده هست ، تغریبا تمامی مرورگر های مدرن و وب سرور ها از این پروتکل پشتیبانی میکنن . همچنین کتابخانه های محبوبی هم برای ارتباط رو این پروتکل در زبان های مختلف برنامه نویسی ، توسعه داده شده . در ادامه میتونید یک نمونه پروژه بسیار ساده که یک چت آنلاین روی asp.net core هست رو از گیت هاب بنده دانلود کنید .https://github.com/AmirGh796/OnlineChat_WS.git