درک Socket

سلام
دوستان کمی در درک socket مشکل دارم. کلا نمیتونم درک کنم که سوکت ها چه کاری انجام میدن. برای چی از سوکت ها استفاده میکنیم.

خودم این طوری فکر میکنم. شما بگید درسته یا خیر. یا اگر کم هستش شما بیشتر توضیح بدید

برای تعامل بین کلاینت و سرور میایم از سوکت استفاده میکنیم .آیا این برداشت درسته یا خیر؟

برای تعامل بین کلاینت و سرور از خیلی چیزها استفاده میکنیم یکیش سوکت هست.
البته ۲تا سوکت داریم. اینی که شما میگید websocket هست. (اون‌یکی unix societ هست که یه مقدار فرق میکنه)

برای ارتباط با سرور، چندتا راه داریم. یکیش اینه که restful api بزنیم و دیتایی که میخوایم رو بفرستیم و جواب بگیریم. کاری که همین وبسایت انجام میده. (front-end = client & back-end = server)
وقتی با api کار میکنیم، سیستممون باید اینطوری باشه که مثلا هر دقیقه ریکوئست بفرسته «چه خبر؟» سرور جواب بده «هیچی» و شاید بعد از ۱۰۰تا ریکوئست این مدلی سرور جواب بده «یه نفر به فلان پستت پاسخ داده»
این، هم باعث میشه تعداد زیادی ریکوئست الکی بزنیم به سرور و هم باعث میشه یه تایمی فاصله بیفته بین پاسخ به اون پست و باخبر شدن ما (مثلا پست پاسخ داده بشه و کد ما، ۳۰ثانیه بعد چک کنه)

برای وبسایتهایی شبیه devheroes مشکل خاصی نیست. نیازی به real time communication نداریم.
ولی شما یه بازی رو در نظر بگیرید. توی بازی یا سیستم چت ما باید همون لحظه که اتفاق میفته و روی سرور ثبت میشه خبردار بشیم. برای این، از websocket استفاده میشه.

سیستم وب‌سوکت اینطوریه که کانکشن یک‌بار زده میشه و همیشه متصل باقی میمونه. (برعکس حالت معمولی استفاده از پروتکل TCP که ما ریکوئست میزنیم و جواب میگیریم و کانکشن بسته میشه)
توی این حالت، سرور میتونه هرزمان که دلش میخواد یه دیتایی برای ما بفرسته و ما‌هم هرزمان که میخوایم یه دیتا بفرستیم به سرور و برای ارسال دیتا لازم نیست دیگه سلام و احوال‌پرسی کنیم. (کاری که توی کانکشن معمولی باید هربار اتفاق بیفته و کلاینت و سرور خودشونو به هم معرفی کنن. بهش میگن handshake)

به این مدل کانکشنها میگن bi-directional یعنی هرکدوم از طرفین (سرور و کلاینت) میتونن هرزمان که بخوان دیتا ارسال کنن.

7 Likes

`
ببخشید برای درک خوب این tcp , websocket چ دوره ای لازمه گذرونده بشه؟

دوره نمیشناسم. خودم توی اینترنت گشتم و مطالعه کردم.

یه توضیح کوتاه میدم:
پروتکل‌های ارتباطی اینترنت ۲ تا هستن. TCP و UDP

UDP:

درکل udp ساده‌تره و البته سریعتر ولی دقیق و مطمئن نیست. سیستمش اینطوریه که ما یه دیتایی رو میفرستیم به سرور و تمام! نه باخبر میشیم که سرور دیتای مارو فهمیده یا نه، نه میفهمیم اصلا سرور روشن هست یا نه. (تا جایی که میدونم!) این برای زمانهایی استفاده میشه که سرعت برامون مهمه و دوست داریم ترافیک کمتری مصرف بشه ولی دقت و کامل بودن دیتا زیاد اهمیت نداره. مثلا game serverها. ما میخوایم xyz و زاویه‌ی دید کاراکتر رو بفرستیم به سرور و این کار رو ۱۰۰بار در ثانیه انجام بدیم. اگه وسط نصف دیتا هم درست ارسال نشه مشکلی پیش نمیاد چون دیتای آخر همه چیز رو ریست میکنه به چیزی که توی لحظه‌ی آخر هست.
البته همین مثال game server هم درست و کامل نیست. مثال درستتر DNS serverها هستن که از udp استفاده میکنن.

TCP:

این پروتکل مطمئنتره ولی سرعتش یه مقدار کمتره. چون سرور و کلاینت یه کم باهمدیگه صحبت میکنن قبل از ارسال دیتا و بعد به همدیگه پیام terminate میفرستن که نشون بدن ارتباط تموم شده.
به این‌کار میگن handshake و سیستمش تقریبا اینطوریه:

  • کلاینت: من فایرفاکس ورژن فلان هستم روی لینوکس دبیان ورژن فلان. از gzip پشتیبانی میکنم و دیتای /index.html رو میخوام.
  • سرور: من وب‌سرور nginx ورژن فلان هستم روی لینوکس centos ورژن فلان و gzip میفرستم با سایز ۱۳۴بایت.
    (و دیتا رو ارسال میکنه)
  • کلاینت: دریافت شد. تمام
  • سرور: تمام
  • (پیام اتمام تراکنش رو فقط یکی میفرسته. یا کلاینت یا سرور. بستگی داره آخرین دیتا به دست کی برسه)

حالا اینی که الآن اینجا نوشتم دقیق نیست شاید یه چیزایی رو اشتباه نوشته باشم ولی کلیاتش همینه.
یه برنامه نویس، نیازی نیست دقیقا همه‌ی این چیزا رو بدونید (مگر اینکه بخواید وبسرور یا وب‌کلاینت بسازید بدون استفاده از لایبرریها). این چیزها به طور اتوماتیک توسط وب‌سروری که روی سرورتون نصب میکنید و وب‌کلاینتی که دارید ساپورت میشه و انجام میشه. ولی دونستنش در همین حد کافیه.

WebSocket:

روی tcp کار میکنه و درحقیقت یه کانکشن tcp هست که پیام terminate توش ارسال نمیشه (اتوماتیک ارسال نمیشه و باید خودمون به صورت دستی ارسالش کنیم)
مثل این میمونه که شما همیشه درحال دانلود و آپلود کردن همزمان به سرور باشید و سرعتتون 0KB/s باشه، مگر اینکه بخوایم دیتا بفرستیم.


اگه بخوام یه مدل دیگه tcp و websocket رو توضیح بدم باید بگم توی TCP ما کانکشنمون همیشه قطعه مگر اینکه بخوایم دیتا بفرستیم.
توی websocket کانکشن ما همیشه وصله و هروقت که بخوایم دیتا میفرستیم. از طرف دیگه یه function باید داشته باشیم که هر پیامی توی وب‌سوکت برامون اومد، اون تابع صدا زده بشه و دیتا بهش فرستاده بشه که یه کاری رو انجام بده.


تمام این پروتکلها توی زبان برنامه نویسی که انتخاب میکنید به طور پیشفرض هستن (یا باید یه لایبرری ساده براش صدا بزنید) و نیازی به دونستن زیرساختشون نیست. ولی اگه زیرساختها رو بدونید برنامه نویس بهتری میشید.

3 Likes