آموزش‌های کلادفلر به‌زودی در این بخش قرار داده می‌شود.

دسته: شبکه

  • آیا شرکت‌های VPN امکان شنود اطلاعات ما را دارند؟

    برای اینکه به درک کامل از اصل موضوع برسیم بهتره از مفهوم اصلی یعنی رمزنگاری یا Encryption شروع کنیم.

    تصور کنید میخواید یه نامه خیلی مهم و خصوصی برای دوستتون بفرستید. این نامه رو میذارید تو پاکت و میدید به پستچی. حالا تو مسیر، هر کسی میتونه این پاکت رو باز کنه و نامه‌تون رو بخونه. این دقیقا مثل وقتیه که اطلاعاتتون بدون هیچ محافظی تو اینترنت جابجا میشه.

    حالا رمزنگاری میاد چیکار میکنه؟ مثل این میمونه که شما و دوستتون از قبل یه زبان رمزی بین خودتون اختراع کرده باشید. شما نامه‌تون رو به اون زبان رمزی مینویسید. حالا اگه پستچی یا هر کس دیگه‌ای پاکت رو باز کنه، فقط یه سری نوشته‌های بی‌معنی و عجیب غریب میبینه. فقط دوست شماست که کلید رمزگشایی این زبان رو بلده و میتونه نامه رو بخونه.

    به زبان فنی‌تر، رمزنگاری یه روشه که با استفاده از الگوریتم‌های ریاضی، اطلاعات شما رو به شکلی درمیاره که برای بقیه غیرقابل فهم باشه. فقط کسی که «کلید» درست رو داشته باشه میتونه اون اطلاعات رو به حالت اول برگردونه و بخونه. هر چی این الگوریتم‌ها پیچیده‌تر باشن، رمزنگاری قوی‌تره و شکستنش تقریبا غیرممکن میشه.

    HTTPS چیه و چطوری از ما محافظت میکنه؟

    احتمالا وقتی آدرس یه سایت رو تو مرورگرتون نگاه میکنید، اولش یه HTTP یا HTTPS دیدید. اون «S» آخر HTTPS خیلی مهمه و مخفف کلمه Secure یا «امن» هست.

    HTTPS در واقع یه پروتکل یا یه سری قانونه برای ارتباط بین مرورگر شما و سرور اون وب‌سایتی که دارید ازش بازدید میکنید. وقتی یه سایت از HTTPS استفاده میکنه، یعنی تمام اطلاعاتی که بین شما و اون سایت رد و بدل میشه، رمزنگاری شده.

    این رمزنگاری از نوع «سر به سر» یا End-to-End هست. یعنی اطلاعات از لحظه‌ای که از مرورگر شما خارج میشن تا وقتی که به سرور اون سایت میرسن، کاملا قفل و رمزنگاری شده باقی میمونن.

    TLS، قهرمان پشت پرده HTTPS

    پروتکل رمزنگاری که HTTPS ازش استفاده میکنه اسمش TLS هست که مخفف Transport Layer Security یا «امنیت لایه انتقال» هست. کار اصلی TLS اینه که مطمئن بشه ارتباط بین شما و سایت کاملا خصوصیه و کسی نمیتونه شنودش کنه.

    پس وقتی میگن ۹۵ درصد ترافیک اینترنت رمزنگاری شده، منظورشون همین استفاده گسترده از HTTPS هست. این خیلی خوبه، چون یعنی وقتی دارید ایمیلتون رو چک میکنید، تو شبکه‌های اجتماعی پست میذارید یا خرید آنلاین میکنید، اطلاعاتی مثل نام کاربری، رمز عبور یا شماره کارت بانکیتون از دید جاسوس‌ها مخفی میمونه.

    پس با وجود HTTPS دیگه مشکلی نداریم؟

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

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

    اطلاعاتی که HTTPS اونها رو مخفی نمیکنه شامل این موارد میشه:

    • آدرس IP شما: این مثل آدرس خونه شما تو دنیای اینترنته.
    • موقعیت فیزیکی شما: کشور و شهری که ازش به اینترنت وصل شدید.
    • اطلاعات مرورگر و سیستم عاملتون: مثلا اینکه از کروم روی ویندوز ۱۱ استفاده میکنید.
    • آدرس سایت‌هایی که بازدید میکنید: محتوای صفحه‌ها رمزنگاری شده، ولی اینکه شما به چه سایتی وصل شدید (مثلا youtube.com) مشخصه.

    این اطلاعات شاید به نظر بی‌اهمیت بیان، ولی خیلی باارزش هستن. شرکت ارائه‌دهنده اینترنت شما (یا همون ISP)، دولت‌ها، شرکت‌های تبلیغاتی و حتی هکرها میتونن با استفاده از این اطلاعات، یه پروفایل کامل از شما بسازن، علایقتون رو بفهمن، شما رو ردیابی کنن یا حتی بهتون حمله کنن.

    مثلا ISP شما نمیتونه ببینه شما تو یوتیوب دقیقا چه ویدیویی میبینید، ولی میدونه که شما به یوتیوب وصل شدید و چقدر حجم مصرف کردید. این یعنی حریم خصوصی شما هنوز کامل نیست. اینجا دقیقا جاییه که VPN وارد داستان میشه.

    بخش سوم: VPN چیه و چرا بهش نیاز داریم؟

    VPN مخفف Virtual Private Network یا «شبکه خصوصی مجازی» هست. کار اصلی VPN اینه که یه تونل امن و رمزنگاری شده بین دستگاه شما (کامپیوتر یا موبایل) و یه سرور دیگه تو یه جای دنیا ایجاد کنه. بعد از اون، تمام ترافیک اینترنت شما از داخل این تونل رد میشه.

    بیاید به مثال نامه برگردیم. یادتونه گفتیم HTTPS خود نامه رو رمزنگاری میکنه ولی آدرس فرستنده و گیرنده روی پاکت معلومه؟ VPN میاد اون پاکت نامه رو هم میذاره داخل یه جعبه قفل‌دار دیگه. حالا دیگه حتی پستچی (که اینجا همون ISP شماست) هم نمیدونه این جعبه از کجا اومده و به کجا میره. فقط میدونه یه جعبه از طرف شما به یه آدرس خاص (که همون سرور VPN هست) فرستاده شده.

    VPN در مقابل HTTPS: تفاوت‌های کلیدی

    هم VPN و هم HTTPS از رمزنگاری استفاده میکنن، ولی هدف و کارکردشون خیلی با هم فرق داره.

    • محدوده پوشش: HTTPS فقط ترافیک بین مرورگر شما و یه وب‌سایت خاص رو رمزنگاری میکنه. ولی VPN تمام ترافیک اینترنتی که از دستگاه شما خارج میشه رو رمزنگاری میکنه. فرقی نمیکنه دارید وب‌گردی میکنید، بازی آنلاین میکنید، ایمیل میفرستید یا از هر اپلیکیشن دیگه‌ای استفاده میکنید.
    • مخفی کردن هویت: HTTPS آدرس IP شما رو مخفی نمیکنه و سایت‌ها هنوزم میتونن موقعیت مکانی شما رو ببینن. ولی VPN آدرس IP شما رو با آدرس IP سرور خودش جایگزین میکنه. این یعنی برای سایت‌ها اینطور به نظر میرسه که شما از یه شهر یا کشور دیگه به اینترنت وصل شدید. به این کار میگن IP address obfuscation.

    پس به طور خلاصه:

    ویژگیHTTPSVPN
    چی رو رمزنگاری میکنه؟فقط ارتباط مرورگر با وب‌سایتتمام ترافیک اینترنتی دستگاه
    آدرس IP رو مخفی میکنه؟نهبله
    از دید ISP چی معلومه؟آدرس سایتی که بازدید میکنیدفقط اینکه به یه سرور VPN وصل شدید

    گفتن اینکه چون HTTPS داریم پس به VPN نیازی نیست، مثل این میمونه که بگیم چون بیشتر خونه‌ها دزد نمیزنه، پس نیازی به نصب دزدگیر نداریم. برای امنیت کسب‌وکار یا اطلاعات شخصی حساس، همیشه بهتره که از لایه‌های امنیتی بیشتری استفاده کنیم.

    چرا به VPN نیاز داریم؟ یکم عمیق‌تر بشیم

    دلایل زیادی برای استفاده از VPN وجود داره که اینجا به چندتا از مهم‌ترین‌هاش اشاره میکنیم:

    1. حفظ حریم خصوصی از ISP و دولت: همونطور که گفتیم، ISP شما میتونه ببینه به چه سایت‌هایی سر میزنید. تو بعضی کشورها، ISPها قانونا مجبورن این اطلاعات رو ثبت و ضبط کنن و در صورت لزوم در اختیار دولت قرار بدن. VPN جلوی این کار رو میگیره.
    2. امنیت در شبکه‌های وای‌فای عمومی: وقتی تو کافه، فرودگاه یا هتل به وای‌فای عمومی وصل میشید، تو یه شبکه ناامن قرار دارید. یه هکر که به همون شبکه وصله، میتونه به راحتی اطلاعات شما رو شنود کنه. VPN با رمزنگاری کردن تمام ترافیکتون، شما رو از این خطر محافظت میکنه.
    3. دور زدن محدودیت‌های جغرافیایی: خیلی از سرویس‌های استریم مثل نتفلیکس یا یوتیوب، محتوای متفاوتی رو بر اساس موقعیت جغرافیایی شما نشون میدن. با VPN میتونید به یه سرور تو یه کشور دیگه وصل بشید و به محتوای مخصوص اون کشور دسترسی پیدا کنید.
    4. جلوگیری از محدودیت سرعت (Throttling): بعضی از ISPها وقتی میبینن شما دارید حجم زیادی برای استریم ویدیو یا دانلود مصرف میکنید، عمدا سرعت اینترنت شما رو کم میکنن. چون VPN فعالیت شما رو از دید ISP مخفی میکنه، اونها نمیتونن بفهمن دارید چیکار میکنید و در نتیجه نمیتونن سرعتتون رو محدود کنن. (البته اخیرا تو آمریکا قوانینی برای بی‌طرفی نت تصویب شده که جلوی این کار رو میگیره، ولی هنوز به دلایل دیگه‌ای مثل رسیدن به سقف مصرف ماهانه، این اتفاق میفته).
    5. محافظت از هویت: اطلاعات هویتی شما (PII) مثل تاریخ تولد، شماره ملی و اطلاعات بیومتریک خیلی ارزشمندن. VPN با رمزنگاری این اطلاعات، جلوی سرقت اونها در حین انتقال رو میگیره.

    آیا VPN میتونه ترافیک SSL من رو شنود کنه؟

    خب، تا اینجا فهمیدیم که VPN ما رو از دید ISP مخفی میکنه. ولی یه سوال مهم پیش میاد: خود سرویس‌دهنده VPN چی؟ آیا اون میتونه ببینه ما داریم چیکار میکنیم؟

    جواب کوتاه و ساده اینه: VPN نمیتونه ترافیک رمزنگاری شده با SSL/TLS (مثل HTTPS) رو رمزگشایی کنه.

    بیاید این سناریو رو تصور کنیم: شما میخواید از طریق VPN به سایت بانکتون که HTTPS هست وصل بشید.

    1. ترافیک از مرورگر شما خارج میشه و از قبل توسط HTTPS رمزنگاری شده (نامه داخل پاکت رمزنگاری شده).
    2. نرم‌افزار VPN روی کامپیوتر شما این بسته رمزنگاری شده رو میگیره و دوباره رمزنگاریش میکنه (پاکت رمزنگاری شده رو میذاره داخل یه جعبه قفل‌دار دیگه).
    3. این بسته دابل-رمزنگاری شده به سرور VPN فرستاده میشه.
    4. سرور VPN لایه رمزنگاری خودش رو باز میکنه (قفل جعبه رو باز میکنه).
    5. حالا سرور VPN با بسته اصلی که هنوز با HTTPS رمزنگاری شده مواجهه (پاکت رمزنگاری شده). سرور VPN کلید رمزگشایی HTTPS رو نداره، پس نمیتونه محتوای اون رو ببینه.
    6. سرور VPN این بسته رو به سمت سایت بانک میفرسته.

    پس در حالت عادی، VPN نمیتونه ببینه شما تو سایت بانکتون چه اطلاعاتی وارد میکنید. ارتباط شما با سایت بانک به صورت «سر به سر» رمزنگاری شده و VPN فقط یه واسطه تو این مسیره.

    یک اما، حمله مرد میانی (Man-in-the-Middle)

    درسته که VPN در حالت عادی نمیتونه ترافیک SSL شما رو بخونه، ولی چون کل ترافیک شما داره از سرورهای اون عبور میکنه، در موقعیتی قرار داره که میتونه یه نوع حمله به اسم Man-in-the-Middle (MITM) یا «مرد میانی» رو اجرا کنه.

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

    بیاید ببینیم یه VPN چطوری میتونه این کار رو بکنه:

    1. شما میخواید به سایت google.com وصل بشید.
    2. درخواست شما به سرور VPN میرسه.
    3. سرور VPN بدذات، به جای اینکه شما رو مستقیم به گوگل وصل کنه، خودش به گوگل وصل میشه.
    4. بعدش برمیگرده به شما و میگه «سلام، من گوگل هستم!». برای اینکه شما حرفش رو باور کنید، یه گواهی SSL جعلی بهتون میده.
    5. اگه مرورگر شما این گواهی جعلی رو قبول کنه، یه ارتباط HTTPS امن با سرور VPN برقرار میکنه (در حالی که شما فکر میکنید با گوگل ارتباط دارید).
    6. حالا شما هر اطلاعاتی بفرستید، اول به سرور VPN میرسه. اونجا رمزگشایی میشه، خونده میشه و بعد دوباره با گواهی اصلی گوگل رمزنگاری میشه و برای سرور اصلی گوگل فرستاده میشه.

    در این حالت، VPN مثل یه جاسوس دو جانبه عمل میکنه و میتونه تمام اطلاعات شما رو به صورت متن ساده (Plain text) ببینه.

    چطوری از حمله MITM جلوگیری میشه؟

    اینجاست که نقش «مراجع صدور گواهی» یا Certificate Authorities (CA) خیلی مهم میشه. اینها شرکت‌های معتبری هستن که هویت واقعی وب‌سایت‌ها رو تایید میکنن و بهشون گواهی SSL/TLS میدن. مرورگر شما یه لیست از این CAهای معتبر رو میشناسه.

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

    به عبارتی اگه توی مرورگر هشدار SSL نگیرید و مرورگرتون آپدیت باشه نیازی به نگرانی نیست.

    پس بیشتر حملات MITM با چک کردن دقیق گواهی سایت‌ها قابل شناسایی هستن.

    پس در جواب به سوال اصلی یه VPN نمیتونه SSL رو بشکنه، و با رعایت نکاتی حمله MITM رو میشه خنثی کرد.

    به کی اعتماد کنیم؟ VPN یا ISP؟

    حالا که فهمیدیم هم ISP و هم VPN پتانسیل دیدن فعالیت‌های ما رو دارن (البته به شکل‌های مختلف)، سوال اینه که کدومشون خطر کمتری دارن؟

    این یه تصمیم شخصیه و بستگی به این داره که شما بیشتر نگران کی هستید.

    • ISP و دولت: ISP شما معمولا یه شرکت بزرگه که تحت قوانین کشور شما فعالیت میکنه. این یعنی مجبوره از قوانین حفظ داده‌ها پیروی کنه و در عین حال، اگه دولت دستور بده، باید اطلاعات شما رو در اختیارشون بذاره.
    • سرویس VPN: یه سرویس VPN معمولا یه شرکت خصوصیه که مدل کسب‌وکارش بر اساس حفظ حریم خصوصی شما بنا شده. شما بهشون پول میدید که از اطلاعاتتون در برابر ISP و بقیه محافظت کنن.

    در کل با نصب وی‌پی‌ان ، شما دارید اعتماد رو از ISP خودتون به یه شرکت دیگه منتقل میکنید.

    اهمیت سیاست «عدم ثبت لاگ» (No-logs Policy)

    اینجا یکی از مهم‌ترین ویژگی‌های یه VPN خوب مشخص میشه: سیاست عدم ثبت لاگ.

    یه VPN معتبر ادعا میکنه که هیچ‌گونه گزارشی (لاگ) از فعالیت‌های آنلاین شما ثبت نمیکنه. این یعنی حتی اگه دولت یا هر نهاد دیگه‌ای با حکم دادگاه ازشون اطلاعات شما رو بخواد، اونها چیزی برای ارائه ندارن چون از اول چیزی رو ثبت نکردن.

    البته باید به این ادعاها با احتیاط نگاه کرد. خیلی از VPNها میگن لاگ نگه نمیدارن، ولی تو سیاست‌های حریم خصوصیشون تبصره‌هایی وجود داره. بهترین VPNها اونهایی هستن که سیاست عدم ثبت لاگشون توسط شرکت‌های حسابرسی مستقل تایید شده باشه.

    نکته مهم دیگه، محل ثبت شرکت VPN هست. بعضی از کشورها (مثل سوئیس) قوانین حریم خصوصی بسیار سختی دارن و شرکت‌ها رو مجبور به ثبت لاگ نمیکنن. در مقابل، کشورهایی که عضو اتحادهای اطلاعاتی مثل Five Eyes، Nine Eyes یا 14 Eyes هستن، ممکنه شرکت‌های مستقر در خاکشون رو مجبور کنن که اطلاعات کاربراشون رو با دولت‌های عضو به اشتراک بذارن.

    پس انتخاب یه VPN قابل اعتماد که سیاست عدم ثبت لاگ شفاف و تایید شده‌ای داره و در یه کشور با قوانین حریم خصوصی خوب مستقره، حیاتیه.

    ISP من دقیقا چی میبینه وقتی از VPN استفاده میکنم؟

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

    بدون VPN:

    ISP شما تمام این موارد رو میبینه و ثبت میکنه:

    • شما به موتور جستجوی گوگل وصل شدید.
    • عبارت «ماشین‌های کلاسیک» رو جستجو کردید.
    • روی لینک سایت‌های classic-cars.com و old-beauties.net کلیک کردید.
    • به سایت یوتیوب وصل شدید و یه ویدیو با حجم ۵۰۰ مگابایت تماشا کردید.
    • تمام این فعالیت‌ها از آدرس IP شما (مثلا 92.114.56.78) انجام شده.

    با VPN:

    حالا ببینیم با وجود VPN چه اتفاقی میفته:

    • ISP شما میبینه که شما یه اتصال رمزنگاری شده به یه آدرس IP خاص (مثلا 203.0.113.10 که متعلق به سرور VPN هست) برقرار کردید.
    • میبینه که شما دارید یه حجم مشخصی از داده (مثلا ۵۵۰ مگابایت) به این سرور میفرستید و ازش دریافت میکنید.
    • همین. ISP شما نمیدونه شما چه چیزی جستجو کردید، به چه سایت‌هایی سر زدید یا چه ویدیویی دیدید. تمام این فعالیت‌ها داخل اون تونل رمزنگاری شده مخفی هستن.

    این جدول به خوبی این تفاوت رو نشون میده:

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

    ISP چطوری میفهمه من از VPN استفاده میکنم؟

    شاید براتون سوال بشه که ISP چطوری متوجه استفاده از VPN میشه. چند تا راه وجود داره:

    1. آدرس IP سرور: تمام ترافیک شما به سمت یه آدرس IP خاص هدایت میشه. این رفتار با وب‌گردی عادی که ترافیک به ده‌ها سرور مختلف فرستاده میشه، فرق داره.
    2. پورت‌های شبکه: پروتکل‌های مختلف VPN از پورت‌های خاصی استفاده میکنن. مثلا OpenVPN معمولا از پورت 1194 و WireGuard از پورت 51820 استفاده میکنه. ISP با مانیتور کردن این پورت‌ها میتونه بفهمه شما از چه نوع VPN استفاده میکنید.
    3. بررسی عمیق بسته‌ها (DPI): روش‌های پیشرفته‌تری هم وجود داره که ISP میتونه ساختار بسته‌های رمزنگاری شده شما رو تحلیل کنه و حتی اگه از پورت‌های رایج مثل 443 (پورت HTTPS) استفاده کنید، بفهمه که این ترافیک مربوط به VPN هست.

    البته اینکه ISP میفهمه شما از VPN استفاده میکنید، به خودی خود مشکل بزرگی نیست (مگر در کشورهایی که استفاده از VPN غیرقانونیه). مهم اینه که نمیتونه محتوای فعالیت شما رو ببینه.

    انواع VPN و پروتکل‌ها، یه نگاه فنی‌تر

    تا اینجا کلی در مورد VPN حرف زدیم. ولی همه VPNها مثل هم نیستن. بیاید یه کم فنی‌تر بهشون نگاه کنیم.

    انواع VPN بر اساس کاربرد

    • VPN شخصی (Remote Access): این همون نوع رایج VPN هست که بیشتر ما استفاده میکنیم. شما کامپیوتر یا موبایلتون رو به یه سرور راه دور وصل میکنید تا ترافیکتون رو امن کنید.
    • VPN تجاری (Business VPN): این نوع VPN برای شرکت‌ها طراحی شده. هدف اصلیش اینه که کارمندهایی که از راه دور یا از شعبه‌های مختلف کار میکنن، بتونن به صورت امن به شبکه داخلی شرکت دسترسی داشته باشن. این VPNها معمولا ویژگی‌های بیشتری دارن مثل:
      • احراز هویت دو مرحله‌ای (2FA)
      • ورود یکپارچه (SSO)
      • کنترل دسترسی مبتنی بر اعتماد صفر (Zero-Trust)
      • ثبت لاگ دسترسی‌ها (برای اهداف امنیتی شرکت)
      • فیلتر کردن DNS

    پروتکل‌های مختلف VPN: مزایا و معایب

    پروتکل‌ها مثل زبان‌های مختلفی هستن که VPN برای انتقال داده ازشون استفاده میکنه. هر کدوم ویژگی‌های خاص خودشون رو دارن.

    • OpenVPN:
      • مزایا: متن‌بازه (Open-source) و خیلی امنه. چون جامعه بزرگی دائما در حال بررسی و بهبودش هستن، میشه بهش اعتماد کرد.
      • معایب: به خاطر لایه‌های امنیتی زیاد، ممکنه یه کم از بقیه کندتر باشه.
    • PPTP:
      • مزایا: خیلی سریعه.
      • معایب: یکی از قدیمی‌ترین پروتکل‌هاست و دیگه امن حساب نمیشه. هکرها به خوبی باهاش آشنان. بهتره ازش استفاده نکنید.
    • L2TP/IPsec:
      • مزایا: از PPTP امن‌تره چون داده‌ها رو دوبار کپسوله میکنه و سرعت خوبی هم داره.
      • معایب: به تنهایی کار نمیکنه و باید با IPsec ترکیب بشه. بعضی از شبکه‌ها به راحتی میتونن مسدودش کنن.
    • SSTP:
      • مزایا: از رمزنگاری قوی AES استفاده میکنه و چون از پورت 443 (همون پورت HTTPS) استفاده میکنه، به سختی میشه مسدودش کرد و شبیه ترافیک عادی وب به نظر میرسه.
      • معایب: توسط مایکروسافت ساخته شده و متن‌باز نیست. این نگرانی وجود داره که ممکنه درهای پشتی (Backdoors) برای دسترسی مایکروسافت یا دولت‌ها داشته باشه.
    • IKEv2:
      • مزایا: از OpenVPN سریع‌تره و میتونه از رمزنگاری AES هم استفاده کنه.
      • معایب: راه‌اندازیش روی سرور یه کم سخته و فایروال‌ها میتونن مسدودش کنن.
    • WireGuard:
      • مزایا: پروتکل جدید، خیلی سریع و مدرنیه که به عنوان جایگزین OpenVPN طراحی شده. متن‌باز هم هست.
      • معایب: چون نسبتا جدیده، هنوز به اندازه OpenVPN توسط جامعه امنیتی تست نشده.

    به طور کلی، OpenVPN و WireGuard امن‌ترین و بهترین گزینه‌ها برای استفاده روزمره هستن.

    بخش هشتم: چطور یه VPN خوب انتخاب کنیم؟

    حالا که این همه اطلاعات داریم، چطوری باید یه VPN مناسب انتخاب کنیم؟ اینجا یه چک‌لیست از مواردی که باید بهشون دقت کنید براتون آماده کردم:

    1. سیاست عدم ثبت لاگ: همونطور که گفتم، این مهم‌ترین فاکتوره. دنبال VPNهایی باشید که سیاست no-logs شفافی دارن و این سیاست توسط یه شرکت ثالث معتبر تایید شده باشه.
    2. محل استقرار شرکت (Jurisdiction): شرکتی رو انتخاب کنید که تو کشوری با قوانین حریم خصوصی قوی (خارج از اتحادهای 5/9/14 Eyes) مستقر باشه.
    3. رمزنگاری و پروتکل‌ها: مطمئن بشید که از رمزنگاری قوی مثل AES-256 و پروتکل‌های امن مثل OpenVPN یا WireGuard پشتیبانی میکنه.
    4. کلید توقف اضطراری (Kill Switch): این یه ویژگی حیاتیه. اگه اتصال VPN شما به هر دلیلی قطع بشه، Kill Switch به طور خودکار کل اینترنت دستگاه شما رو قطع میکنه تا هیچ داده‌ای به صورت ناخواسته و بدون محافظت نشت نکنه.
    5. محافظت در برابر نشت DNS (DNS Leak Protection): گاهی اوقات درخواست‌های DNS (که آدرس سایت‌ها رو به IP تبدیل میکنن) از تونل VPN خارج میشن و ISP شما میتونه اونها رو ببینه. یه VPN خوب باید جلوی این نشت رو بگیره.
    6. سرورهای مبهم‌ساز (Obfuscated Servers): تو بعضی کشورها یا شبکه‌ها که ترافیک VPN رو مسدود میکنن، این سرورها ترافیک VPN رو طوری تغییر میدن که شبیه ترافیک عادی HTTPS به نظر برسه و قابل شناسایی نباشه.
    7. سرعت و تعداد سرورها: تعداد زیاد سرور در کشورهای مختلف به شما گزینه‌های بیشتری برای اتصال میده و از شلوغی سرورها جلوگیری میکنه. سرعت هم که مشخصه، هیچکس VPN کند رو دوست نداره.
    8. ویژگی‌های اضافی: مواردی مثل Split Tunneling (که به شما اجازه میده انتخاب کنید کدوم اپ‌ها از VPN استفاده کنن و کدوم نکنن) یا Multi-hop (که ترافیک شما رو از دو سرور VPN عبور میده برای امنیت بیشتر) میتونن مزیت‌های خوبی باشن.
    9. قیمت و سیاست بازگشت وجه: VPNهای رایگان معمولا گزینه‌های خوبی نیستن چون اغلب با فروش اطلاعات شما هزینه‌هاشون رو درمیارن یا امنیت ضعیفی دارن. دنبال یه VPN با قیمت مناسب و سیاست بازگشت وجه منصفانه (مثلا ۳۰ روزه) باشید.
    10. پشتیبانی از استریم و تورنت: اگه برای این کارها به VPN نیاز دارید، مطمئن بشید که VPN مورد نظرتون با سرویس‌های استریم مثل نتفلیکس کار میکنه و اجازه دانلود از تورنت رو میده.

    آیا VPN من رو کاملا ناشناس میکنه؟ محدودیت‌ها و تصورات غلط

    یکی از بزرگترین تصورات غلط در مورد VPN اینه که شما رو صد در صد ناشناس (Anonymous) میکنه. این درست نیست. VPN حریم خصوصی (Privacy) شما رو به شدت افزایش میده، ولی ناشناس بودن کامل یه داستان دیگه‌ست.

    چند تا نکته مهم که باید بدونید:

    • کوکی‌ها و ردیاب‌ها: VPN نمیتونه کوکی‌هایی که از قبل روی مرورگر شما ذخیره شدن رو پاک کنه. وب‌سایت‌ها هنوزم میتونن با استفاده از این کوکی‌ها شما رو شناسایی کنن.
    • لاگین کردن به حساب‌ها: وقتی با VPN به حساب گوگل، فیسبوک یا هر حساب دیگه‌ای که با هویت واقعی شما مرتبطه وارد میشید، دیگه ناشناس نیستید. اون سرویس دقیقا میدونه شما کی هستید، فقط فکر میکنه از یه جای دیگه وصل شدید.
    • نرم‌افزار VPN: خود نرم‌افزاری که روی کامپیوترتون نصب میکنید، یه ریسک محسوب میشه. اگه به شرکت سازنده‌ش اعتماد نداشته باشید، اون نرم‌افزار میتونه یه بدافزار باشه که فعالیت‌های شما رو ثبت میکنه.
    • ویروس‌ها و بدافزارها: VPN شما رو در برابر ویروس‌ها و حملات فیشینگ محافظت نمیکنه. برای این کار هنوز به یه آنتی‌ویروس خوب و عادات وب‌گردی امن نیاز دارید.

    برای ناشناس بودن کامل، ابزارهای دیگه‌ای مثل مرورگر Tor وجود دارن که ترافیک شما رو از طریق سه لایه رمزنگاری و چندین سرور داوطلبانه در سراسر جهان عبور میدن. البته Tor معمولا خیلی کندتر از VPN هست و برای استفاده روزمره مناسب نیست.

    پرسش و پاسخ‌

    ۱. اگه فقط تو خونه و با شبکه امن خودم وب‌گردی میکنم، بازم به VPN نیاز دارم؟
    HTTPS برای وب‌گردی عادی تو خونه معمولا کافیه، مخصوصا اگه اطلاعات خیلی حساسی وارد نمیکنید. ولی یادتون باشه که ISP شما هنوزم میتونه ببینه به چه سایت‌هایی میرید. اگه میخواید این اطلاعات رو هم از دید ISP مخفی نگه دارید، استفاده از VPN حتی تو خونه هم مفیده.

    ۲. VPN بهتره یا حالت Incognito (ناشناس) مرورگر؟
    این دو تا کار کاملا متفاوتی انجام میدن. حالت Incognito یا Private Browsing فقط جلوی ذخیره شدن تاریخچه وب‌گردی، کوکی‌ها و اطلاعات فرم‌ها رو روی دستگاه خودتون میگیره. این حالت، فعالیت شما رو از دید ISP، رئیس‌تون یا سایت‌هایی که بازدید میکنید مخفی نمیکنه. VPN از اون طرف، فعالیت شما رو از دید دنیای بیرون مخفی میکنه. بهترین کار اینه که از هر دو با هم استفاده کنید.

    ۳. آیا VPNهای رایگان امن هستن؟
    ممکنه امن باشن ولی معمولا اداره کردن یه سرویس VPN هزینه زیادی داره. شرکت‌هایی که سرویس رایگان ارائه میدن باید از یه راهی این هزینه رو جبران کنن. این راه معمولا یکی از این موارده:

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

    همیشه میگن «اگه برای محصولی پول نمیدی، خودت محصول هستی». این جمله در مورد VPNهای رایگان خیلی صدق میکنه. البته بعضی از شرکت‌های وی‌پی‌ان از دولت‌ها فاند دریافت میکنن مثلا عموما کشورهایی که با آمریکا مشکل دارن، فیلترینگ شدیدی دارن و اینجا دولت آمریکا تلاش میکنه با حمایت مالی از شرکت‌های VPN، دولت‌های رقیب رو تحت فشار بذاره.

    ۴. آیا ISP میتونه VPN من رو مسدود یا کند کنه؟
    بله. بعضی از ISPها، مخصوصا تو کشورهایی با محدودیت اینترنت، ممکنه سعی کنن ترافیک VPN رو شناسایی و مسدود کنن. اینجا همون سرورهای مبهم‌ساز (Obfuscated Servers) به کار میان. در مورد کند کردن سرعت، ISPها میتونن ترافیک VPN رو کند کنن، ولی از طرف دیگه، VPN میتونه جلوی کند کردن سرعت بر اساس نوع فعالیت (مثلا استریم) رو بگیره.

    ۵. اگه به یه نرم‌افزار VPN که از طرف کارفرما یا یه کلاینت نصب شده اعتماد نداشته باشم، چیکار کنم؟
    این یه نکته خیلی مهمه. شما با نصب یه نرم‌افزار روی کامپیوترتون، بهش دسترسی‌های زیادی میدید. اگه اون نرم‌افزار فقط یه کلاینت VPN ساده نباشه و نرم‌افزارهای دیگه‌ای همراهش نصب شده باشن، ممکنه بتونه تمام فعالیت‌های شما رو روی کامپیوتر (نه فقط ترافیک شبکه) زیر نظر بگیره. بهترین کار اینه که اگه مجبور به استفاده از چنین نرم‌افزاری هستید، اون رو روی یه دستگاه جداگانه یا یه ماشین مجازی (VM) نصب کنید تا به کامپیوتر اصلیتون دسترسی نداشته باشه.

    ۶. آیا دولت میتونه من رو از طریق VPN ردیابی کنه؟
    دولت میتونه از ISP شما بپرسه که آیا شما از VPN استفاده میکنید یا نه، و ISP هم میتونه این رو تایید کنه. ولی اگه از یه VPN معتبر با سیاست عدم ثبت لاگ استفاده کنید، دولت نمیتونه از طریق VPN بفهمه شما چیکار کردید. البته این در مورد تحقیقات هدفمند روی یه شخص خاص فرق میکنه. اگه دادگاهی به یه شرکت VPN (حتی تو سوئیس) حکم بده که شروع به ثبت لاگ برای یه کاربر خاص بکنه، اونها مجبور به اطاعت هستن (البته تو بعضی کشورها مثل سوئیس، این کار خیلی سخته و تقریبا غیرممکنه). ولی چون لاگ‌های قبلی وجود ندارن، فقط میتونن فعالیت‌های آینده رو ثبت کنن.

    ۷. آیا خود شرکت VPN میتونه داده‌های من رو ببینه؟
    از نظر فنی، بله. چون ترافیک شما از سرورهای اونها عبور میکنه، پتانسیل دیدن اطلاعات رمزگشایی شده (ترافیکی که HTTPS نیست) رو دارن. به همین دلیله که اعتماد به شرکت VPN و سیاست عدم ثبت لاگش اینقدر مهمه. یه شرکت معتبر، سیستم‌هاش رو طوری طراحی میکنه که حتی کارمندهای خودشون هم نتونن به اطلاعات کاربرها دسترسی داشته باشن.

    منابع

    • [2] Can my VPN see my internet activity? – Proton VPN | Proton VPN
    • [4] Here’s what your ISP sees when you’re using a VPN – Surfshark
    • [6] Do VPNs Hide Search & Browsing History? | Security.org
    • [8] networking – Can an untrusted VPN client monitor my network activity? – Super User
    • [10] networking – Can an untrusted VPN client monitor my network activity? – Super User
    • [12] How Do VPNs Protect Your Privacy? Our VPN Overview – Privacy Guides
    • [1] logging – Is it possible to decrypt SSL traffic on OpenVPN server? – Server Fault
    • [3] Man-in-the-Middle (MITM) Attack – Google Suche
    • [5] tls – Can a VPN decrypt my SSL traffic? – Information Security Stack Exchange
    • [7] VPN vs HTTPS: Why VPN when most online traffic is encrypted?
    • [9] Do You Still Need VPN If You Use HTTPS?
    • [11] Is a VPN Encrypted & Does it Encrypt All Traffic? | Security.org
  • طوفان برادکست یا Broadcast Storm

    طوفان برادکست یا Broadcast Storm

    «طوفان برادکست» یا Broadcast Storm. تصور کنید توی یک سالن بزرگ و شلوغ هستید. اگه بخواید با دوستتون که اون سر سالن ایستاده حرف بزنید، دو تا راه دارید. راه اول اینه که اسمش رو صدا بزنید تا فقط اون برگرده و جوابتون رو بده. این مثل ترافیک عادی توی شبکه است. اما راه دوم اینه که برید روی سن، بلندگو رو بردارید و حرفتون رو فریاد بزنید تا «همه» کسایی که توی سالن هستن بشنون. به این کار دوم توی دنیای شبکه میگن برادکست (Broadcast).

    گاهی وقتا این فریاد زدن‌ها یا همون ارسال پیام‌های برادکست لازمه. مثلا وقتی یک کامپیوتر جدید به شبکه وصل میشه، یه جورایی داد میزنه و میگه: «سلام به همگی، من اینجام، کسی می‌تونه به من یک آدرس بده؟». این یک استفاده خوب و مفید از برادکسته. اما حالا تصور کنید که یک نفر بلندگو رو برداره و شروع کنه به فریاد زدن یک کلمه، و بعد بقیه هم همون کلمه رو تکرار کنن و دوباره فریاد بزنن. چند ثانیه بعد، کل سالن پر میشه از همهمه و فریادهای تکراری و دیگه هیچ‌کس صدای هیچ‌کس دیگه‌ای رو نمی‌شنوه. مکالمه‌های عادی و دونفره کاملا غیرممکن میشه.

    این دقیقا همون بلاییه که طوفان برادکست سر یک شبکه کامپیوتری میاره. بهش «تشعشع برادکست» (Broadcast Radiation) هم میگن. این اتفاق زمانی میفته که حجم پیام‌های برادکست و یه نوع دیگه از پیام به اسم مالتی‌کست (Multicast) – که مثل صدا زدن یک گروه خاص از آدم‌ها توی اون سالنه – اون‌قدر زیاد میشه که شبکه رو به مرز فلج شدن می‌رسونه. این طوفان منابع شبکه، مثل پهنای باند و قدرت پردازش دستگاه‌ها، رو جوری مصرف می‌کنه که دیگه جایی برای ترافیک عادی و روزمره باقی نمی‌مونه. در نتیجه، شبکه شما عملا از کار میفته و دیگه نمی‌تونه داده‌های معمولی رو جابجا کنه.

    جالبه بدونید که بعضی وقتا به اون بسته‌ یا پکت اولیه‌ای که باعث شروع این جهنم میشه، یک لقب خاص دادن: «پکت چرنوبیل» (Chernobyl packet). این اسم‌گذاری به خاطر فاجعه اتمی چرنوبیل انجام شده، چون این پکت هم مثل اون اتفاق، یک واکنش زنجیره‌ای فاجعه‌بار رو توی شبکه شروع می‌کنه که کنترل کردنش خیلی سخته.

    فصل دوم: مقصر اصلی کیه؟ رایج‌ترین دلیل طوفان

    خب، حالا که فهمیدیم طوفان برادکست چیه، سوال اصلی اینه که چی باعثش میشه؟ در بیشتر موارد، مقصر اصلی یک اشتباه ساده در ساختار فیزیکی شبکه است که بهش میگن «لوپ سوییچینگ» (Switching Loop).

    سوییچ چیه و لوپ چطور به وجود میاد؟

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

    اما داستان برای پیام‌های برادکست فرق می‌کنه. وقتی یک سوییچ یک پیام برادکست دریافت می‌کنه، وظیفه‌اش اینه که اون پیام رو از «تمام پورت‌هاش» به جز پورتی که پیام ازش اومده، بفرسته بیرون. اینجاست که مشکل شروع میشه.

    یک لوپ سوییچینگ یعنی ما بین دو تا دستگاه توی شبکه، بیش از یک مسیر ارتباطی ایجاد کنیم. ساده‌ترین مثالش اینه: یک کابل شبکه بردارید و دو سرش رو به دو تا پورت مختلف روی «همون یک سوییچ» وصل کنید. شاید به نظرتون احمقانه بیاد، ولی این اتفاق خیلی بیشتر از چیزی که فکر می‌کنید میفته، مخصوصا توی شبکه‌های بزرگ که کلی کابل اینور و اونور ریخته.

    حالا ببینیم با وصل کردن این کابل چه اتفاقی میفته:

    1. یک کامپیوتر یک پیام برادکست (مثلا همون پیام «سلام به همگی») رو به سوییچ می‌فرسته.
    2. سوییچ طبق وظیفه‌اش، این پیام رو از تمام پورت‌هاش کپی و ارسال می‌کنه. دو تا از این پورت‌ها، همون پورت‌هایی هستن که شما با یک کابل به هم وصلشون کردید.
    3. پس پیام برادکست از پورت شماره ۱ خارج میشه، وارد کابل لوپ میشه و از طریق همون کابل، دوباره به پورت شماره ۲ «وارد» سوییچ میشه.
    4. حالا سوییچ فکر می‌کنه یک پیام برادکست جدید از پورت شماره ۲ گرفته! پس دوباره طبق وظیفه‌اش، اون رو از تمام پورت‌های دیگه‌اش، از جمله پورت شماره ۱، می‌فرسته بیرون.
    5. این پیام دوباره وارد کابل لوپ میشه و برمی‌گرده به پورت شماره ۲.
    6. این چرخه تا ابد ادامه پیدا می‌کنه. هر بار که این پیام توی این حلقه می‌چرخه، یک کپی جدید ازش ساخته و در کل شبکه پخش میشه.

    ظرف چند میلی‌ثانیه، شبکه شما با میلیون‌ها کپی از یک پیام برادکست یکسان پر میشه. این همون طوفان برادکسته.

    چرا این بسته‌ها برای همیشه می‌چرخن؟

    شاید بپرسید مگه بسته‌های شبکه یک تاریخ انقضا ندارن که بعد از مدتی از بین برن؟ سوال خیلی خوبیه. بسته‌هایی که بین شبکه‌های مختلف (مثلا در اینترنت) جابجا میشن و روترها اونها رو مدیریت می‌کنن، یک چیزی به اسم (Time to Live (TTL دارن. این TTL یک عدده که با عبور از هر روتر، یکی ازش کم میشه. وقتی این عدد به صفر برسه، اون بسته از بین میره تا برای همیشه در اینترنت سرگردان نمونه.

    اما مشکل اینجاست که ما اینجا داریم در مورد لایه ۲ (Layer 2) شبکه صحبت می‌کنیم، یعنی ارتباطات داخل یک شبکه محلی که توسط سوییچ‌ها مدیریت میشه. فریم‌های اترنت (Ethernet frames) که در این لایه کار می‌کنن، توی هدر یا سربرگشون چیزی به اسم TTL ندارن. در نتیجه، وقتی یک فریم توی یک توپولوژی حلقه‌ای یا لوپ‌دار گیر میفته، هیچ مکانیسمی برای از بین بردنش وجود نداره و می‌تونه تا ابد به چرخیدن ادامه بده. این دقیقا مثل یک قطار روی یک ریل دایره‌ای شکله که هیچ‌وقت متوقف نمیشه.

    فصل سوم: وقتی طوفان عمدی به پا میشه! (حملات DoS)

    تا اینجا در مورد طوفان‌هایی صحبت کردیم که معمولا به خاطر یک اشتباه انسانی یا یک مشکل سخت‌افزاری به وجود میان. اما گاهی وقتا، یک نفر عمدا یک طوفان برادکست راه میندازه تا یک شبکه رو از کار بندازه. به این نوع حملات میگن حملات «منع سرویس» یا (Denial of Service – DoS). هدف این حملات اینه که یک سرویس یا یک شبکه رو اون‌قدر مشغول کنن که دیگه نتونه به کاربران واقعی سرویس بده.

    دو تا از معروف‌ترین حملاتی که از این تکنیک استفاده می‌کنن، حمله اسمرف (Smurf Attack) و حمله فراگل (Fraggle Attack) هستن. این حملات از یک تکنیک هوشمندانه به اسم «تقویت بسته» (packet amplification) استفاده می‌کنن. بیاید ببینیم چطوری کار می‌کنه:

    1. انتخاب قربانی: اول از همه، مهاجم یک قربانی رو انتخاب می‌کنه. این قربانی می‌تونه یک سرور، یک وب‌سایت یا حتی یک کامپیوتر شخصی باشه.
    2. جعل آدرس منبع: مهاجم شروع به ارسال یک عالمه بسته به یک شبکه بزرگ می‌کنه. اما یک حقه کثیف میزنه: آدرس «فرستنده» یا منبع (source address) این بسته‌ها رو به جای آدرس خودش، آدرس کامپیوتر «قربانی» جا میزنه. به این کار میگن (Spoofing).
    3. ارسال به آدرس برادکست: مهاجم این بسته‌های جعلی رو به جای اینکه به یک کامپیوتر خاص بفرسته، به آدرس برادکست (broadcast address) اون شبکه می‌فرسته. این آدرس مثل یک آدرس پستی عمومیه که وقتی نامه‌ای بهش فرستاده بشه، به تمام خانه‌های اون محله تحویل داده میشه.
    4. شروع طوفان: حالا چی میشه؟ وقتی این بسته‌ها به شبکه مقصد می‌رسن، «تمام» کامپیوترهای اون شبکه فکر می‌کنن که یک نفر (که به اشتباه فکر می‌کنن همون قربانیه) ازشون یک درخواستی داشته. پس همگی با هم شروع می‌کنن به جواب دادن به اون درخواست. اما این جواب‌ها رو برای کی می‌فرستن؟ برای آدرس منبعی که توی بسته‌ها دیده بودن، یعنی آدرس کامپیوتر «قربانی».

    فرض کنید توی اون شبکه ۱۰۰ تا کامپیوتر وجود داشته باشه. مهاجم فقط «یک» بسته می‌فرسته، اما در جواب، «صد تا» بسته به سمت قربانی سرازیر میشه. به همین خاطر بهش میگن حمله تقویتی. مهاجم با ارسال حجم زیادی از این درخواست‌ها، یک طوفان عظیم از جواب‌ها رو به سمت قربانی هدایت می‌کنه.

    مکانیزم دقیق‌تر حمله اسمرف

    در حمله اسمرف، بسته‌ای که مهاجم می‌فرسته از نوع ICMP Echo Request هست. این همون درخواستیه که وقتی شما از دستور ping استفاده می‌کنید، فرستاده میشه. مثل اینه که شما داد بزنید «هی، اونجایی؟» و منتظر جواب «آره، اینجام» باشید. مهاجم یک عالمه درخواست پینگ با آدرس جعلی قربانی به آدرس برادکست یک شبکه می‌فرسته. در نتیجه، تمام کامپیوترهای اون شبکه شروع می‌کنن به پینگ کردن قربانی. این سیل عظیم ترافیک باعث میشه:

    • پهنای باند شبکه قربانی کاملا پر بشه.
    • پردازنده یا CPU کامپیوتر قربانی درگیر پردازش این همه جواب بشه.
    • و در نهایت، ممکنه سیستم قربانی کاملا از کار بیفته یا به اصطلاح کرش کنه.

    حمله فراگل هم دقیقا همین ساختار رو داره، با این تفاوت که به جای بسته‌های ICMP، از بسته‌های UDP استفاده می‌کنه.

    طوفان در دنیای بی‌سیم (Wi-Fi)

    این حملات فقط مخصوص شبکه‌های سیمی نیستن. توی شبکه‌های وایرلس هم میشه یک نوع حمله DoS بر پایه برادکست راه انداخت. یکی از این حملات، حمله برادکست قطع اتصال (Disassociation Broadcast Attack) نام داره.

    مکانیزمش اینطوریه:
    توی یک شبکه وای‌فای، دستگاهی که اینترنت رو پخش می‌کنه اکسس پوینت (Access Point) نام داره. وقتی یک کامپیوتر یا موبایل می‌خواد از شبکه جدا بشه، یک بسته به اسم «بسته قطع اتصال» (disassociation packet) برای اکسس پوینت می‌فرسته.
    حالا مهاجم می‌تونه یک بسته قطع اتصال بسازه، آدرس فرستنده‌اش رو جعل کنه و آدرس اکسس پوینت رو به جاش بذاره. بعد این بسته جعلی رو به آدرس برادکست شبکه وای‌فای می‌فرسته.
    نتیجه چی میشه؟ تمام دستگاه‌هایی که به اون وای‌فای وصل هستن، این پیام رو دریافت می‌کنن و فکر می‌کنن که خود اکسس پوینت بهشون دستور داده که اتصالشون رو قطع کنن. در نتیجه، همه کامپیوترها و موبایل‌ها یک‌دفعه از وای‌فای قطع میشن. این کار باعث یک هرج و مرج بزرگ در شبکه بی‌سیم میشه.

    فصل چهارم: چطور جلوی طوفان رو بگیریم؟ (راهکارهای پیشگیری و کنترل)

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

    ۱. مقابله با لوپ‌های سوییچینگ

    همونطور که گفتیم، لوپ‌ها مقصر اصلی طوفان‌های اتفاقی هستن. برای مقابله با اونها، پروتکل‌ها و تکنولوژی‌های هوشمندی طراحی شدن:

    • پروتکل درخت پوشا (Spanning Tree Protocol – STP): این پروتکل یک جورایی پلیس راهنمایی و رانندگی شبکه‌های لایه ۲ هست. وقتی STP روی سوییچ‌ها فعال باشه، سوییچ‌ها با هم حرف می‌زنن و یک نقشه کامل از شبکه تهیه می‌کنن. اگه ببینن که بین دو نقطه، چند تا مسیر مختلف وجود داره (یعنی لوپ)، هوشمندانه یکی از مسیرها رو به صورت موقت «مسدود» یا بلاک می‌کنن. این کار باعث میشه که همیشه فقط یک مسیر فعال برای رسیدن به هر مقصدی وجود داشته باشه و جلوی به وجود اومدن حلقه گرفته بشه. البته همونطور که جلوتر در یک داستان واقعی خواهیم دید، بعضی از مدیران شبکه به خاطر پیچیدگی‌ها یا مشکلاتی که در گذشته باهاش داشتن، از فعال کردنش خودداری می‌کنن.
    • تکنولوژی‌های جدیدتر: به جز STP، راهکارهای مدرن‌تری هم وجود داره. مثلا agregación de enlaces (Link Aggregation) به شما اجازه میده چند تا کابل فیزیکی رو با هم ترکیب کنید تا به عنوان یک لینک منطقی و پرسرعت‌تر کار کنن که این کار هم به مدیریت بهتر مسیرها کمک می‌کنه. پروتکل Shortest Path Bridging هم یک جایگزین پیشرفته برای STP هست که مسیرها رو بهینه‌تر انتخاب می‌کنه.
    • حفاظت در شبکه‌های خاص (Metro Ethernet): در شبکه‌های بزرگ شهری که به صورت حلقه‌ای (Ring) طراحی میشن، از پروتکل‌های خاصی مثل Ethernet Ring Protection Switching (ERPS) یا Ethernet Automatic Protection System (EAPS) استفاده میشه که مخصوص جلوگیری از لوپ در این نوع معماری‌ها هستن.

    ۲. استفاده از تجهیزات لایه ۳ (روترها)

    یک راه حل اساسی برای محدود کردن دامنه طوفان، استفاده از روترها (Routers) هست. یادتونه گفتیم سوییچ‌ها در لایه ۲ کار می‌کنن و روترها در لایه ۳؟ یک تفاوت کلیدی بین این دو اینه که روترها به طور پیش‌فرض پیام‌های برادکست رو از خودشون عبور نمیدن.

    یک سوییچ وقتی پیام برادکست می‌گیره، اون رو برای همه پورت‌هاش می‌فرسته. اما یک روتر وقتی یک پیام برادکست از یک شبکه (مثلا شبکه داخلی شرکت شما) دریافت می‌کنه، اون رو به شبکه دیگه (مثلا اینترنت) ارسال نمی‌کنه. هر شبکه‌ای که به یک پورت روتر وصل میشه، یک «دامنه برادکست» (Broadcast Domain) جداگانه محسوب میشه. طوفان برادکست فقط می‌تونه توی همون دامنه‌ای که به وجود اومده پخش بشه و نمی‌تونه از روتر عبور کنه و به شبکه‌های دیگه سرایت کنه.
    پس با تقسیم کردن یک شبکه بزرگ به چند تا شبکه کوچیک‌تر و وصل کردن اونها به هم از طریق روتر، می‌تونیم تاثیر یک طوفان رو خیلی محدود کنیم. بعضی از سوییچ‌های پیشرفته هم هستن که می‌تونن کارهای شبیه روتر انجام بدن و بهشون (Brouter) میگن.

    ۳. تقسیم‌بندی منطقی شبکه با VLAN

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

    فرض کنید یک سوییچ ۴۸ پورت دارید. می‌تونید پورت‌های ۱ تا ۱۲ رو عضو VLAN شماره ۱۰ (مثلا مخصوص بخش مالی) کنید، پورت‌های ۱۳ تا ۲۴ رو عضو VLAN شماره ۲۰ (مخصوص بخش فروش) و به همین ترتیب. با اینکه همه این پورت‌ها روی یک دستگاه فیزیکی هستن، اما کامپیوترهای بخش مالی فقط می‌تونن با هم حرف بزنن و کامپیوترهای بخش فروش هم فقط با هم. این دو گروه کاملا از هم ایزوله هستن، انگار که به دو تا سوییچ جدا وصل شدن.
    مهم‌ترین نکته اینه که هر VLAN یک دامنه برادکست جداگانه برای خودش ایجاد می‌کنه. پس اگه توی VLAN بخش مالی یک طوفان برادکست به وجود بیاد، این طوفان فقط و فقط همون ۱۲ تا پورت رو درگیر می‌کنه و به VLAN بخش فروش یا بقیه قسمت‌های شبکه سرایت نمی‌کنه. این کار مثل اینه که به جای یک سالن بزرگ، چند تا اتاق کوچیک و ضدصدا درست کنیم. همهمه توی یک اتاق، مزاحم بقیه اتاق‌ها نمیشه.

    ۴. کنترل طوفان روی خود سوییچ‌ها

    خیلی از سوییچ‌های مدیریتی (Managed Switches) یک قابلیت خیلی به درد بخور به اسم «کنترل طوفان برادکست» (Broadcast Storm Control) دارن. این قابلیت مثل یک فیوز یا قطع‌کننده مدار عمل می‌کنه.

    شما می‌تونید برای سوییچ یک آستانه یا (Threshold) تعریف کنید. مثلا بهش بگید: «اگه دیدی بیشتر از ۲۰ درصد از پهنای باند یک پورت رو ترافیک برادکست اشغال کرده، حتما یه کاسه‌ای زیر نیم‌کاسه است». وقتی سوییچ این وضعیت رو تشخیص بده، به طور موقت ارسال تمام ترافیک برادکست از اون پورت رو متوقف می‌کنه یا به شدت محدودش می‌کنه.

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

    ۵. پیکربندی روترها و فایروال‌ها برای حملات عمدی

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

    ۶. یک مورد خاص: شبکه‌های موبایلی Ad Hoc

    در شبکه‌های خاصی مثل MANET یا (Mobile Ad Hoc Network) که دستگاه‌ها (مثلا موبایل‌ها) بدون نیاز به اکسس پوینت مستقیما به هم وصل میشن، پیدا کردن مسیر برای ارسال داده یک چالش بزرگه. برای این کار، دستگاه‌ها بسته‌هایی به اسم RREQ یا (Route Request) رو به صورت برادکست ارسال می‌کنن تا بهترین مسیر به مقصد رو پیدا کنن. این بسته‌ها هم می‌تونن باعث طوفان برادکست بشن و با بسته‌های داده واقعی برای استفاده از کانال ارتباطی رقابت کنن. یک راه حل برای این مشکل اینه که الگوریتم‌هایی طراحی بشه که جلوی بازپخش (rebroadcasting) بی‌مورد این بسته‌ها رو توسط همه دستگاه‌ها بگیره تا از افزونگی و تصادم کم بشه.

    فصل پنجم: داستان یک روز جهنمی در مدرسه (یک مطالعه موردی واقعی)

    تئوری کافیه، بیاید بریم سراغ یک داستان واقعی که برای یک مدیر شبکه به اسم «دن» اتفاق افتاده. این داستان در یک فروم اینترنتی به اسم Spiceworks Community مطرح شده و به ما نشون میده که یک طوفان برادکست در دنیای واقعی چقدر می‌تونه گیج‌کننده و وحشتناک باشه.

    صحنه جرم: یک مدرسه بزرگ

    محل وقوع داستان یک مدرسه است با حدود ۹۰۰ دستگاه کامپیوتری و تقریبا ۶۰ تا سوییچ شبکه. بیشتر این سوییچ‌ها از برند Netgear و مدل‌های GS724T، GSM7224 و GSM7328S هستن. این مدرسه برای شبکه وای‌فای خودش هم از سیستم Meru و چند تا سوییچ PoE (که برق رو از طریق کابل شبکه منتقل می‌کنن) استفاده می‌کنه.
    دن، مدیر شبکه، میگه که در حال فعال‌سازی قابلیتی به اسم IGMP Snooping بوده (که برای مدیریت بهتر ترافیک مالتی‌کست استفاده میشه) اما هنوز روی همه سوییچ‌ها فعالش نکرده. یک نکته خیلی مهم هم میگه: «ما پروتکل STP رو روشن نکردیم، چون بهمون گفته بودن که می‌تونه باعث مشکلات دیگه‌ای بشه.» این تصمیم، همونطور که می‌بینیم، قراره براشون گرون تموم بشه.

    شروع فاجعه: اولین روز مدرسه

    داستان از اولین روز بازگشایی مدارس شروع میشه. همه چیز عادیه. بچه‌ها رمزهاشون رو فراموش کردن، بعضی کامپیوترها به خاطر نقاشی کلاس‌ها قطع شدن و تیم IT مشغول حل این مشکلات روزمره است. همه چیز خوب پیش میره تا اینکه… ناگهان، ۱۰ دقیقه قبل از ناهار، کل شبکه مدرسه قطع میشه!
    فکرش رو بکنید، دقیقا موقعی که صندوق‌های فروش غذای سلف مدرسه (که اونها هم به شبکه وصل بودن) بیشترین کار رو دارن. حتی سیستم تلفن مدرسه که برای مدیریت از راه دور به شبکه وصل بود هم از کار میفته (البته سیستم تلفن از نوع استاندارد بوده نه VOIP).
    دن یک صحنه عجیب رو توصیف می‌کنه: چراغ‌های تمام ۶۰ تا سوییچ شبکه، همگی با هم، با یک ریتم ثابت و یکنواخت در حال چشمک زدن بودن. این یکی از کلاسیک‌ترین علائم یک طوفان برادکست تمام‌عیاره. انگار که تمام دستگاه‌های شبکه داشتن با هم فریاد می‌زدن.

    تحقیقات کارآگاه «دن»

    دن که یک مدیر شبکه باتجربه است، سریع دست به کار میشه. اولین فکرش اینه که یک طوفان برادکست اتفاق افتاده. پس میره سراغ ابزاری به اسم (Wireshark). وایرشارک مثل یک دستگاه شنود برای شبکه است. هر بسته‌ای که از کارت شبکه شما رد میشه رو ضبط می‌کنه و بهتون نشون میده. دن انتظار داشت که با یک سیل از بسته‌های برادکست مواجه بشه و شاید بتونه آدرس IP کامپیوتری که این طوفان رو شروع کرده پیدا کنه.

    اما چیزی که می‌بینه خیلی عجیب‌تره: به جای بسته‌های برادکست عادی، وایرشارک یک سیل عظیم از بسته‌های ICMPv6 رو نشون میده. این خیلی عجیبه، چون دن میگه: «ما فقط از IPv4 استفاده می‌کنیم…».

    • توضیح سریع: IPv4 و IPv6 دو نسخه از پروتکل اینترنت هستن. IPv4 از آدرس‌های ۳۲ بیتی (مثل 192.168.1.10) استفاده می‌کنه و IPv6 از آدرس‌های ۱۲۸ بیتی که خیلی طولانی‌تر و پیچیده‌ترن. بیشتر شبکه‌ها هنوز از IPv4 استفاده می‌کنن، اما سیستم‌عامل‌های جدید به طور پیش‌فرض IPv6 رو هم فعال دارن.

    دیدن این همه ترافیک IPv6 روی یک شبکه IPv4، دن رو به شک میندازه. آیا ممکنه این یک حمله DoS باشه؟ اون تا حالا از نزدیک یک حمله واقعی ندیده بود و این سناریو براش جدید بود.

    تلاش برای مهار طوفان

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

    خودش و مدیر ارشد شبکه هم سعی می‌کنن منبع مشکل رو پیدا کنن. اونها با قطع کردن کابل‌های فیبر نوری اصلی که بخش‌های مختلف مدرسه رو به هم وصل می‌کرد، سعی داشتن طوفان رو به یک قسمت از مدرسه محدود کنن. اما نتیجه باز هم گیج‌کننده بود: «وقتی یک لینک فیبر نوری رو قطع می‌کردیم، تفاوت زیادی توی چشمک زدن چراغ‌های دو طرف لینک نمی‌دیدیم. چطور ممکنه یک طوفان برادکست روی دو نیمه جدا شده از شبکه تاثیر بذاره؟» این سوال خیلی مهمیه. تنها توضیح منطقی این بود که در هر دو نیمه جدا شده از مدرسه، یک لوپ جداگانه وجود داشته باشه که خیلی بعید به نظر می‌رسید.

    راه‌حل نهایی: خاموشی بزرگ!

    تیم شبکه که حسابی کلافه شده بود، به یک احتمال دیگه فکر می‌کنه. اونها قبلا دیده بودن که بعد از قطع و وصل شدن برق، بعضی وقتا یکی دو تا از سوییچ‌هاشون قاطی می‌کنن و همین‌طور چراغ‌هاشون چشمک می‌زنه و با یک ری‌استارت ساده درست میشن. اما این بار مشکل در سطح کل شبکه بود و گزارش‌های UPS (منبع برق اضطراری) هم هیچ نوسان برقی رو نشون نمی‌داد.
    با این حال، به عنوان یک تیر در تاریکی، تصمیم می‌گیرن سوییچ‌های یک رک (که ۴-۵ تا سوییچ توش بود) رو ری‌استارت کنن. اما فایده‌ای نداشت. به محض اینکه سوییچ‌ها بالا اومدن، چشمک زدن هماهنگ چراغ‌ها دوباره شروع شد.

    در نهایت، به تنها راه‌حل باقی‌مونده متوسل شدن: خاموش کردن «تمام» سوییچ‌های شبکه.
    بعد از خاموش کردن همه چیز، شروع کردن به روشن کردن سوییچ‌ها، اما با یک ترتیب خاص: اول از همه سوییچی که به گیت‌وی اصلی (default gateway) یا راه خروج شبکه به اینترنت وصل بود، و بعد رک به رک و لایه به لایه به سمت پایین. در تمام این مدت، یک پینگ مداوم به سمت گیت‌وی اصلی در جریان بود تا ببینن کی ارتباط برقرار میشه.
    بعد از اینکه آخرین رک هم روشن شد، همه چیز به حالت عادی برگشت. چراغ‌های سوییچ‌ها نرمال شدن و شبکه دوباره کار می‌کرد. پینگ هم حتی یک بار قطع نشد.

    یک پایان باز و دلهره‌آور

    دن دوباره وایرشارک رو باز می‌کنه و با فیلتر «ip.proto == ICMPv6» دنبال اون بسته‌های عجیب می‌گرده، اما حتی یک بسته هم پیدا نمی‌کنه. البته تا اون موقع خیلی از کامپیوترها خاموش شده بودن.
    داستان دن با یک نگرانی بزرگ تموم میشه: «نگرانی من اینه که فردا صبح وقتی همه کامپیوترها روشن بشن، ممکنه دقیقا همین مشکل دوباره برامون پیش بیاد.»
    این داستان به ما نشون میده که پیدا کردن ریشه یک طوفان برادکست چقدر می‌تونه سخت و طاقت‌فرسا باشه و حتی بعد از حل موقتی مشکل، هیچ تضمینی برای برنگشتنش وجود نداره، مگر اینکه علت اصلی پیدا و رفع بشه.

    فصل ششم: وقتی طوفان از دنیای مجازی میاد! (مشکلات در محیط‌های مجازی‌سازی)

    تا الان در مورد شبکه‌های فیزیکی با کابل و سوییچ‌های واقعی صحبت کردیم. اما دنیای امروز پر از سرورهای قدرتمندیه که ده‌ها ماشین مجازی (Virtual Machine – VM) رو هم‌زمان اجرا می‌کنن. ماشین مجازی یعنی یک کامپیوتر کامل (با سیستم‌عامل و نرم‌افزار) که به جای اینکه یک کیس سخت‌افزاری جدا داشته باشه، به صورت نرم‌افزاری داخل یک سرور فیزیکی بزرگ اجرا میشه. این محیط‌های مجازی هم شبکه خودشون رو دارن که بهش میگن سوییچ مجازی (virtual switch). و بله، طوفان برادکست می‌تونه از این دنیا هم شروع بشه.

    بیاید یک مورد واقعی دیگه رو بررسی کنیم که در فروم پشتیبانی سیسکو (Cisco Community) مطرح شده.

    صحنه جرم: یک دیتاسنتر پیشرفته

    محیط این داستان یک دیتاسنterه که از تجهیزات پیشرفته سیسکو به اسم UCS استفاده می‌کنه. اونها دو تا دستگاه اصلی به اسم Fabric-Interconnect 9296 دارن که مثل مغز متفکر شبکه برای سرورها عمل می‌کنن. روی سرورهای تیغه‌ای (Blade Servers) اونها، نرم‌افزار مجازی‌سازی ESXi نصبه و کلی ماشین مجازی روشون در حال اجراست.

    شروع مشکل: مقصر، یک ماشین مجازی بود!

    یک روز، شبکه این شرکت دچار مشکلات جدی میشه. بعد از دو ساعت عیب‌یابی و بررسی، تیم شبکه به یک نتیجه باورنکردنی می‌رسن: منبع کل مشکلات یک ماشین مجازی بوده که روی یکی از سرورهای ESXi نصب شده بود.
    این ماشین مجازی جوری پیکربندی شده بود که خودش مثل یک «سوییچ مجازی» عمل می‌کرد. یک تنظیم اشتباه یا یک باگ در این VM باعث شده بود که شروع به تولید و پخش حجم وحشتناکی از ترافیک برادکست در کل اون زیرشبکه (subnet) بکنه. این ترافیک اون‌قدر زیاد بود که کل شبکه رو مختل کرده بود.
    راه‌حل فوری چی بود؟ اونها به سادگی اون ماشین مجازی رو خاموش کردن (Power Off). به محض خاموش شدن VM، همه چیز به حالت عادی برگشت.

    سوال اصلی: چطور در آینده جلوی این اتفاق رو بگیریم؟

    حالا مدیر شبکه یک سوال مهم می‌پرسه: «چطور می‌تونیم جلوی تکرار همچین اتفاقی رو در آینده بگیریم؟ من می‌دونم که روی تجهیزات شبکه فیزیکی، ما دستوری مثل BPDU Guard روی پورت‌های کاربرا فعال می‌کنیم تا جلوی لوپ رو بگیره، اما اینجا توی محیط مدیریت سیسکو UCSM چی کار می‌تونم بکنم؟»

    پاسخ‌های یک متخصص به اسم «کرک» (Kirk) خیلی آموزنده است و به ما نشون میده که مدیریت شبکه در دنیای مجازی چالش‌های خاص خودش رو داره.

    توصیه‌های متخصص برای محیط‌های مجازی

    کرک چند تا نکته کلیدی رو توضیح میده:

    1. مکانیسم‌های داخلی UCSM کافی نیستن: کرک میگه که خود سیستم‌های UCSM/FI سیسکو به طور پیش‌فرض مکانیسم‌هایی برای جلوگیری از لوپ دارن، مثل deja vu check و RPF check. این سیستم‌ها جلوی ایجاد لوپ‌های ساختاری در شبکه رو می‌گیرن. اما، اگه یک ماشین مجازی خودش شروع به تولید سیل‌آسای ترافیک برادکست بکنه (که بهش میگن هاست یا میزبان بدرفتار – misbehaving host)، تجهیزات Fabric Interconnect تقصیری ندارن. وظیفه اونها اینه که فریم‌ها رو با حداکثر سرعت تحویل بدن. پس اگه یک VM شروع به فریاد زدن کنه، FI هم اون فریادها رو خیلی سریع و کارآمد در کل شبکه پخش می‌کنه!
    2. راه‌حل مستقیم وجود نداره: هیچ تنظیم مستقیمی روی کارت شبکه مجازی (vNIC) یک VM وجود نداره که بتونه جلوی ایجاد لوپ یا بریج (bridging) در سطح سیستم‌عامل اون VM رو بگیره. اگه شما داخل یک ویندوز سرور مجازی، دو تا کارت شبکه مجازی رو به هم بریج کنید، یک لوپ ایجاد کردید و تجهیزات بیرونی به سادگی نمی‌تونن جلوش رو بگیرن.
    3. بهترین راهکارها (Best Practices): به جای یک دکمه جادویی، باید روی طراحی درست و پیکربندی صحیح تمرکز کرد:
      1. محدود کردن VLANها: یکی از بهترین کارها اینه که روی کارت شبکه‌های مجازی، فقط و فقط VLANهایی رو مجاز کنید که اون ماشین مجازی واقعا بهشون احتیاج داره. کرک میگه خیلی از مشتری‌ها در ابتدای طراحی، چون دقیقا نمی‌دونن هر سرور به چه VLANهایی نیاز داره، همه VLANها رو روی پروفایل سرورها مجاز می‌کنن. این کار خیلی خطرناکه. چون اگه یک طوفان در یک VLAN اتفاق بیفته، این ترافیک به تمام سرورهایی که اون VLAN روشون مجازه ارسال میشه، حتی اگه بهش نیازی نداشته باشن. این کار سطح حمله و تاثیر طوفان رو به شدت افزایش میده. محدود کردن VLANها مثل اینه که به جای دادن شاه‌کلید ساختمون به هر کارمند، فقط کلید اتاق خودش رو بهش بدید.
      2. پیدا کردن منبع با وایرشارک: دوباره اسم وایرشارک به میون میاد. کرک تاکید می‌کنه که باید ترافیک رو ضبط و تحلیل کنید تا بفهمید دقیقا چه نوع ترافیکیه، آدرس MAC منبع دقیقش چیه، و در کدوم VLAN داره اتفاق میفته.
      3. مراقب تنظیمات پیچیده باشید: چیزهایی مثل تنظیمات اشتباه در الگوریتم‌های تیمینگ (teaming) سوییچ مجازی، پیکربندی نادرست شبکه‌های لایه ۲ مجزا (disjoint layer 2)، یا مشکلات در سوییچ‌های فیزیکی بالادستی، همگی می‌تونن باعث بشن یک ماشین مجازی نتونه آدرس MAC دستگاه دیگه‌ای رو پیدا کنه و در نتیجه به طور مداوم شروع به ارسال درخواست‌های ARP (که یک نوع برادکسته) بکنه و یک طوفان ARP راه بندازه.
    4. UCS برای سرعت ساخته شده، نه فیلترینگ: کرک یک نکته مهم دیگه رو هم میگه. تجهیزاتی مثل UCSM طوری طراحی شدن که مثل یک کامپیوتر میزبان (end host) رفتار کنن: حداکثر توان عملیاتی (throughput) و سوییچینگ سریع (cut-through switching). این دستگاه‌ها برای فیلتر کردن یا تحلیل عمیق بسته‌ها طراحی نشدن. قابلیت‌هایی مثل Storm Control معمولا روی سوییچ‌ها و روترهای دیگه پیدا میشه، نه روی این تجهیزات مرکزی. پس راه‌حل در طراحی صحیح شبکه است، نه در انتظار داشتن یک قابلیت خاص روی این دستگاه.

    فصل هفتم: یک داستان مجازی دیگر، طوفان ARP و NSX-T

    در ادامه همون بحث در فروم سیسکو، یک کاربر دیگه تجربه مشابه ولی با جزئیات متفاوت‌تری رو به اشتراک میذاره که به ما نشون میده چطور یک تکنولوژی خاص می‌تونه منبع مشکل باشه.

    مشکل: طوفان ARP و فلج شدن روتر

    این کاربر میگه که شرکتشون با یک طوفان ARP مواجه شده. ARP یا (Address Resolution Protocol) پروتکلیه که کامپیوترها برای پیدا کردن آدرس فیزیکی (MAC Address) یکدیگر از روی آدرس منطقی (IP Address) استفاده می‌کنن. درخواست‌های ARP به صورت برادکست ارسال میشن.
    در این مورد، چندین ماشین مجازی با هم شروع به ارسال درخواست‌های ARP با نرخ بسیار بالا کردن. این سیل درخواست‌ها به روتر اصلی یا گیت‌وی بالادستی اونها میرسه و پردازنده روتر اون‌قدر درگیر میشه که شروع به انداختن بسته‌های ARP (dropping ARP) می‌کنه.

    این اتفاق یک اثر دومینویی وحشتناک داشت:

    • چون روتر دیگه نمی‌تونست به درخواست‌های ARP جواب بده، تمام VLANها تحت تاثیر قرار گرفتن. چرا؟ چون قابلیتی که روی روتر ترافیک رو کنترل می‌کرد (policer) برای یک VLAN خاص تنظیم نشده بود و کل ترافیک ARP رو محدود می‌کرد.
    • حتی روی پروتکل‌های مسیریابی داینامیک هم تاثیر گذاشت. وقتی دو تا روتر می‌خوان با هم اطلاعات مسیرها رو رد و بدل کنن، اول باید آدرس MAC همدیگه رو پیدا کنن. وقتی جدول ARP روتر به خاطر طوفان به هم می‌ریخت، این ارتباط هم مختل می‌شد.

    مظنون جدید: NSX-T

    این کاربر یک نکته خیلی جالب رو مطرح می‌کنه. اونها به تازگی در محیط مجازی‌شون از NSX-T (یک پلتفرم مجازی‌سازی شبکه از شرکت VMware) استفاده کرده بودن و ماشین‌های مجازی که این طوفان رو ایجاد کرده بودن، همگی روی پورت‌گروپ‌های NSX-T قرار داشتن.
    فرضیه اونها این بود که شاید یک باگ در NSX-T وجود داره. به نظر می‌رسید که ماشین‌های مجازی به دلایلی جواب ARP رو از گیت‌وی دریافت نمی‌کردن، و به خاطر همین به طور دیوانه‌واری و با یک نرخ خیلی تهاجمی (aggressive rate) به ارسال درخواست ARP ادامه می‌دادن تا بالاخره جواب بگیرن.

    راه‌حل‌های پیاده‌سازی شده

    این تیم هم برای مهار مشکل دست به کار شد:

    1. فعال کردن Storm-Control: اونها روی سوییچ‌های فیزیکی‌شون قابلیت storm-control رو با پایین‌ترین حد ممکن فعال کردن. هرچند این حد هنوز از آستانه کنترلر ARP روی روتر اصلیشون (یک Nexus 7K) بالاتر بود، ولی تا حدی جلوی شدت طوفان رو می‌گرفت.
    2. طراحی یک Policer سفارشی: قدم بعدی و هوشمندانه‌تر اونها این بود که یک کنترلر ترافیک (policer) سفارشی روی روتر نکسوس خودشون بنویسن. این policer طوری طراحی میشه که به طور خاص، ترافیکی که از آدرس‌های MAC متعلق به محیط VMWare میاد رو با یک آستانه پایین‌تر محدود کنه. این یک راه‌حل هدفمند برای کنترل ترافیک از سمت محیط مجازی، بدون تاثیر گذاشتن روی بقیه قسمت‌های شبکه است.

    این دو داستان از دنیای مجازی به ما نشون میدن که با پیچیده‌تر شدن شبکه‌ها و اضافه شدن لایه‌های مجازی‌سازی، پیدا کردن ریشه مشکلات هم پیچیده‌تر میشه و نیاز به دانش عمیق‌تر و ابزارهای تحلیلی دقیق‌تری داره.

    فصل هشتم: پرسش و پاسخ

    سوال ۱: پس طوفان برادکست یه جورایی مثل اسپم یا هرزنامه توی شبکه است، درسته؟

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

    سوال ۲: چرا اصلا این پیام‌های برادکست رو به طور کامل از شبکه‌ها حذف نمی‌کنن تا این مشکلات پیش نیاد؟

    جواب: سوال خیلی خوبیه. دلیلش اینه که برادکست‌ها یک ابزار ضروری و حیاتی برای عملکرد صحیح یک شبکه هستن. بدون اونها، خیلی از کارهای پایه‌ای شبکه غیرممکن میشه. مثلا:

    • پیدا کردن آدرس‌ها (ARP): وقتی کامپیوتر شما می‌خواد با کامپیوتر دیگه‌ای توی همون شبکه حرف بزنه، فقط آدرس IP اون رو می‌دونه. اما برای ارسال واقعی داده روی کابل، به آدرس سخت‌افزاری یا MAC اون نیاز داره. پس یک پیام برادکست به کل شبکه می‌فرسته و می‌پرسه: «هی، کی آدرس IP فلان رو داره؟ لطفا آدرس MAC خودت رو به من بگو.»
    • گرفتن آدرس IP (DHCP): وقتی شما کامپیوترتون رو روشن می‌کنید و به شبکه وصل میشید، کامپیوتر شما هنوز آدرس IP نداره. پس یک پیام برادکست می‌فرسته و داد میزنه: «سلام، من جدیدم، آیا یک سرور DHCP اینجا هست که به من یک آدرس IP بده؟»

    پس ما نمی‌تونیم برادکست‌ها رو حذف کنیم. اونها مثل اعلانات عمومی در یک شهر هستن. مشکل از خود اعلانات نیست، مشکل از وقتیه که این اعلانات به صورت دیوانه‌وار و بی‌پایان تکرار بشن. راه‌حل در مدیریت و کنترل اونهاست، نه حذف کاملشون.

    سوال ۳: فرق اصلی بین یک طوفان اتفاقی (مثل کابل لوپ شده) و یک حمله DoS عمدی چیه؟ از نظر فنی چه تفاوتی دارن؟

    جواب: از نظر تاثیری که روی شبکه میذارن، هر دو می‌تونن فاجعه‌بار باشن و کل شبکه رو از کار بندازن. اما از نظر فنی و انگیزشی، تفاوت‌های اساسی دارن:

    • منبع: در یک لوپ، ترافیک از خود شبکه نشات می‌گیره. یک بسته عادی وارد یک حلقه میشه و بی‌پایان تکرار میشه. در یک حمله DoS مثل اسمرف، ترافیک مخرب توسط یک مهاجم از «بیرون» شبکه تولید میشه و به سمت شبکه شما هدایت میشه.
    • هدف: در لوپ، هیچ هدف و نیت بدی وجود نداره. یک اشتباه انسانی یا سخت‌افزاریه. در حمله DoS، یک نیت مخرب برای از کار انداختن یک قربانی خاص وجود داره.
    • نوع ترافیک: در یک لوپ، معمولا یک یا چند نوع فریم برادکست عادی (مثل ARP یا DHCP) به طور مکرر کپی میشن. در حمله اسمرف، ترافیک به طور خاص از نوع ICMP Echo Request با آدرس جعلیه. در داستان مدرسه، دیدیم که اونها به یک حمله DoS شک کردن چون نوع ترافیک (ICMPv6) خیلی غیرعادی و مشکوک بود.
    • راه‌حل: برای حل مشکل لوپ، باید اون حلقه فیزیکی یا منطقی رو پیدا و حذف کنید (یا از پروتکلی مثل STP استفاده کنید). برای مقابله با حمله DoS، باید ترافیک مخرب رو روی روترها یا فایروال‌های لب مرز شبکه شناسایی و فیلتر کنید.

    سوال ۴: توی داستان مدرسه، چرا واقعا خاموش و روشن کردن ترتیبی سوییچ‌ها کار کرد؟ آیا این یعنی مشکل برای همیشه حل شد؟

    جواب: این یکی از اون سوال‌های میلیون دلاریه! خاموش و روشن کردن ترتیبی سوییچ‌ها به این دلیل کار کرد که حافظه موقت (RAM) و جداول آدرس MAC تمام سوییچ‌ها رو پاک کرد. وقتی همه چیز خاموش میشه، اون طوفان بی‌نهایت از بسته‌ها که در حال چرخیدن بودن، از بین میرن. با روشن کردن ترتیبی از مرکز به سمت لبه‌های شبکه، سوییچ‌ها فرصت پیدا می‌کنن که به آرامی بالا بیان، جدول آدرس‌هاشون رو از نو و به درستی بسازن و با همسایه‌هاشون ارتباط برقرار کنن، بدون اینکه از همون اول با یک سیل ترافیک مواجه بشن.
    اما آیا مشکل برای همیشه حل شد؟ به احتمال خیلی زیاد، نه! این کار مثل ری‌استارت کردن کامپیوتریه که هنگ کرده. شما مشکل فعلی رو حل کردید، اما اگه علت اصلی هنگ کردن یک مشکل نرم‌افزاری یا سخت‌افزاری باشه، اون مشکل دوباره برمی‌گرده. در مورد مدرسه، علت اصلی (که می‌تونست یک کابل لوپ شده، یک کارت شبکه خراب، یک دستگاه بدرفتار یا حتی یک باگ نرم‌افزاری باشه) هنوز پیدا و رفع نشده. به همین دلیله که «دن» نگران بود که فردا صبح با روشن شدن همه کامپیوترها، اون عامل هرچی که هست دوباره فعال بشه و طوفان رو از نو راه بندازه. راه‌حل واقعی، پیدا کردن اون «پکت چرنوبیل» و منبعشه.

    سوال ۵: آیا اینکه یک ماشین مجازی کل شبکه رو از کار بندازه یک چیز عادیه؟ چطور یک برنامه نرم‌افزاری می‌تونه همچین بلایی سر سخت‌افزار بیاره؟

    جواب: این اتفاق شاید «عادی» نباشه، اما قطعا «ممکنه» و با افزایش استفاده از مجازی‌سازی، بیشتر هم دیده میشه. دلیلش اینه که مرز بین نرم‌افزار و سخت‌افزار در شبکه‌های مدرن خیلی کم‌رنگ شده.
    یک ماشین مجازی، هرچند نرم‌افزاریه، اما از طریق کارت شبکه مجازی و سوییچ مجازی به شبکه فیزیکی وصله. اگه این ماشین مجازی (به خاطر یک باگ یا تنظیم اشتباه) شروع به تولید ترافیک شبکه با نرخ بسیار بالا بکنه، از دید سوییچ فیزیکی هیچ فرقی با یک کامپیوتر فیزیکی که همین کار رو می‌کنه نداره. سوییچ فیزیکی فقط یک جریان عظیم از بسته‌ها رو از پورتی که به اون سرور فیزیکی وصله دریافت می‌کنه و طبق وظیفه‌اش، اونها رو در شبکه پخش می‌کنه.
    فکرش رو بکنید، یک سرور فیزیکی مدرن می‌تونه یک اتصال ۱۰ یا حتی ۴۰ گیگابیت بر ثانیه به شبکه داشته باشه. یک ماشین مجازی با یک باگ نرم‌افزاری می‌تونه به راحتی بخش بزرگی از این پهنای باند رو با ترافیک برادکست بی‌فایده پر کنه و یک طوفان عظیم راه بندازه. پس بله، یک «برنامه» می‌تونه کل شبکه «سخت‌افزاری» رو به زانو دربیاره، چون در نهایت این برنامه‌ها هستن که ترافیک شبکه رو تولید می‌کنن.

    سوال ۶: اگه بخواید فقط یک توصیه، یعنی مهم‌ترین توصیه رو برای جلوگیری از این طوفان‌ها به ما بکنید، اون چیه؟

    جواب: اگه قرار باشه فقط یک چیز بگم، اون اینه: «شبکه‌تون رو هوشمندانه تقسیم‌بندی کنید.»
    یک شبکه بزرگ و مسطح (Flat Network) که همه دستگاه‌ها توی یک دامنه برادکست بزرگ قرار دارن، مثل یک انبار باروت می‌مونه. یک جرقه کوچیک (یک لوپ یا یک دستگاه خراب) می‌تونه کل انبار رو منفجر کنه.
    اما اگه شما با استفاده از VLANها و روترها، این شبکه بزرگ رو به چندین جزیره کوچیک و ایزوله تقسیم کنید، تاثیر هر مشکلی به همون جزیره‌ای که توش اتفاق افتاده محدود میشه. این کار بهش میگن «تقسیم‌بندی شبکه» یا (Network Segmentation). این اصل، نه تنها جلوی گسترش طوفان برادکست رو می‌گیره، بلکه از نظر امنیتی هم فوق‌العاده مهمه، چون جلوی حرکت جانبی هکرها در شبکه رو هم می‌گیره.
    پس به جای داشتن یک سالن بزرگ و پرهمهمه، چندین اتاق کوچک و آرام داشته باشید. این بهترین و پایه‌ای‌ترین قدم برای ساختن یک شبکه پایدار و قابل اطمینانه. البته فعال کردن پروتکل‌هایی مثل STP هم در کنارش حیاتیه، اما تقسیم‌بندی درست، معماری شبکه شما رو از پایه محکم می‌کنه.

    منابع

    • [2] Solved: Prevent broadcast storm from VMs under FI – Cisco Community
    • [1] Broadcast storm – Wikipedia
    • [3] Possible Broadcast Storm or DoS? – Networking – Spiceworks Community
  • لیزی لودینگ چیست و گوگل در مورد آن چه می‌گوید

    توی یکی از اپیزودهای پادکست رسمی گوگل به اسم «Search Off the Record» که اپیزود شماره ۹۸ بود و در تاریخ ۲۱ آگوست ۲۰۲۵ منتشر شد، دو تا از مهندس‌های سرشناس گوگل، یعنی مارتین اسپلیت و جان مولر، مفصل در مورد تکنیک‌های لیزی لودینگ و تاثیراتش روی سئو صحبت کردن. این پادکست برای این ساخته شده بود که به خیلی از تصورات اشتباهی که در مورد پیاده‌سازی لیزی لودینگ وجود داره پاسخ بده و یه راهنمای فنی درست و حسابی هم به توسعه‌دهنده‌ها و متخصص‌های سئو بده.

    مارتین اسپلیت، که مهندس روابط با توسعه‌دهنده‌ها توی گوگله، هدف اصلی لیزی لودینگ رو اینطوری توضیح میده: «ایده اصلی لیزی لودینگ اینه که منابع رو فقط وقتی که بهشون نیاز داری بارگذاری کنی، به جای اینکه همه چیز رو همون اول با هم بارگذاری کنی و اینجوری سرعت لود شدن همه چیز رو یکم بیاری پایین و کلی از منابع مختلف مثل باتری و ترافیک شبکه رو هم مصرف کنی».

    حرفش خیلی ساده و منطقیه. یعنی به جای اینکه وقتی وارد یه صفحه میشی، همه عکس‌ها، ویدیوها و محتواهای سنگین، از بالای صفحه گرفته تا پایین‌ترین قسمتش، همون لحظه لود بشن، فقط چیزهایی لود میشن که همون اول جلوی چشم کاربر هستن. بقیه‌اش چی میشه؟ هر وقت کاربر صفحه رو اسکرول کرد و به اون بخش‌ها نزدیک شد، اون موقع لود میشن. مثل این میمونه که شما وارد یه رستوران میشید و به جای اینکه گارسون همه غذاهای منو رو همون لحظه بیاره بذاره روی میزتون، فقط غذایی رو میاره که شما سفارش دادید. اینجوری هم میزتون شلوغ نمیشه و هم منابع آشپزخونه هدر نمیره.

    توی این بحث، تفاوت‌های خیلی مهمی بین پیاده‌سازی درست و غلط لیزی لودینگ مشخص شد. اسپلیت خیلی تاکید کرد که نباید همه عکس‌ها رو لیزی لود کرد و برای این حرفش هم دلایل فنی آورد که چرا این تکنیک باید هوشمندانه و انتخابی به کار بره.

    چرا اینقدر همه دنبال لیزی لودینگ هستن؟

    انگیزه اصلی برای استفاده از این تکنیک، بهینه‌سازی عملکرد سایته، اونم از جنبه‌های مختلف. مارتین اسپلیت توضیح میده که صرفه‌جویی توی منابع فقط به معنی کم کردن زمان لود صفحه نیست و خیلی گسترده‌تره. اون میگه: «شما میخواید از انجام کاری که هیچ نتیجه‌ای نداره جلوگیری کنید. همچنین، اگه کلی منابع غیرضروری داشته باشید، مثلا عکس‌هایی که اگه نباشن هم مقاله مشکلی پیدا نمیکنه، لود کردنشون از همون اول منطقی نیست. چون مرورگر رو درگیر چیزهایی میکنه که شاید آخرش اصلا به کار نیان».

    این حرف یعنی چی؟ یعنی فرض کنید یه مقاله خیلی طولانی با ۲۰ تا عکس دارید. کاربری که وارد صفحه میشه، شاید فقط دو سه پاراگراف اول رو بخونه و از صفحه بره بیرون. اگه شما همه ۲۰ تا عکس رو همون اول لود کنید، پهنای باند و باتری اون کاربر رو برای ۱۷ تا عکسی که هیچوقت ندیده هدر دادید. ولی با لیزی لودینگ، فقط همون عکس‌های اولیه لود میشن و بقیه منتظر میمونن.

    بهینه‌سازی برای موبایل یکی دیگه از دلایل خیلی مهمه. دستگاه‌های موبایل معمولا پهنای باند محدودتر و باتری ضعیف‌تری دارن. توی این شرایط، لود کردن منابع غیرضروری مستقیم روی تجربه کاربری و عملکرد دستگاه تاثیر منفی میذاره. پس لیزی لودینگ برای کاربرای موبایل حکم یه نجات‌دهنده رو داره.

    تکامل تکنولوژی لیزی لودینگ هم نشون میده که شیوه‌های توسعه وب چقدر پخته‌تر شدن. به گفته اسپلیت: «چند سال پیش، دقیق یادم نیست کی، ولی مرورگرها یه ویژگی بومی یا نیتیو برای تگ‌های عکس و آی‌فریم معرفی کردن به اسم loading. با این ویژگی شما میتونید مشخص کنید که منبع به صورت lazy لود بشه و خود مرورگر زحمت کار رو بکشه، به جای اینکه مجبور باشید از یه سری کدهای جاوا اسکریپت برای این کار استفاده کنید».

    این قابلیت داخلی مرورگرها کار رو خیلی خیلی ساده‌تر کرد. مثلا وردپرس، که یکی از بزرگترین سیستم‌های مدیریت محتوا در دنیاست، این قابلیت رو به صورت پیش‌فرض برای همه سایت‌هایی که ازش استفاده میکنن فعال کرد. فلیکس آرنتز از گوگل هم توی این پروژه با وردپرس همکاری کرد تا لیزی لودینگ به یه رفتار استاندارد توی این پلتفرم تبدیل بشه.

    اشتباهات مرگبار در پیاده‌سازی که سئو رو خراب میکنه

    اون پادکست گوگل به چندتا اشتباه خیلی مشخص اشاره کرد که میتونه تاثیر منفی روی سئوی سایت بذاره. بزرگترین اشتباه اینه که لیزی لودینگ رو برای محتوای بالای صفحه یا «above-the-fold» به کار ببرید. مخصوصا برای عکس‌های اصلی یا «هیرو ایمیج‌ها» که کاربر به محض ورود به صفحه میبینتشون.

    اسپلیت دلیل فنی این مشکل رو اینطور توضیح میده: «اگه همه عکس‌ها لیزی لود بشن، یعنی عکس‌هایی که باید فورا دیده بشن هم با تاخیر لود میشن. یه نکته‌ای در مورد لیزی لودینگ وجود داره. مرورگرها چیزی به اسم اسکنر منابع (resource scanner) دارن. کار این اسکنر اینه که دنبال عکس‌ها میگرده و چون میدونه عکس‌ها خیلی مهمن و نبودشون تو چشم میزنه، سعی میکنه هرچه زودتر شروع به لود کردنشون کنه».

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

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

    لیزی لودینگ و تاثیر مستقیم روی سیگنال‌های رتبه‌بندی گوگل

    پیاده‌سازی لیزی لودینگ به طور مستقیم روی معیارهایی به اسم «Core Web Vitals» تاثیر میذاره که این معیارها خودشون سیگنال‌های رتبه‌بندی توی الگوریتم گوگل هستن. یعنی اگه این معیارها رو رعایت نکنید، ممکنه رتبه سایت شما توی نتایج جستجو پایین بیاد. مهم‌ترین ارتباط بین لیزی لودینگ و این معیارها، با معیاری به اسم «Largest Contentful Paint» یا به اختصار LCP هست.

    جان مولر توی اون پادکست مستقیما در مورد تاثیر لیزی لودینگ روی Core Web Vitals پرسید و اسپلیت تایید کرد: «اگه از لیزی لودینگ جایی که باید استفاده نکنید، احتمالا روی بعضی از جنبه‌های Core Web Vitals تاثیر میذاره. به احتمال زیاد روی LCP. جالبه که اگه برای عکس‌هایی که نباید هم ازش استفاده کنید، باز هم LCP تحت تاثیر قرار میگیره. چون باعث میشه نقاشی یا رندر شدن محتوا دیرتر از زمانی که میتونست اتفاق بیفته، انجام بشه».

    معیار LCP زمان لازم برای رندر شدن بزرگترین عنصر محتوایی (مثلا بزرگترین عکس یا بلوک متنی) که در دید کاربر قرار داره رو اندازه میگیره. طبق گزارش‌ها، گوگل برای LCP یه آستانه ۲.۵ ثانیه‌ای رو به عنوان عملکرد «خوب» در نظر میگیره.

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

    البته اسپلیت اشاره میکنه که این تاثیر روی رتبه‌بندی در اکثر موارد خیلی کمه: «این کار یه سری پیامدهای رندرینگ و Core Web Vitals داره که روی رتبه‌بندی تاثیر میذاره، ولی توی اکثر موارد یه فاکتور خیلی خیلی کوچیکه. البته استثنا هم وجود داره، ولی معمولا اونقدرها هم مهم نیست».

    وقتی پیاده‌سازی‌های سفارشی دردسرساز میشن

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

    اسپلیت ریسک ایندکس نشدن رو اینطور توضیح میده: «از طرف دیگه، ایندکس شدن، مخصوصا اگه از یه تکنولوژی سفارشی برای لیزی لودینگ استفاده میکنید، مثل یه کتابخونه یا کدی که خودتون نوشتید، اگه درست انجام نشه خیلی محتمله که روی ایندکس تاثیر بذاره. ما کتابخونه‌های لیزی لودینگ زیادی دیدیم که مثلا از یه چیزی مثل اتریبیوت data.source به جای اتریبیوت source استفاده میکنن».

    مشکل اصلی اینه که سیستم‌های خزنده گوگل این اتریبیوت‌های سفارشی رو نمیشناسن. تگ‌های استاندارد عکس توی HTML از اتریبیوت «src» برای مشخص کردن آدرس عکس استفاده میکنن. بعضی از کتابخونه‌های لیزی لودینگ میان و در زمان بارگذاری اولیه صفحه، از یه اتریبیوت سفارشی مثل «data-src» یا «data-source» استفاده میکنن. بعدا با استفاده از جاوا اسکریپت، وقتی زمان نمایش عکس رسید، محتوای این اتریبیوت رو به اتریبیوت اصلی «src» منتقل میکنن.

    حالا اگه این کتابخونه جاوا اسکریپت به هر دلیلی درست کار نکنه، این جابجایی اتفاق نمیفته. به گفته اسپلیت: «اگه کتابخونه مشکل داشته باشه، ممکنه در نهایت اصلا عکس رو لود نکنه. منظور از لود کردن در اینجا، قرار دادن آدرس واقعی عکس توی اتریبیوت source هست. اگه آدرس توی این اتریبیوت نباشه و توی یه اتریبیوت سفارشی دیگه باشه، ما اون رو پیدا نمیکنیم».

    با وجود این ریسک‌ها، چرا هنوز خیلیا از این کتابخونه‌های سفارشی استفاده میکنن؟ دلیلش اینه که گاهی اوقات این کتابخونه‌ها امکانات پیشرفته‌تری ارائه میدن که لیزی لودینگ بومی مرورگر اون‌ها رو نداره. اسپلیت به چندتا از این کاربردها اشاره میکنه: «شما ممکنه بخواید یه پیش‌نمایش با رزولوشن پایین از عکس رو لود کنید، یا از یه آدرس دیگه یا از یه دیتا یو‌آر‌ال که توی سورس گذاشتید، و بعدا وقتی کاربر به اونجا رسید، اون رو با نسخه باکیفیت اصلی جایگزین کنید».

    چطور بفهمیم لیزی لودینگ درست کار میکنه؟

    متخصص‌های سئو میتونن با استفاده از ابزارهای گوگل سرچ کنسول، کارایی پیاده‌سازی لیزی لودینگ رو بررسی کنن. ابزار «URL Inspection Tool» اصلی‌ترین روش برای تایید پیاده‌سازی صحیح برای انواع محتواست.

    اسپلیت یه فرایند مشخص برای این کار پیشنهاد میکنه: «برید توی سرچ کنسول، از URL Inspection Tool استفاده کنید و به HTML رندر شده نگاه کنید. کاری به اسکرین‌شات نداشته باشید. اگه HTML رندر شده شامل همه آدرس‌های عکس توی اتریبیوت source تگ‌های عکس بود، اگه همه محتوایی که لیزی لود کردید توش بود، مثلا یه ویجت سفارشی یا محتوای دیگه‌ای مثل کامنت‌های زیر مقاله، اگه همه اینها وجود داشتن، پس مشکلی ندارید».

    بررسی HTML رندر شده به شما نشون میده که سیستم‌های گوگل بعد از اجرای کدهای جاوا اسکریپت، محتوای صفحه شما رو چطور میبینن. این دیدگاه با سورس کد اولیه HTML متفاوته، مخصوصا برای صفحاتی که از بارگذاری محتوای پویا استفاده میکنن.

    برای بررسی عملی، جان مولر پیشنهاد میکنه که خروجی HTML رندر شده رو کپی کنید و توش دنبال تگ‌های عکس بگردید تا مطمئن بشید که اتریبیوت «src» اونها به درستی پر شده.

    روش‌های جایگزین دیگه‌ای هم برای این بررسی وجود داره که بیشتر روی نتایج رتبه‌بندی و ایندکس تمرکز دارن. مثلا اگه شما کامنت‌های سایتتون رو لیزی لود میکنید، میتونید با زیر نظر گرفتن دیده شدن سایتتون برای موضوعات خاصی که توی کامنت‌ها بحث شده، بفهمید که آیا محتوای لیزی لود شده به دست گوگل میرسه یا نه.

    ایندکس شدن عکس‌ها هم یه راه دیگه برای تایید این موضوعه. به گفته اسپلیت: «اگه عکس‌ها به صورت انبوه توسط گوگل شناسایی نمیشن، این میتونه به این معنی باشه که لیزی لودینگ عکس‌های شما به درستی پیاده‌سازی نشده».

    لیزی لودینگ ویدیو؛ یه داستان متفاوت

    لیزی لود کردن ویدیوها در مقایسه با عکس‌ها پیچیدگی‌های بیشتری داره. ویدیوها منابع خیلی سنگینی هستن و به همین دلیل لیزی لودینگ براشون خیلی ارزشمنده، ولی پیاده‌سازیش نیاز به برنامه‌ریزی دقیق داره.

    اسپلیت رویکرد فنی این کار رو اینطور توضیح میده: «ویدیوها منابع خیلی سنگینی هستن. خیلی وقتا منطقیه که اول یه عکس پوستر (تصویر پیش‌نمایش) لود بشه و فقط وقتی ویدیو وارد دید کاربر شد، خود ویدیو لود بشه. من معتقدم راه‌هایی توی HTML برای این کار با استفاده از اتریبیوت poster وجود داره، ولی میدونم که خیلیا هم از پیاده‌سازی‌های سفارشی برای این کار استفاده میکنن».

    اتریبیوت «poster» به مرورگرها اجازه میده که یه عکس جایگزین برای ویدیو نشون بدن. این رویکرد اول یه عکس ثابت رو لود میکنه و بعد که کاربر به ویدیو رسید، شروع به بارگذاری فایل ویدیویی میکنه.

    پلتفرم‌های استریم ویدیو معمولا به طور خودکار از طریق سیستم‌های تحویل محتواشون لیزی لودینگ رو مدیریت میکنن. فایل‌های ویدیویی بزرگ اغلب از بارگذاری تدریجی یا پروتکل‌های استریم استفاده میکنن که تخصیص منابع رو بدون نیاز به پیاده‌سازی صریح لیزی لودینگ انجام میدن.

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

    کی و کجا از لیزی لودینگ استفاده کنیم؟

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

    اسپلیت اشاره میکنه که مزایای لیزی لودینگ فقط محدود به صفحات خیلی طولانی نیست: «من میگم تقریبا همه صفحات میتونن از این تکنیک سود ببرن، مخصوصا صفحات طولانی‌تر. این درسته. ولی حتی اگه صفحه‌تون خیلی هم طولانی نباشه، با استفاده از لیزی لودینگ میتونه یکم عملکرد بهتری داشته باشه و مرورگر یکم باهاش راحت‌تر باشه».

    نکته کلیدی اینه که بین منابع «ضروری» و «غیرضروری» تفاوت قائل بشیم. منابع ضروری شامل هر محتوایی میشه که کاربر به محض ورود به صفحه میبینه. منابع غیرضروری هم شامل محتوایی میشه که شاید کاربر هیچوقت در طول بازدیدش از صفحه باهاشون روبرو نشه.

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

    در مورد عکس‌های تزئینی، داستان کلا فرق میکنه. به گفته اسپلیت، عکس‌های تزئینی رو «به احتمال زیاد اصلا نباید به عنوان یه تگ IMG توی HTML قرار داد. به احتمال زیاد باید از CSS برای نمایششون استفاده کرد و مشخص کرد که این عکس‌ها هیچ معنی و مفهوم خاصی ندارن».

    این رویکرد مبتنی بر CSS، عکس‌های تزئینی رو از ملاحظات سئو خارج میکنه و در عین حال ظاهر طراحی سایت رو حفظ میکنه. بهینه‌سازی فنی باید در خدمت تجربه کاربری باشه، نه مستقیما برای موتورهای جستجو.

    راهنمای فنی برای بهترین پیاده‌سازی

    ساده‌ترین راه برای پیاده‌سازی لیزی لودینگ برای اکثر سایت‌ها، استفاده از اتریبیوت بومی loading هست. کافیه روی تگ‌های عکس و آی‌فریم، loading=”lazy” رو اضافه کنید تا خود مرورگر به صورت هوشمند و بدون نیاز به جاوا اسکریپت، لیزی لودینگ رو کنترل کنه.

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

    یه نکته خیلی مهم اینه که حتما برای عکس‌ها اتریبیوت‌های عرض و ارتفاع (width و height) رو مشخص کنید. این کار از جابجایی طرح‌بندی (layout shift) در حین لیزی لودینگ جلوگیری میکنه. این اتریبیوت‌ها به مرورگر اجازه میدن که قبل از لود شدن عکس، فضای مناسب رو براش رزرو کنه و پایداری بصری صفحه رو در طول فرایند بارگذاری حفظ کنه.

    رابطه بین لیزی لودینگ و «اسکرول بی‌نهایت» (infinite scroll) هم ملاحظات فنی بیشتری رو مطرح میکنه. در حالی که هر دو تکنیک شامل بارگذاری تدریجی محتوا هستن، اسکرول بی‌نهایت معمولا بخش‌های کاملا جدیدی از محتوا رو بارگذاری میکنه، نه اینکه فقط بارگذاری منابع داخل محتوای موجود رو بهینه‌سازی کنه.

    به گفته اسپلیت، اسکرول بی‌نهایت «محتوای اضافی رو لود میکنه و صفحه رو از نظر محتوا بی‌نهایت میکنه، انگار که همه محتوا توی همین یه صفحه زندگی میکنه. این تکنیک چالش‌ها و مشکلات بالقوه خودشو داره، ولی به نوعی به لیزی لودینگ مرتبطه».


    لیزی لودینگ از نگاهی دیگر: چرا یک تغییردهنده بازی است؟

    خب، تا اینجا دیدیم که متخصص‌های گوگل چه نگاهی به این قضیه دارن. حالا بیایید از یه زاویه دیگه به ماجرا نگاه کنیم و ببینیم چرا لیزی لودینگ رو به عنوان یه «تغییردهنده بازی» برای عملکرد وب‌سایت‌ها میشناسن.

    خیلی از صاحب‌های سایت‌ها بدون اینکه بدونن، با بارگذاری همزمان تعداد زیادی از منابع مثل عکس‌ها، ویدیوها، اسکریپت‌ها و غیره، سرعت صفحاتشون رو کم میکنن. نصیحت رایج چیه؟ محتوا رو از صفحاتت حذف کن. ولی این راه حل ایده‌آلی نیست، مگه نه؟

    حالا اگه بهتون بگم میتونید سایتتون رو دقیقا همونطوری که هست نگه دارید و بدون فدا کردن زیبایی ظاهری، سرعتش رو بیشتر کنید چی؟ اینجاست که لیزی لودینگ وارد میشه. یه تکنیک عملکردی که به شما کمک میکنه فقط مهم‌ترین بخش‌های وب‌سایتتون رو اولویت‌بندی کنید و بقیه رو تا زمانی که بهشون نیاز نیست، به تاخیر بندازید.

    لیزی لودینگ دقیقا چیست و چطور کار میکند؟

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

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

    • عکس‌ها: به تاخیر انداختن عکس‌هایی که خارج از صفحه نمایش اولیه هستن تا زمانی که کاربر به دیدن اون‌ها نزدیک بشه.
    • ویدیوها: بارگذاری محتوای ویدیویی فقط زمانی که کاربر روی دکمه پخش کلیک میکنه.
    • آی‌فریم‌ها: به تعویق انداختن بارگذاری محتوای جاسازی شده مثل ویدیوهای یوتیوب، نقشه‌های گوگل یا تبلیغات.
    • فایل‌های جاوا اسکریپت و CSS: به تاخیر انداختن بارگذاری فایل‌های جاوا اسکریپت و استایل‌شیت‌های غیرضروری تا زمانی که لازم بشن.
    • فونت‌ها: جلوگیری از درخواست‌های فونتی که رندر صفحه رو مسدود میکنن با بارگذاری ناهمزمان اون‌ها.

    روند کار لیزی لودینگ به این صورته:

    1. صفحه فقط محتوای ضروری رو بارگذاری میکنه (مثلا عکس‌های بالای صفحه، اسکریپت‌های اصلی و استایل‌ها).
    2. عناصر غیرضروری در حالت جایگزین باقی میمونن (مثلا یه عکس تار یا با کیفیت پایین).
    3. وقتی کاربر به پایین اسکرول میکنه یا با بخش خاصی از صفحه تعامل میکنه، عناصر لیزی لود شده برای بارگذاری فعال میشن.
    4. مرورگر این عناصر رو فقط در صورت نیاز دریافت و نمایش میده و اینجوری زمان بارگذاری اولیه صفحه رو کم میکنه.

    تفاوت لیزی لودینگ و ایگر لودینگ (Eager Loading)

    لیزی لودینگ و ایگر لودینگ دقیقا نقطه مقابل هم هستن. لیزی لودینگ با اولویت‌بندی محتوای داخل دید کاربر، سرعت وب‌سایت رو بالا میبره، در حالی که ایگر لودینگ همه منابع رو به محض درخواست صفحه توسط کاربر، بارگذاری میکنه.

    ایگر لودینگ مثل اینه که شما برای یه سفر یه هفته‌ای، کل وسایل خونه رو با خودتون ببرید، چون «شاید» لازم بشن. ولی لیزی لودینگ یعنی فقط وسایل ضروری رو برمیدارید و اگه چیزی لازم شد، همونجا تهیه میکنید. در دنیای واقعی، ایگر لودینگ گاهی منفی تلقی میشه، اما در دنیای وب، گاهی اوقات کارآمده، مثلا برای وب‌اپلیکیشن‌های سنگین مثل بازی‌های آنلاین که ترجیح میدن یه صفحه «در حال بارگذاری» نشون بدن و همه چیز رو همون اول آماده کنن.

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

    مزایای کلیدی استفاده از لیزی لودینگ

    استفاده از این تکنیک چندین مزیت مهم داره:

    • سرعت بارگذاری سریع‌تر صفحه: با کم کردن حجم اولیه صفحه، باعث بارگذاری سریع‌تر در اولین بازدید و کسب نمرات عملکرد بالاتر در گزارش‌هایی مثل Google PageSpeed Insights میشه.
    • مصرف پهنای باند کمتر: فقط دارایی‌ها رو در صورت لزوم بارگذاری میکنه و اینجوری هم منابع سرور رو ذخیره میکنه و هم به کاربرای موبایل با دستگاه‌های قدیمی‌تر و اینترنت کندتر کمک میکنه.
    • تجربه کاربری بهتر: با اولویت‌بندی محتوای قابل مشاهده، از تعاملات کند و با تاخیر جلوگیری میکنه و فورا همه معیارهای Core Web Vitals رو بهبود میبخشه.
    • مزایای سئو: به بهبود Core Web Vitals کمک میکنه که منجر به رتبه‌های بالاتر در نتایج جستجو و بهینه‌سازی بودجه تبلیغات در گوگل به خاطر امتیاز کیفیت بالاتر صفحه میشه.

    چگونه لیزی لودینگ را برای بخش‌های مختلف سایت پیاده کنیم؟

    با اعمال استراتژیک لیزی لودینگ روی منابعی مثل جاوا اسکریپت، CSS، HTML، عکس‌ها و ویدیوها، وب‌سایت‌ها میتونن عملکرد بهتری داشته باشن. بیایید هر کدوم رو جداگانه بررسی کنیم.

    لیزی لودینگ جاوا اسکریپت

    فایل‌های جاوا اسکریپت، مخصوصا اون‌هایی که برای رندر اولیه صفحه ضروری نیستن، میتونن لیزی لود بشن تا عملکرد بهبود پیدا کنه.

    • استفاده از defer و async: میتونید از اتریبیوت‌های defer یا async توی تگ اسکریپت استفاده کنید تا اجرای فایل‌های جاوا اسکریپت رو به تاخیر بندازید. اتریبیوت defer تضمین میکنه که اسکریپت بعد از اینکه کل سند HTML پردازش شد، اجرا میشه. async هم اسکریپت رو به صورت ناهمزمان لود و اجرا میکنه بدون اینکه جلوی پردازش HTML رو بگیره.
    • تقسیم کد (Code Splitting): فریم‌ورک‌های مدرن جاوا اسکریپت مثل ری‌اکت، انگولار و ویو از تقسیم کد پشتیبانی میکنن. این قابلیت به شما اجازه میده که فقط بخش‌های ضروری جاوا اسکریپت رو در ابتدا لود کنید و بقیه رو بر اساس تقاضا (مثلا با تعامل کاربر یا اسکرول کردن) بارگذاری کنید.

    لیزی لودینگ HTML

    این تکنیک شامل به تاخیر انداختن بارگذاری محتوای سنگین یا غیرضروری HTML میشه که فورا روی صفحه لازم نیست.

    • بارگذاری محتوای پویا: میتونید از جاوا اسکریپت (مثلا با fetch() یا AJAX) استفاده کنید تا بخش‌هایی از محتوای HTML خودتون رو بعد از اینکه صفحه لود شد، بارگذاری کنید. این روش برای بخش‌هایی مثل نظرات کاربران، نقد و بررسی‌ها یا جزئیات محصول که برای نمایش اولیه صفحه ضروری نیستن، خیلی مفیده.
    • استفاده از جایگزین (Placeholder): وقتی محتوا در حال بارگذاریه، از جایگزین‌هایی مثل اسکلت لودر (skeleton loaders) یا اسپینرهای بارگذاری استفاده کنید تا تجربه کاربری رو بهتر کنید و از پریدن محتوا موقع لود شدن جلوگیری کنید.

    لیزی لودینگ CSS

    فایل‌های CSS هم میتونن لیزی لود بشن، مخصوصا وقتی استایل مربوط به محتواییه که فورا قابل مشاهده نیست (مثلا محتوایی که با اسکرول کردن کاربر ظاهر میشه).

    • استایل‌های حیاتی (Critical CSS): یه راه حل خوب اینه که CSS مورد نیاز برای رندر محتوای بالای صفحه (above-the-fold) رو به صورت درون‌خطی (inline) یا در بخش head سند قرار بدید. این کار باعث میشه صفحه فورا با استایل‌های اصلی ظاهر بشه.
    • بارگذاری دینامیک بقیه استایل‌ها: بقیه استایل‌های غیرضروری رو میتونید با جاوا اسکریپت و به صورت دینامیک بارگذاری کنید. مثلا استایل‌های مربوط به انیمیشن‌ها رو فقط زمانی لود کنید که کاربر با عنصری که انیمیشن داره تعامل میکنه.

    لیزی لودینگ عکس و ویدیو

    همونطور که گفتیم، این تکنیک بیشتر از همه برای عکس و ویدیو به کار میره چون معمولا بزرگترین فایل‌های یه صفحه وب هستن و میتونن به شدت سرعت لود رو کم کنن.

    • برای عکس‌ها: ساده‌ترین راه استفاده از اتریبیوت loading=”lazy” در تگ <img> هست. این کار به مرورگر میگه که بارگذاری عکس رو تا زمانی که به دید کاربر نزدیک نشده، به تاخیر بندازه.
    • برای ویدیوها: میتونید همین اتریبیوت loading=”lazy” رو برای تگ‌های iframe (مثلا برای ویدیوهای یوتیوب) هم استفاده کنید. یه راه دیگه اینه که یه «نما» (facade) یا همون تصویر بندانگشتی از ویدیو رو نشون بدید و فقط وقتی کاربر روش کلیک کرد، خود ویدیو رو لود کنید.
    • استفاده از جایگزین یا LQIP: برای جلوگیری از جابجایی طرح‌بندی (CLS)، یه نسخه کوچیک و تار از عکس (Low-Quality Image Placeholder) رو نشون بدید تا زمانی که عکس باکیفیت کامل لود بشه.

    پنج اشتباه رایج در لیزی لودینگ که باید از آنها دوری کنید

    با اینکه لیزی لودینگ خیلی مفیده، ولی اگه درست پیاده‌سازی نشه میتونه نتیجه عکس بده. بیایید با پنج تا از رایج‌ترین اشتباهات آشنا بشیم.

    1. لیزی لود کردن محتوای بالای صفحه (Above-the-Fold)
      • اشتباه: اعمال لیزی لودینگ روی محتوای حیاتی که در بالای صفحه ظاهر میشه (مثل عکس هیرو، لوگو، دکمه‌های فراخوان اصلی).
      • تاثیر: این کار باعث تاخیر در نمایش این عناصر کلیدی میشه و زمان LCP رو افزایش میده. در نتیجه، کاربر ممکنه برای دیدن محتوای اصلی با تاخیر مواجه بشه که باعث نارضایتی و تجربه کاربری بد میشه.
      • راه‌حل: به جای لیزی لودینگ، از پیش‌بارگذاری (Preloading) برای عکس‌ها، فونت‌ها و منابع دیگه‌ای که جزو محتوای قابل مشاهده اولیه هستن، استفاده کنید. با استفاده از <link rel=”preload”> میتونید به مرورگر بگید که این منابع رو زودتر از بقیه دریافت کنه.
    2. رزرو نکردن فضا برای عناصر لیزی لود شده
      • اشتباه: مشخص نکردن اتریبیوت‌های width و height برای عکس‌ها، آی‌فریم‌ها و ویدیوها وقتی لیزی لودینگ اعمال میشه.
      • تاثیر: وقتی یه عکس یا ویدیو بدون ابعاد مشخص لیزی لود میشه، طرح‌بندی صفحه ممکنه به طور غیرمنتظره‌ای با لود شدن منبع جابجا بشه. این اتفاق باعث Cumulative Layout Shift یا CLS میشه که یکی دیگه از معیارهای مهم Core Web Vitals هست.
      • راه‌حل: همیشه اتریبیوت‌های عرض و ارتفاع رو برای همه عکس‌ها، ویدیوها و آی‌فریم‌ها تنظیم کنید. این کار فضای لازم رو در طرح‌بندی رزرو میکنه، حتی قبل از اینکه رسانه لود بشه.
    3. لیزی لود کردن بیش از حد فایل‌های جاوا اسکریپت و CSS
      • اشتباه: به تاخیر انداختن اسکریپت‌ها و استایل‌شیت‌های حیاتی (مثلا اون‌هایی که برای طرح‌بندی صفحه، تعاملات یا انیمیشن‌های اصلی لازمن).
      • تاثیر: این کار میتونه باعث مشکلات مسدودکننده رندر بشه. یعنی مرورگر نمیتونه صفحه رو درست نمایش بده چون منتظر لود شدن این منابع میمونه. این مشکل میتونه منجر به پدیده‌ای به اسم FOUC (Flash of Unstyled Content) بشه که در اون صفحه برای لحظه‌ای بدون استایل ظاهر میشه.
      • راه‌حل: CSS حیاتی رو به صورت درون‌خطی (inline) بارگذاری کنید و فقط اسکریپت‌های غیرضروری که روی رندر اولیه تاثیری ندارن رو به تاخیر بندازید.
    4. لیزی لود کردن منابع خارجی بدون بهینه‌سازی
      • اشتباه: اعمال لیزی لودینگ روی منابع شخص ثالث مثل تبلیغات، فیدهای شبکه‌های اجتماعی یا اسکریپت‌های ردیابی که از سرورهای خارجی لود میشن.
      • تاثیر: منابع شخص ثالث میتونن به شدت سرعت بارگذاری صفحه رو کم کنن چون به سرورهای خارجی متکی هستن که ممکنه سریع یا قابل اعتماد نباشن. لیزی لود کردن این منابع بدون مدیریت صحیح میتونه باعث تاخیر در بارگذاری بقیه محتوا بشه.
      • راه‌حل: اگه این منابع واقعا ضروری هستن، بارگذاریشون رو به تاخیر بندازید و مطمئن بشید که از یه شبکه تحویل محتوا (CDN) برای عملکرد بهتر دریافت میشن.
    5. استفاده از لیزی لودینگ روی محتوای غیرقابل اسکرول
      • اشتباه: اعمال لیزی لودینگ روی محتوایی که همیشه روی صفحه قابل مشاهده است، مثل عناصری که داخل کانتینرهای با موقعیت ثابت (fixed-position) هستن، نوارهای ناوبری یا کروسل‌ها. این عناصر ممکنه هیچوقت لود نشن چون رویداد ورود به دید کاربر براشون فعال نمیشه.
      • راه‌حل: محتوای با موقعیت ثابت مثل نوارهای ناوبری یا کروسل‌ها رو از لیزی لودینگ مستثنی کنید. این عناصر همیشه قابل مشاهده هستن و باید به عنوان بخشی از بارگذاری اولیه صفحه لود بشن.

    ابزارها و روش‌های پیاده‌سازی لیزی لودینگ

    خوشبختانه برای پیاده‌سازی لیزی لودینگ لازم نیست همیشه چرخ رو از اول اختراع کنید. ابزارها و تکنیک‌های مختلفی برای این کار وجود داره.

    پیاده‌سازی با جاوا اسکریپت و Intersection Observer API

    یکی از مدرن‌ترین و کارآمدترین روش‌ها برای پیاده‌سازی لیزی لودینگ با جاوا اسکریپت، استفاده از Intersection Observer API هست. این API به شما اجازه میده به صورت ناهمزمان تغییرات در تقاطع یه عنصر با یه عنصر والد یا با دید اصلی سند (viewport) رو مشاهده کنید. به زبان ساده‌تر، این API مثل یه نگهبانه که به شما خبر میده یه عنصر وارد صفحه نمایش کاربر شده یا نه.

    روند کار با این API به این صورته:

    1. شما یه «مشاهده‌گر» (Observer) ایجاد میکنید.
    2. به این مشاهده‌گر میگید که کدوم عناصر رو زیر نظر بگیره.
    3. وقتی یکی از اون عناصر وارد دید کاربر شد، مشاهده‌گر یه تابع (callback) رو اجرا میکنه.
    4. داخل اون تابع، شما کاری که میخواید رو انجام میدید، مثلا آدرس عکس واقعی رو جایگزین آدرس جایگزین میکنید.

    این روش خیلی بهینه‌تر از روش‌های قدیمی‌تره که از رویدادهای scroll یا resize استفاده میکردن، چون پردازش کمتری از مرورگر میگیره.

    پیاده‌سازی‌های پیشرفته‌تر (الگوهای طراحی)

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

    • مقداردهی اولیه تنبل (Lazy Initialization): ساده‌ترین روش. اول شی رو برابر با null قرار میدید. هر وقت بهش نیاز شد، چک میکنید اگه null بود، همون لحظه ایجادش میکنید و برمیگردونید.
    • پراکسی مجازی (Virtual Proxy): یه شی با همون رابط کاربری شی واقعی ایجاد میکنید. اولین باری که یکی از متدهای این شی مجازی فراخوانی میشه، اون تازه میره شی واقعی رو بارگذاری میکنه و بعد کار رو بهش میسپره.
    • شبح (Ghost): شی در یه حالت ناقص بارگذاری میشه. ممکنه اولش فقط شناسه شی رو داشته باشه، ولی اولین باری که به یکی از ویژگی‌هاش دسترسی پیدا کنید، میره و بقیه اطلاعاتش رو بارگذاری میکنه.
    • نگهدارنده مقدار (Value Holder): یه شی عمومی که رفتار لیزی لودینگ رو مدیریت میکنه و به جای فیلدهای داده‌ای شی اصلی قرار میگیره.

    چطور لیزی لودینگ رو تست کنیم؟

    بعد از اینکه لیزی لودینگ رو پیاده کردید، خیلی مهمه که تستش کنید تا مطمئن بشید درست کار میکنه و تجربه کاربری رو خراب نمیکنه.

    • ابزارهای توسعه‌دهنده مرورگر (DevTools): این ابزارها بهترین دوست شما هستن. میتونید برید به تب «Network»، شرایط شبکه رو روی اینترنت کند (مثلا Slow 3G) شبیه‌سازی کنید و بعد صفحه رو رفرش کنید. در حالت عادی، نباید عکس‌ها و منابعی که پایین صفحه هستن لود بشن. وقتی اسکرول میکنید، باید ببینید که درخواست‌های جدید برای این منابع در تب Network ظاهر میشن.
    • استفاده از شبیه‌سازها و دستگاه‌های واقعی: حتما سایتتون رو روی دستگاه‌های موبایل واقعی یا شبیه‌سازها تست کنید. پلتفرم‌هایی مثل BrowserStack به شما اجازه میدن سایتتون رو روی هزاران دستگاه و مرورگر واقعی تست کنید. این کار بهتون کمک میکنه بفهمید لیزی لودینگ در شرایط مختلف چطور عمل میکنه.
    • بررسی مشکلات CLS: همونطور که گفتیم، لیزی لودینگ میتونه باعث جابجایی طرح‌بندی بشه. ابزارهایی مثل Lighthouse در DevTools یا Google PageSpeed Insights میتونن امتیاز CLS صفحه شما رو اندازه‌گیری کنن و بهتون بگن آیا مشکلی وجود داره یا نه.

    مفاهیم کلیدی که باید بلد باشید:

    • Core Web Vitals: معیارهای استاندارد گوگل برای اندازه‌گیری کیفیت تجربه کاربری در سه بعد اصلی: عملکرد بارگذاری، تعامل‌پذیری و پایداری بصری. این معیارها مستقیما روی رتبه‌بندی جستجو تاثیر میذارن.
    • Largest Contentful Paint (LCP): یکی از معیارهای Core Web Vitals که زمان لازم برای رندر شدن بزرگترین عنصر محتوایی قابل مشاهده در دید کاربر رو اندازه میگیره. گوگل زمان ۲.۵ ثانیه یا کمتر رو خوب میدونه.
    • ایندکسینگ (Indexing): فرایند سیستماتیک گوگل برای کشف، تحلیل و ذخیره محتوای صفحات وب در پایگاه داده جستجوی خودش. پیاده‌سازی نادرست لیزی لودینگ میتونه روی ایندکس شدن تاثیر منفی بذاره.
    • کتابخانه‌های جاوا اسکریپت: بسته‌های کد شخص ثالث که قابلیت‌های لیزی لودینگ فراتر از توانایی‌های بومی مرورگر رو ارائه میدن، مثل پیش‌نمایش عکس با کیفیت پایین.
    • سرچ کنسول (Search Console): ابزار اصلی وبمسترهای گوگل که اطلاعاتی در مورد عملکرد جستجوی وب‌سایت، وضعیت ایندکس و مشکلات فنی ارائه میده.

    پرسش و پاسخ (سوالات متداول)

    حالا که با کلیات ماجرا آشنا شدیم، بیایید به چندتا از سوالات پرتکراری که ممکنه براتون پیش اومده باشه جواب بدیم.

    سوال: جایگزین لیزی لودینگ چیه؟
    جواب: به جای لیزی لودینگ، میتونید عملکرد رو با استفاده از شبکه‌های تحویل محتوا (CDN)، پیش‌بارگذاری (preloading) منابع حیاتی و کم کردن حجم دارایی‌ها (مثلا فشرده‌سازی عکس‌ها) بهینه کنید. البته بهترین راه، ترکیب این تکنیک‌ها با لیزی لودینگه. یعنی هم لیزی لودینگ رو پیاده کنید و هم منابعتون رو از طریق CDN تحویل بدید.

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

    سوال: از کجا بفهمم لیزی لودینگ داره درست کار میکنه؟
    جواب: میتونید از ابزار Lighthouse در Chrome DevTools استفاده کنید، گزارش Google PageSpeed Insights رو چک کنید، یا درخواست‌های شبکه رو در تب Network همون DevTools زیر نظر بگیرید تا ببینید آیا دارایی‌های به تاخیر افتاده فقط در صورت نیاز بارگذاری میشن یا نه.

    سوال: چطور میتونم لیزی لودینگ رو برای یه عنصر خاص غیرفعال کنم؟
    جواب: برای غیرفعال کردن لیزی لودینگ برای یه عنصر خاص، میتونید اتریبیوت loading=”lazy” رو ازش حذف کنید. بعضی از اسکریپت‌ها هم ممکنه از اتریبیوتی مثل data-no-lazy=”true” برای این کار پشتیبانی کنن.

    سوال: چرا با اینکه لیزی لودینگ رو فعال کردم، بازم بعضی از عناصر سایتم شکسته به نظر میرسن؟
    جواب: این اتفاق معمولا در سایت‌هایی که خیلی به جاوا اسکریپت متکی هستن و از حالت‌های بهینه‌سازی خیلی تهاجمی استفاده میکنن، میفته. بعضی از ابزارهای بهینه‌سازی خودکار مثل NitroPack به شما اجازه میدن تنظیمات لیزی لودینگ رو سفارشی کنید و مشخص کنید کدوم محتوا باید به تاخیر بیفته و کدوم نه.

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

    منابع

    • [2] What is Lazy Loading | Lazy vs. Eager Loading | Imperva
    • [4] What is Lazy Loading? – GeeksforGeeks
    • [6] What is Lazy loading? | BrowserStack
    • [1] Google clarifies lazy loading SEO impact in Search Off the Record episode
    • [3] What is lazy loading? | Cloudflare
    • [5] What Is Lazy Loading And How to Use It to Speed Up Your Site
    • [7] Lazy loading – Wikipedia
  • gRPC-Web چیست؟ ارتباط وب با سرویس‌های gRPC

    خب gRPC-Web یک کتابخانه جاوااسکریپتیه. کتابخانه یعنی یک سری کد آماده که کار ما رو راحت میکنه. حالا کار این کتابخانه چیه؟ کارش اینه که به کلاینت‌های مرورگر، یعنی همون اپلیکیشن‌هایی که توی کروم یا فایرفاکس شما باز میشن، اجازه میده که بتونن به یک سرویس gRPC وصل بشن و باهاش حرف بزنن. پس این یه جور پل ارتباطی بین دنیای وب و مرورگرها با دنیای سرویس‌های gRPC حساب میشه.

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

    یک نکته مهم که باید بدونید اینه که gRPC-Web الان به مرحله «عرضه عمومی» یا همون «Generally Available» رسیده. این یعنی چی؟ یعنی دیگه یک پروژه آزمایشی و نصفه و نیمه نیست. کاملا پایداره و شرکت‌ها و برنامه‌نویس‌ها میتونن با خیال راحت در محصولات نهایی و تجاری خودشون ازش استفاده کنن.

    نکته کلیدی اینه که کلاینت‌های gRPC-Web نمیتونن مستقیم با سرویس‌های gRPC صحبت کنن. این وسط به یک واسطه یا یک جور مترجم نیاز دارن. این مترجم یک «پراکسی» یا «gateway» مخصوصه. به طور پیش‌فرض، کتابخانه gRPC-Web از پراکسی به اسم Envoy استفاده میکنه که پشتیبانی از gRPC-Web به صورت داخلی در اون تعبیه شده. پس روند کار اینطوری میشه: اپلیکیشن توی مرورگر شما درخواستش رو به زبان gRPC-Web به Envoy میفرسته، بعد Envoy اون درخواست رو ترجمه میکنه و به زبان gRPC اصلی به سرویس پشتیبان یا همون بک‌اند میفرسته. جواب رو هم به همین صورت برعکس ترجمه میکنه و به مرورگر برمیگردونه.

    نگران نباشید، در آینده قراره این وضعیت بهتر هم بشه. تیم توسعه‌دهنده gRPC-Web انتظار داره که پشتیبانی از این تکنولوژی مستقیما به فریمورک‌های تحت وب در زبان‌های مختلف مثل پایتون، جاوا و نود جی‌اس اضافه بشه. این یعنی شاید در آینده دیگه نیازی به اون پراکسی جداگانه نباشه. اگه دوست دارید بیشتر در مورد برنامه‌های آینده بدونید، میتونید سند نقشه راه یا «roadmap» این پروژه رو مطالعه کنید.

    چرا اصلا باید از gRPC و gRPC-Web استفاده کنیم؟

    خب، سوال خوبیه. بیایید ببینیم مزیت این کار چیه. با gRPC شما میتونید سرویس خودتون رو فقط یک بار در یک فایلی به نام .proto تعریف کنید. این فایل مثل یک قرارداد یا یک نقشه ساختمون میمونه. بعد از اینکه این نقشه رو تعریف کردید، میتونید با استفاده از ابزارهای gRPC، کلاینت‌ها و سرورهای مربوط به اون سرویس رو در هر زبانی که gRPC ازش پشتیبانی میکنه، بسازید. این زبان‌ها میتونن خیلی متنوع باشن و در محیط‌های مختلفی هم اجرا بشن، از سرورهای غول‌پیکر در دیتاسنترهای بزرگ گرفته تا تبلت شخصی شما.

    تمام پیچیدگی‌های ارتباط بین این زبان‌ها و محیط‌های مختلف توسط خود gRPC مدیریت میشه و شما دیگه درگیر جزئیات نمیشید. علاوه بر این، شما از تمام مزایای کار با «پروتکل بافر» یا همون «Protocol Buffers» هم بهره‌مند میشید. این مزایا شامل سریال‌سازی بهینه (یعنی تبدیل داده‌ها به فرمتی فشرده و سریع برای انتقال)، یک زبان تعریف رابط کاربری ساده (IDL) و قابلیت به‌روزرسانی آسان رابط‌ها میشه.

    حالا gRPC-Web این وسط چه نقشی داره؟ gRPC-Web به شما این امکان رو میده که از داخل مرورگرها، با یک API کاملا طبیعی و آشنا برای برنامه‌نویس‌های وب، به همین سرویس‌های gRPC که ساختید دسترسی پیدا کنید.

    محدودیت‌های مرورگر و راه حل‌های موجود

    یک حقیقت مهم وجود داره که باید بدونیم: امکان فراخوانی مستقیم یک سرویس gRPC از مرورگر وجود نداره. چرا؟ چون gRPC از ویژگی‌های پروتکل HTTP/2 استفاده میکنه و هیچ مرورگری اون سطح از کنترل دقیق روی درخواست‌های وب رو که برای پشتیبانی از یک کلاینت gRPC لازمه، در اختیار ما قرار نمیده. مثلا ما نمیتونیم مرورگر رو مجبور کنیم حتما از HTTP/2 استفاده کنه و حتی اگه میتونستیم، به فریم‌های خام HTTP/2 در مرورگرها دسترسی نداریم.

    اینجا gRPC روی ASP.NET Core دو تا راه حل سازگار با مرورگر ارائه میده:

    • gRPC-Web
    • gRPC JSON transcoding

    آشنایی با gRPC-Web

    این همون تکنولوژی هست که داریم در موردش صحبت میکنیم. gRPC-Web به اپلیکیشن‌های مرورگر اجازه میده تا با استفاده از کلاینت gRPC-Web و پروتکل بافر، سرویس‌های gRPC رو فراخوانی کنن.

    • این روش خیلی شبیه به gRPC معمولیه، اما یک پروتکل انتقال داده کمی متفاوت داره که باعث میشه با HTTP/1.1 و مرورگرها سازگار باشه.
    • برای استفاده از این روش، اپلیکیشن مرورگر باید یک کلاینت gRPC رو از روی همون فایل .proto که تعریف کردیم، تولید کنه.
    • این روش به اپلیکیشن‌های مرورگر اجازه میده از مزایای پیام‌های باینری که عملکرد بالا و مصرف شبکه کمی دارن، بهره‌مند بشن.

    خبر خوب اینه که دات نت (.NET) به صورت داخلی از gRPC-Web پشتیبانی میکنه.

    آشنایی با gRPC JSON transcoding

    این یک راه حل جایگزینه. این روش به اپلیکیشن‌های مرورگر اجازه میده تا سرویس‌های gRPC رو طوری فراخوانی کنن که انگار دارن با یک RESTful API معمولی با فرمت JSON کار میکنن.

    • در این حالت، اپلیکیشن مرورگر نیازی به تولید کلاینت gRPC نداره و اصلا لازم نیست چیزی در مورد gRPC بدونه.
    • RESTful API‌ها به صورت خودکار از روی سرویس‌های gRPC ساخته میشن. این کار با اضافه کردن یک سری حاشیه‌نویسی یا «metadata» مربوط به HTTP به فایل .proto انجام میشه.
    • این روش به یک اپلیکیشن اجازه میده که هم از gRPC و هم از JSON web API‌ها پشتیبانی کنه، بدون اینکه لازم باشه برای هر کدوم سرویس‌های جداگانه‌ای بسازه و کار تکراری انجام بده.

    دات نت همچنین از ساخت JSON web API از روی سرویس‌های gRPC هم پشتیبانی داخلی داره. فقط یادتون باشه که برای استفاده از gRPC JSON transcoding به دات نت ۷ یا بالاتر نیاز دارید.

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

    خب، تئوری کافیه. بیایید با یک مثال عملی ببینیم چطور میشه از gRPC-Web استفاده کرد. در این آموزش یاد میگیریم که:

    • چطور یک سرویس رو در یک فایل .proto تعریف کنیم.
    • چطور با استفاده از کامپایلر پروتکل بافر، کد کلاینت رو تولید کنیم.
    • چطور از API ی gRPC-Web برای نوشتن یک کلاینت ساده برای سرویسمون استفاده کنیم.

    فرض ما اینه که شما یک آشنایی اولیه با پروتکل بافرها دارید.

    مرحله ۱: تعریف سرویس در فایل echo.proto

    اولین قدم در ساخت یک سرویس gRPC، تعریف متدهای سرویس و انواع پیام‌های درخواست و پاسخ اونها با استفاده از پروتکل بافرهاست. در این مثال، ما یک سرویس به نام EchoService رو در فایلی به اسم echo.proto تعریف میکنیم. این فایل مثل یک نقشه اولیه برای ارتباط ما عمل میکنه.

    message EchoRequest {
      string message = 1;
    }
    
    message EchoResponse {
      string message = 1;
    }
    
    service EchoService {
      rpc Echo(EchoRequest) returns (EchoResponse);
    }

    این تعریف خیلی ساده است. ما یک درخواست به نام EchoRequest داریم که یک پیام متنی میگیره. یک پاسخ به نام EchoResponse داریم که اون هم یک پیام متنی برمیگردونه. و یک سرویس به نام EchoService داریم که یک متد به نام Echo داره. این متد یک EchoRequest میگیره و یک EchoResponse برمیگردونه. کارش اینه که هر پیامی بهش بدی، همون رو بهت برگردونه. مثل یک اکو یا پژواک صدا.

    مرحله ۲: پیاده‌سازی سرور بک‌اند gRPC

    حالا که نقشه رو داریم، باید سرور رو بسازیم. در مرحله بعد، ما رابط EchoService رو با استفاده از Node.js در بک‌اند پیاده‌سازی میکنیم. این سرور که اسمش رو EchoServer میذاریم، درخواست‌های کلاینت‌ها رو مدیریت میکنه. برای دیدن جزئیات کامل کد، میتونید به فایل node-server/server.js در مثال‌های رسمی gRPC-Web مراجعه کنید.

    یک نکته مهم اینه که شما میتونید سرور رو با هر زبانی که gRPC ازش پشتیبانی میکنه پیاده‌سازی کنید. این یکی از قدرت‌های gRPC هست.

    یک تیکه کد از سرور نود جی‌اس این شکلیه:

    function doEcho(call, callback) {
      callback(null, {message: call.request.message});
    }

    همونطور که میبینید، این تابع خیلی ساده است. یک درخواست (call) میگیره، پیام داخلش رو برمیداره و در یک پیام جدید به عنوان پاسخ (callback) برمیگردونه.

    مرحله ۳: پیکربندی پراکسی Envoy

    همونطور که قبلا گفتیم، برای اینکه درخواست مرورگر به سرور بک‌اند ما برسه، به یک مترجم یا پراکسی نیاز داریم. در این مثال، ما از پراکسی Envoy استفاده میکنیم. فایل پیکربندی کامل Envoy رو میتونید در envoy.yaml ببینید.

    برای اینکه Envoy درخواست‌های gRPC رو به سرور بک‌اند ما فوروارد کنه، به یک بلوک تنظیمات شبیه به این نیاز داریم:

    admin:
      address:
        socket_address: { address: 0.0.0.0, port_value: 9901 }
    static_resources:
      listeners:
      - name: listener_0
        address:
          socket_address: { address: 0.0.0.0, port_value: 8080 }
        filter_chains:
        - filters:
          - name: envoy.http_connection_manager
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
              codec_type: auto
              stat_prefix: ingress_http
              route_config:
                name: local_route
                virtual_hosts:
                - name: local_service
                  domains: ["*"]
                  routes:
                  - match: { prefix: "/" }
                    route: { cluster: echo_service }
              http_filters:
              - name: envoy.grpc_web
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
              - name: envoy.filters.http.router
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
      clusters:
      - name: echo_service
        connect_timeout: 0.25s
        type: LOGICAL_DNS
        typed_extension_protocol_options:
          envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
            "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
            explicit_http_config:
              http2_protocol_options: {}
        lb_policy: ROUND_ROBIN
        load_assignment:
          cluster_name: echo_service
          endpoints:
          - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address: node-server
                    port_value: 9090

    این تنظیمات شاید در نگاه اول پیچیده به نظر بیاد، ولی بیایید با هم بررسیش کنیم:

    • listeners: این بخش تعریف میکنه که Envoy روی چه آدرس و پورتی منتظر درخواست‌های ورودی باشه. اینجا روی پورت 8080 منتظر میمونه.
    • http_filters: اینجاست که جادو اتفاق میفته. ما دو تا فیلتر مهم داریم. یکی envoy.grpc_web که درخواست‌های gRPC-Web رو میشناسه و پردازش میکنه. دومی envoy.filters.http.router هست که درخواست رو به مقصد مناسبش هدایت میکنه.
    • clusters: این بخش تعریف میکنه که سرور بک‌اند ما کجاست. ما یک کلاستر به اسم echo_service تعریف کردیم که به آدرس node-server و پورت 9090 اشاره میکنه.

    پس سناریو اینطوریه: مرورگر یک درخواست gRPC-Web به پورت 8080 میفرستسه. Envoy این درخواست رو دریافت میکنه، با استفاده از فیلتر grpc_web اون رو ترجمه میکنه و به سرور gRPC بک‌اند ما که روی پورت 9090 قرار داره، ارسال میکنه. پاسخ سرور رو هم به همین ترتیب برعکس ترجمه میکنه و برای مرورگر میفرسته.

    گاهی اوقات لازمه یک سری تنظیمات مربوط به CORS هم اضافه کنید تا مرورگر اجازه داشته باشه محتوا رو از یک مبدا دیگه درخواست بده.

    مرحله ۴: تولید پیام‌های پروتوباف و کلاینت سرویس

    حالا وقتشه که از روی فایل echo.proto خودمون، کلاس‌های پیام جاوااسکریپتی رو تولید کنیم. این کار با یک دستور در ترمینال انجام میشه:

    protoc -I=$DIR echo.proto \
    --js_out=import_style=commonjs:$OUT_DIR
    • protoc: این همون کامپایلر پروتکل بافر هست.
    • -I=$DIR: به کامپایلر میگه فایل‌های .proto رو کجا پیدا کنه.
    • --js_out=import_style=commonjs:$OUT_DIR: این قسمت میگه که خروجی جاوااسکریپت بساز. import_style=commonjs باعث میشه که فایل‌های تولید شده از سیستم ماژول require() ی CommonJS استفاده کنن که در دنیای Node.js خیلی رایجه. $OUT_DIR هم پوشه خروجی رو مشخص میکنه.

    خب، این فقط کلاس‌های مربوط به پیام‌ها رو ساخت. ما به کدهای مربوط به کلاینت سرویس هم نیاز داریم. برای این کار، به یک پلاگین مخصوص برای protoc به اسم protoc-gen-grpc-web نیاز داریم.

    اول باید این پلاگین رو دانلود و نصب کنید. میتونید فایل باینری protoc رو از صفحه رسمی پروتکل بافر و پلاگین protoc-gen-grpc-web رو از صفحه گیت‌هاب gRPC-Web دانلود کنید. بعد باید مطمئن بشید که هر دوی این فایل‌ها اجرایی هستن و در PATH سیستم شما قرار دارن تا از هر جایی قابل دسترس باشن.

    یک راه دیگه برای نصب پلاگین اینه که از سورس کد کامپایلش کنید. برای این کار باید از ریشه مخزن gRPC-Web دستور زیر رو اجرا کنید:

    cd grpc-web
    sudo make install-plugin

    بعد از اینکه پلاگین آماده شد، با دستور زیر میتونیم کد کلاینت سرویس رو تولید کنیم:

    protoc -I=$DIR echo.proto \
    --grpc-web_out=import_style=commonjs,mode=grpcwebtext:$OUT_DIR

    این دستور خیلی شبیه دستور قبلیه، ولی از --grpc-web_out استفاده میکنه که مخصوص پلاگین ماست. بیایید پارامترهاش رو بررسی کنیم:

    • mode: این پارامتر میتونه grpcwebtext (که پیش‌فرض هست) یا grpcweb باشه. این دو حالت در نحوه کدگذاری داده‌ها تفاوت دارن که بعدا بیشتر در موردش صحبت میکنیم.
    • import_style: این پارامتر هم میتونه closure (که پیش‌فرض هست) یا commonjs باشه. ما از commonjs استفاده کردیم تا با خروجی قبلیمون هماهنگ باشه.

    این دستور به طور پیش‌فرض یک فایل به نام echo_grpc_web_pb.js تولید میکنه که شامل کد کلاینت ماست.

    مرحله ۵: نوشتن کد کلاینت جاوااسکریپت

    بالاخره رسیدیم به قسمت شیرین ماجرا. حالا آماده‌ایم که کد جاوااسکریپت سمت کلاینت رو بنویسیم. این کد رو در یک فایلی به نام client.js قرار میدیم.

    const {EchoRequest, EchoResponse} = require('./echo_pb.js');
    const {EchoServiceClient} = require('./echo_grpc_web_pb.js');
    
    var echoService = new EchoServiceClient('http://localhost:8080');
    
    var request = new EchoRequest();
    request.setMessage('Hello World!');
    
    echoService.echo(request, {}, function(err, response) {
      // اینجا میتونیم با پاسخ سرور کار کنیم
      // مثلا response.getMessage() رو چاپ کنیم
    });

    بیایید این کد رو با هم تحلیل کنیم:

    1. در دو خط اول، ما کلاس‌هایی که در مرحله قبل تولید کردیم (EchoRequest, EchoResponse, EchoServiceClient) رو با استفاده از require وارد برنامه‌مون میکنیم.
    2. بعد یک نمونه جدید از EchoServiceClient میسازیم و آدرس پراکسی Envoy خودمون (http://localhost:8080) رو بهش میدیم.
    3. یک نمونه جدید از EchoRequest میسازیم و پیام «Hello World!» رو داخلش قرار میدیم.
    4. در نهایت، متد echo رو روی سرویسمون فراخوانی میکنیم. به عنوان ورودی، درخواست (request)، یک آبجکت خالی برای متادیتا ({}) و یک تابع callback بهش میدیم. این تابع زمانی اجرا میشه که پاسخی از سرور دریافت بشه. این پاسخ میتونه خطا (err) یا جواب موفقیت‌آمیز (response) باشه.

    برای اینکه این کد کار کنه، به یک سری پکیج دیگه هم نیاز داریم. باید یک فایل package.json در پروژه‌مون داشته باشیم:

    {
      "name": "grpc-web-commonjs-example",
      "dependencies": {
        "google-protobuf": "^3.6.1",
        "grpc-web": "^0.4.0"
      },
      "devDependencies": {
        "browserify": "^16.2.2",
        "webpack": "^4.16.5",
        "webpack-cli": "^3.1.0"
      }
    }

    این فایل مشخص میکنه که پروژه ما به پکیج‌های google-protobuf و grpc-web نیاز داره. همچنین برای ساختن فایل نهایی برای مرورگر، از ابزارهایی مثل browserify یا webpack استفاده میکنیم.

    مرحله ۶: کامپایل کتابخانه جاوااسکریپت

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

    اول با دستور npm install پکیج‌های مورد نیاز رو نصب میکنیم.

    بعد با دستوری مثل این، فایل نهایی رو میسازیم:

    npx webpack client.js

    این دستور فایل client.js ما و تمام وابستگی‌هاش رو در یک فایل به نام main.js در پوشه dist قرار میده. حالا کافیه این فایل dist/main.js رو در صفحه HTML خودمون قرار بدیم و نتیجه رو ببینیم!

    یک راه سریع برای شروع

    اگر حوصله انجام تمام این مراحل رو به صورت دستی ندارید، یک راه سریع‌تر هم وجود داره. میتونید از مثال‌های آماده خود gRPC-Web استفاده کنید:

    $ git clone https://github.com/grpc/grpc-web
    $ cd grpc-web
    $ docker-compose up node-server envoy commonjs-client

    این دستورات با استفاده از داکر، همه چیز رو براتون آماده میکنه: سرور نود جی‌اس، پراکسی Envoy و یک کلاینت نمونه. بعد کافیه مرورگر خودتون رو باز کنید و به آدرس http://localhost:8081/echotest.html برید تا همه چیز رو در عمل ببینید.

    نگاهی عمیق‌تر به ویژگی‌ها و گزینه‌ها

    حالا که با اصول اولیه آشنا شدیم، بیایید کمی جزئی‌تر به گزینه‌هایی که در اختیار داریم نگاه کنیم.

    انواع RPC و پشتیبانی در gRPC-Web

    gRPC در حالت کلی چهار نوع متد یا RPC رو پشتیبانی میکنه:

    1. Unary RPCs: یک درخواست میفرستی و یک پاسخ میگیری. مثل همین مثال Echo ما.
    2. Server-side Streaming RPCs: یک درخواست میفرستی و یک جریان از پاسخ‌ها رو به صورت پشت سر هم دریافت میکنی.
    3. Client-side Streaming RPCs: یک جریان از درخواست‌ها رو میفرستی و در نهایت یک پاسخ میگیری.
    4. Bi-directional Streaming RPCs: یک جریان دوطرفه از درخواست‌ها و پاسخ‌ها به صورت همزمان داری.

    gRPC-Web در حال حاضر فقط از دو نوع اول پشتیبانی میکنه. یعنی Unary RPC و Server-side Streaming RPC. استریمینگ سمت کلاینت و دوطرفه فعلا پشتیبانی نمیشن. البته برای استریمینگ سمت سرور هم یک شرط وجود داره: باید حتما از حالت grpcwebtext استفاده کنید.

    حالت‌های مختلف انتقال داده (mode)

    وقتی داشتیم کد کلاینت رو تولید میکردیم، یک پارامتر به اسم mode دیدیم. این پارامتر دو تا مقدار میتونه داشته باشه:

    • mode=grpcwebtext: این حالت پیش‌فرض هست.
      • Content-type درخواست میشه application/grpc-web-text.
      • داده‌ها یا همون payload به صورت base64 کدگذاری میشن. این یعنی داده‌های باینری به فرمت متنی تبدیل میشن.
      • هم از Unary و هم از Server-side streaming پشتیبانی میکنه.
    • mode=grpcweb: این حالت از فرمت باینری پروتوباف استفاده میکنه.
      • Content-type درخواست میشه application/grpc-web+proto.
      • داده‌ها به صورت باینری و خام پروتوباف فرستاده میشن. این حالت معمولا بهینه‌تر و کم‌حجم‌تره.
      • فقط از Unary call پشتیبانی میکنه. استریمینگ سمت سرور در این حالت کار نمیکنه.

    استایل‌های مختلف ایمپورت (import_style)

    یک پارامتر دیگه هم به اسم import_style داشتیم. این پارامتر نحوه وارد کردن ماژول‌ها در کد تولید شده رو مشخص میکنه:

    • import_style=closure: این حالت پیش‌فرض هست و از سیستم ماژول goog.require() کتابخانه Closure گوگل استفاده میکنه.
    • import_style=commonjs: این حالت از require() ی CommonJS استفاده میکنه که برای کار با ابزارهایی مثل Webpack و Browserify خیلی مناسبه.
    • import_style=commonjs+dts: (آزمایشی) این حالت علاوه بر کد CommonJS، یک فایل تایپینگ .d.ts هم برای پیام‌های پروتوباف و کلاینت سرویس تولید میکنه. این برای کار با TypeScript خیلی مفیده.
    • import_style=typescript: (آزمایشی) این حالت مستقیما کد کلاینت سرویس رو به زبان TypeScript تولید میکنه.

    پشتیبانی از TypeScript

    خبر خوب برای طرفدارهای TypeScript اینه که gRPC-Web به صورت آزمایشی از این زبان پشتیبانی میکنه. حالا ماژول grpc-web رو میشه به عنوان یک ماژول TypeScript وارد کرد.

    برای استفاده از این قابلیت، باید موقع تولید کد از پلاگین protoc-gen-grpc-web، یکی از این دو گزینه رو بهش بدید:

    • import_style=commonjs+dts: کد CommonJS به همراه فایل‌های تایپینگ .d.ts تولید میکنه.
    • import_style=typescript: کد کاملا TypeScript تولید میکنه.

    یک نکته خیلی مهم: شما نباید import_style=typescript رو برای فلگ --js_out استفاده کنید. این فلگ فقط باید روی import_style=commonjs تنظیم بشه. در واقع --js_out کد جاوااسکریپت پیام‌ها (echo_pb.js) رو تولید میکنه و --grpc-web_out فایل‌های TypeScript مربوط به سرویس (EchoServiceClientPb.ts) و تایپینگ پیام‌ها (echo_pb.d.ts) رو میسازه. این یک راه حل موقتیه تا زمانی که خود --js_out به صورت کامل از TypeScript پشتیبانی کنه.

    پس دستور کامل برای تولید کد TypeScript با فرمت باینری این شکلی میشه:

    protoc -I=$DIR echo.proto \
    --js_out=import_style=commonjs,binary:$OUT_DIR \
    --grpc-web_out=import_style=typescript,mode=grpcweb:$OUT_DIR

    و کد سمت کلاینت در TypeScript میتونه این شکلی باشه:

    import * as grpcWeb from 'grpc-web';
    import {EchoServiceClient} from './EchoServiceClientPb';
    import {EchoRequest, EchoResponse} from './echo_pb';
    
    const echoService = new EchoServiceClient('http://localhost:8080', null, null);
    
    const request = new EchoRequest();
    request.setMessage('Hello World!');
    
    const call = echoService.echo(request, {'custom-header-1': 'value1'},
      (err: grpcWeb.RpcError, response: EchoResponse) => {
        if (err) {
          console.log(`Received error: ${err.code}, ${err.message}`);
        } else {
          console.log(response.getMessage());
        }
      });
    
    call.on('status', (status: grpcWeb.Status) => {
      // ...
    });

    همونطور که میبینید، همه چیز تایپ-سیف و مشخصه.

    کلاینت مبتنی بر Promise

    علاوه بر مدل callback که دیدیم، میتونید از یک کلاینت مبتنی بر Promise هم استفاده کنید. این مدل کدنویسی برای خیلی‌ها خواناتر و مدرن‌تره.

    // Create a Promise client instead
    const echoService = new EchoServicePromiseClient('http://localhost:8080', null, null);
    
    // ... (request is the same as above)
    
    echoService.echo(request, {'custom--header-1': 'value1'})
      .then((response: EchoResponse) => {
        console.log(`Received response: ${response.getMessage()}`);
      }).catch((err: grpcWeb.RpcError) => {
        console.log(`Received error: ${err.code}, ${err.message}`);
      });

    فقط یک نکته مهم رو در نظر داشته باشید: وقتی از Promise استفاده میکنید، دیگه نمیتونید به callback‌های .on(...) (مثلا برای metadata و status) دسترسی داشته باشید.

    تاریخچه و وضعیت فعلی gRPC در مرورگر

    جالبه بدونید که داستان gRPC در مرورگر چطور شروع شد. در تابستان ۲۰۱۶، یک تیم در گوگل و یک شرکت به نام Improbable به صورت مستقل از هم شروع به کار روی چیزی کردن که میشد اسمش رو گذاشت «gRPC برای مرورگر». خیلی زود از وجود هم باخبر شدن و با هم همکاری کردن تا یک مشخصات فنی یا «spec» برای این پروتکل جدید تعریف کنن.

    مشخصات فنی gRPC-Web

    همونطور که گفتیم، پیاده‌سازی کامل مشخصات gRPC مبتنی بر HTTP/2 در مرورگرها غیرممکنه. به خاطر همین، مشخصات gRPC-Web با در نظر گرفتن این محدودیت‌ها و با تعریف تفاوت‌هاش با gRPC اصلی نوشته شد. این تفاوت‌های کلیدی عبارتند از:

    • پشتیبانی از هر دو پروتکل HTTP/1.1 و HTTP/2.
    • ارسال هدرهای تریلر gRPC در انتهای بدنه درخواست/پاسخ.
    • الزامی بودن استفاده از یک پراکسی برای ترجمه بین درخواست‌های gRPC-Web و پاسخ‌های gRPC HTTP/2.

    دو پیاده‌سازی اصلی

    تیم‌های گوگل و Improbable هر کدوم پیاده‌سازی خودشون رو از این مشخصات ارائه دادن. این دو پیاده‌سازی در دو مخزن جداگانه قرار داشتن و برای مدتی با هم سازگار نبودن.

    • کلاینت Improbable:
      • با زبان TypeScript نوشته شده.
      • در npm با نام @improbable-eng/grpc-web موجوده.
      • یک پراکسی به زبان Go هم داره که هم به صورت پکیج و هم به صورت یک برنامه مستقل قابل استفاده است.
      • از هر دو Fetch و XHR برای ارسال درخواست‌ها استفاده میکنه و به صورت خودکار بر اساس قابلیت‌های مرورگر یکی رو انتخاب میکنه.
    • کلاینت Google:
      • با زبان جاوااسکریپت و با استفاده از کتابخانه Google Closure نوشته شده.
      • در npm با نام grpc-web موجوده.
      • در ابتدا با یک افزونه برای NGINX به عنوان پراکسی عرضه شد، ولی بعدا روی فیلتر HTTP پراکسی Envoy تمرکز کرد.
      • فقط از XHR برای ارسال درخواست‌ها استفاده میکنه.

    بیایید این دو رو در یک جدول با هم مقایسه کنیم:

    کلاینت / ویژگیروش انتقالUnaryاستریم سمت سروراستریم سمت کلاینت و دوطرفه
    ImprobableFetch/XHR✔️✔️❌ (با یک روش آزمایشی وب‌سوکت)
    Google (grpcwebtext)XHR✔️✔️
    Google (grpcweb)XHR✔️❌ (فقط در انتها نتیجه رو برمیگردونه)

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

    آینده و مسیر پیش رو

    در اکتبر ۲۰۱۸، پیاده‌سازی گوگل به نسخه ۱.۰ رسید و به صورت عمومی عرضه شد. تیم گوگل یک نقشه راه برای اهداف آینده منتشر کرده که شامل این موارد میشه:

    • یک فرمت کدگذاری پیام‌ها شبیه JSON ولی بهینه‌تر.
    • پراکسی‌های درون-فرایندی برای Node، پایتون، جاوا و غیره (تا نیاز به پراکسی جدا مثل Envoy کمتر بشه).
    • ادغام با فریمورک‌های محبوب مثل React، Angular و Vue.
    • استفاده از Fetch API برای استریمینگ بهینه‌تر از نظر حافظه.
    • پشتیبانی از استریمینگ دوطرفه.

    بعد از مذاکرات بین دو تیم، تصمیم بر این شد که کلاینت گوگل و پراکسی Envoy به عنوان راه حل‌های پیشنهادی برای کاربران جدید معرفی بشن. کلاینت و پراکسی Improbable به عنوان پیاده‌سازی‌های جایگزین و آزمایشی باقی میمونن.

    پس اگه امروز میخواید با gRPC-Web شروع کنید، بهترین گزینه کلاینت گوگل هست. این کلاینت تضمین‌های سازگاری API قوی‌ای داره و توسط یک تیم اختصاصی پشتیبانی میشه.

    مزایای استفاده از gRPC-Web

    حالا که با جزئیات فنی آشنا شدیم، بیایید یک بار دیگه مزایای معماری gRPC-Web رو مرور کنیم.

    • gRPC سرتاسری (End-to-end gRPC): به شما اجازه میده کل خط لوله RPC خودتون رو با استفاده از پروتکل بافرها طراحی کنید. دیگه لازم نیست یک لایه اضافه برای تبدیل درخواست‌های HTTP/JSON به gRPC در بک‌اند داشته باشید.
    • هماهنگی بیشتر بین تیم‌های فرانت‌اند و بک‌اند: وقتی کل ارتباط با پروتکل بافر تعریف میشه، دیگه مرز بین تیم «کلاینت» و تیم‌های «میکروسرویس‌ها» کمرنگ‌تر میشه. ارتباط کلاینت-بک‌اند فقط یک لایه gRPC دیگه در کنار بقیه لایه‌هاست.
    • تولید آسان کتابخانه‌های کلاینت: وقتی سروری که با دنیای بیرون در ارتباطه، یک سرور gRPC باشه، تولید کتابخانه‌های کلاینت برای زبان‌های مختلف (روبی، پایتون، جاوا و …) خیلی راحت‌تر میشه و دیگه نیازی به نوشتن کلاینت‌های HTTP جداگانه برای هر کدوم نیست.

    دیدگاه دنیای واقعی: gRPC-Web در مقابل REST

    جالبه بدونید که همیشه همه با یک تکنولوژی موافق نیستن. در یک بحث در وبسایت ردیت، یک مهندس ارشد پیشنهاد کرده بود که تیمشون از gRPC-Web به سمت استفاده از REST Handler‌های معمولی حرکت کنه. دلیل این پیشنهاد این بود که در یک استارتاپ که سرعت توسعه و رسیدن به بازار اولویت داره، این کار میتونه مفید باشه.

    نگرانی‌هایی که در مورد این تغییر مطرح شده بود اینها بودن:

    • از دست دادن یک تعریف نوع (type definition) یکپارچه که پروتوباف فراهم میکنه.
    • نیاز به ابداع مجدد چرخ و نوشتن کدهای تکراری.
    • نیاز به ارتباط و مستندسازی بیشتر بین تیم‌ها.

    در مقابل، تنها مزیت مسیر HTTP/REST این عنوان شده بود که درک و فهم اون برای بعضی‌ها ساده‌تره. این بحث نشون میده که انتخاب بین این تکنولوژی‌ها همیشه یک سری بده‌بستان (trade-off) داره و به شرایط پروژه بستگی داره. هر دو روش، چه استفاده از پروتوباف برای تولید کلاینت gRPC-Web و چه استفاده از OpenAPI برای تولید کلاینت REST، در سطح بالا یک هدف مشترک دارن: تولید خودکار کلاینت از روی یک تعریف مشخص.

    پرسش و پاسخ

    خب بچه‌ها، بحث ما تقریبا تموم شد. برای اینکه مطمئن بشیم همه چیز خوب جا افتاده، بیایید چند تا سوال مهم رو با هم مرور کنیم.

    1. سوال ۱: gRPC دقیقا چیه؟

    جواب: gRPC یک چارچوب RPC (Remote Procedure Call) مدرن، متن‌باز و با کارایی بالاست که توسط گوگل ساخته شده. به زبان ساده، یک روش خیلی سریع و بهینه برای اینه که سرویس‌های مختلف در یک سیستم کامپیوتری بتونن با هم صحبت کنن و از هم سرویس بگیرن، حتی اگه در کامپیوترهای مختلف و با زبان‌های برنامه‌نویسی متفاوتی نوشته شده باشن. این چارچوب از پروتکل HTTP/2 برای انتقال داده استفاده میکنه.

    1. سوال ۲: چرا نمیتونیم مستقیم از gRPC توی مرورگر استفاده کنیم و به gRPC-Web نیاز داریم؟

    جواب: چون gRPC روی ویژگی‌های سطح پایین پروتکل HTTP/2 ساخته شده. مرورگرهای وب امروزی به برنامه‌نویس‌ها اجازه دسترسی و کنترل مستقیم روی این ویژگی‌ها رو نمیدن. برای همین، یک «پل» یا «مترجم» به اسم gRPC-Web ساخته شده که یک پروتکل کمی متفاوت و سازگار با محدودیت‌های مرورگر داره. این پروتکل بعدا توسط یک پراکسی (مثل Envoy) به gRPC استاندارد ترجمه میشه.

    1. سوال ۳: فایل .proto چیه و چه نقشی داره؟

    جواب: فایل .proto که بهش فایل پروتکل بافر هم میگن، یک فایل متنیه که شما در اون ساختار داده‌ها و سرویس‌های خودتون رو تعریف میکنید. این فایل مثل یک «قرارداد» یا «نقشه» بین کلاینت و سرور عمل میکنه. شما پیام‌های درخواست، پیام‌های پاسخ و متدهای سرویس رو در این فایل تعریف میکنید. بعد با استفاده از کامپایلر پروتکل بافر (protoc)، میتونید از روی این فایل، کد مربوط به کلاینت و سرور رو به زبان‌های مختلف تولید کنید.

    1. سوال ۴: پراکسی Envoy چیه و چرا در معماری gRPC-Web مهمه؟

    جواب: Envoy یک پراکسی سرویس مدرن و با کارایی بالاست. در دنیای gRPC-Web، نقش یک مترجم رو بازی میکنه. درخواست‌هایی که از مرورگر با پروتکل gRPC-Web میان رو دریافت میکنه، اونها رو به پروتکل استاندارد gRPC (که روی HTTP/2 کار میکنه) تبدیل میکنه و به سرور بک‌اند میفرسته. پاسخ سرور رو هم به همین ترتیب برعکس ترجمه میکنه و برای مرورگر میفرسته. بدون وجود یک پراکسی مثل Envoy، ارتباط مستقیم بین مرورگر و سرور gRPC ممکن نیست. البته پراکسی‌های دیگه‌ای مثل پراکسی Go، Apache APISIX و Nginx هم این قابلیت رو دارن.

    1. سوال ۵: تفاوت اصلی بین دو حالت mode=grpcwebtext و mode=grpcweb چیه؟

    جواب: تفاوت اصلی در نحوه کدگذاری و انتقال داده‌هاست.

    • grpcwebtext داده‌ها رو به صورت متنی (Base64) کدگذاری میکنه و هم از درخواست‌های تکی (Unary) و هم از استریمینگ سمت سرور پشتیبانی میکنه.
    • grpcweb داده‌ها رو به صورت باینری و خام پروتوباف منتقل میکنه که بهینه‌تره، ولی فقط از درخواست‌های تکی (Unary) پشتیبانی میکنه.
    1. سوال ۶: آیا میتونم از gRPC-Web برای آپلود فایل یا چت دوطرفه استفاده کنم؟

    جواب: در حال حاضر، خیر. gRPC-Web از استریمینگ سمت کلاینت و استریمینگ دوطرفه پشتیبانی نمیکنه. این قابلیت‌ها در نقشه راه پروژه قرار دارن ولی هنوز پیاده‌سازی نشدن. پس برای کارهایی مثل آپلود فایل (که نیاز به استریم سمت کلاینت داره) یا یک اپلیکیشن چت زنده (که نیاز به استریم دوطرفه داره)، gRPC-Web فعلا راه حل کاملی نیست.

    منابع

    • [2] What Are gRPC & gRPC Web. Basics of Hacking Into gRPC-Web | by Amin Nasiri | Medium
    • [4] The state of gRPC in the browser | gRPC
    • [6] GitHub – grpc/grpc-web: gRPC for Web Clients
    • [8] My backfill Principal Engineer wants to move off of GRPC web and start using REST Handlers. Will this be a shit show? : r/golang
    • [10] gRPC vs. gRPC-Web: Key Differences Explained
    • [1] grpc-web – npm
    • [3] Use gRPC in browser apps | Microsoft Learn
    • [5] Go and gRPC is just so intuitive. Here’s a detailed full-stack flow with gRPC-Web, Go and React. Also, there is a medium story focused on explaining how such a setup might boost efficiency and the step-by-step implementation. : r/golang
    • [7] gRPC-Web is Generally Available | gRPC
    • [9] Basics tutorial | Web | gRPC
  • بلوتوث کم‌مصرف (BLE)؛ راهنمای تکنولوژی اینترنت اشیا

    تکنولوژی BLE که اولین بار سال ۲۰۱۲ معرفی شد، یک پروتکل خیلی انعطاف‌پذیره که برای خیلی از کاربردهای مهم اینترنت اشیا، ارتباط بی‌سیم فراهم میکنه. تمرکز اصلیش روی کار کردن با مصرف انرژی فوق‌العاده پایینه و همین باعث شده تو صنایع مختلفی مثل لوازم الکترونیکی مصرفی، بهداشت و درمان و حتی لجستیک و انبارداری ازش استفاده بشه. امروز میخوایم تمام نکات پایه‌ای BLE رو با هم یاد بگیریم تا شما هم بتونید برای پروژه‌های بعدیتون ازش استفاده کنید و سهمی از این بازار بزرگ ۳۸۴ میلیارد دلاری اینترنت اشیا داشته باشید.

    داستان بلوتوث از کجا شروع شد؟

    قبل از اینکه بریم تو دنیای BLE، بهتره یه نگاهی به پدرش یعنی همون بلوتوث معمولی بندازیم. مشخصات فنی بلوتوث از دهه ۹۰ میلادی وجود داشته. هدف اصلی از طراحی این پروتکل این بود که جای کابل‌ها رو برای انتقال داده بین دستگاه‌ها تو فاصله‌های کوتاه بگیره. جالبه که امروز هم اصلی‌ترین کاربردش همینه.

    بلوتوث یک تکنولوژی بی‌سیم با برد کوتاهه که تو باند فرکانسی ۲.۴ گیگاهرتز ISM کار میکنه. این باند فرکانسی برای استفاده عموم آزاده و نیازی به مجوز نداره. کارش هم انتقال داده و ساختن شبکه‌های شخصی کوچیک (PAN) هست.

    احتمالا همین الان دور و بر همه‌مون کلی دستگاه بلوتوثی هست: گوشی موبایل، لپ‌تاپ، هدفون و اسپیکر. جالبه بدونید که فقط تو سال ۲۰۲۱، بیشتر از ۴.۷ میلیارد دستگاه بلوتوثی تو کل دنیا تولید و عرضه شده. این نشون میده که بلوتوث یکی از پرکاربردترین تکنولوژی‌های دنیاست.

    اگه از مردم تو خیابون بپرسید بلوتوث چیه، اکثرشون یه شناخت کلی ازش دارن. اما پشت پرده، این یک استاندارد فنی نسبتا پیچیده‌ است که توسط یک گروه به اسم گروه علایق ویژه بلوتوث (Bluetooth Special Interest Group) یا به اختصار SIG مدیریت میشه. این گروه در طول سال‌ها، نسخه‌های مختلفی از مشخصات فنی بلوتوث رو منتشر کرده. دو تا از معروف‌ترین پروتکل‌های این استاندارد، «بلوتوث کلاسیک» و «بلوتوث کم‌مصرف» هستن.

    تا سال ۲۰۱۰، تمرکز اصلی روی بهتر کردن بلوتوث کلاسیک بود. اما تو همین سال، گروه SIG نسخه ۴.۰ بلوتوث رو منتشر کرد. این نسخه یک مسیر متفاوت رو در پیش گرفت و یک پروتکل جدید به اسم بلوتوث کم‌مصرف (BLE) رو به دنیا معرفی کرد.

    بلوتوث کم‌مصرف (BLE) دقیقا چیه؟

    با اینکه BLE خیلی از ویژگی‌هاش رو از جدش یعنی بلوتوث کلاسیک گرفته، اما به عنوان یک تکنولوژی متفاوت شناخته میشه. هدف اصلی BLE بازارهایی هست که نیاز اصلیشون مصرف انرژی فوق‌العاده پایینه، نه سرعت انتقال داده بالا.

    ارتباط داده با رادیوی LE (که مخفف Low Energy هست) در بسته‌های کوچیک و کوتاه اتفاق میفته که لازم نیست خیلی پشت سر هم باشن. یک سناریوی معمولی برای BLE این شکلیه: دستگاه رادیوش رو برای مدت کوتاهی روشن میکنه، چند بایت یا چند کیلوبایت داده رو منتقل یا دریافت میکنه، و بعد دوباره رادیو رو خاموش میکنه و به حالت خواب (Sleep Mode) برمیگرده.

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

    مقایسه بلوتوث کلاسیک و بلوتوث کم‌مصرف (BLE)

    با اینکه این دو تا پروتکل شباهت‌های زیادی دارن، مثلا هر دو زیرمجموعه استاندارد بلوتوث هستن و هر دو تو باند فرکانسی ۲.۴ گیگاهرتز کار میکنن، اما دو تا پروتکل کاملا جدا و ناسازگار با هم هستن. یعنی یک دستگاه که فقط بلوتوث کلاسیک داره نمیتونه به یک دستگاه که فقط BLE داره وصل بشه.

    • بلوتوث کلاسیک برای انتقال حجم زیادی از داده طراحی شده، اما در عوض مصرف انرژیش هم بالاست. همون مثال گوش دادن به موسیقی با هدفون بی‌سیم رو در نظر بگیرید. این یک کاربرد کلاسیک برای بلوتوث کلاسیکه.
    • بلوتوث کم‌مصرف (BLE)، از طرف دیگه، برای کاربردهایی طراحی شده که نیازی به انتقال حجم بالای داده ندارن اما در عوض عمر باتری خیلی براشون مهمه. مثلا یک سنسور دما تو یک انبار بزرگ رو تصور کنید که میخواید نصبش کنید و برای ماه‌ها یا حتی سال‌ها دیگه بهش دست نزنید. برای چنین کاربردی، BLE انتخاب خیلی بهتریه.

    البته تفاوت‌های فنی بیشتری بین این دو وجود داره، اما اگه بخوایم خیلی سطح بالا و خودمونی بگیم، تفاوت اصلی بین بلوتوث کلاسیک و BLE تو مصرف انرژی و سرعت انتقال داده است.

    ویژگیبلوتوث کلاسیک (Classic Bluetooth)بلوتوث کم‌مصرف (BLE)
    هدف اصلیانتقال مداوم داده (مثل صدا)انتقال بسته‌های کوچک داده به صورت دوره‌ای
    مصرف انرژیبالابسیار پایین (تا ۱۰۰ برابر کمتر از کلاسیک)
    سرعت انتقال دادهبالاترپایین‌تر
    کاربرد اصلیهدفون، اسپیکر، انتقال فایلسنسورها، گجت‌های پوشیدنی، دستگاه‌های پزشکی
    حالت کاریهمیشه متصل و فعالبیشتر اوقات در حالت خواب، برای مدت کوتاه فعال

    چرا BLE اینقدر خوبه؟ (مزیت‌ها)

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

    • مصرف انرژی پایین: حتی وقتی با بقیه تکنولوژی‌های کم‌مصرف مقایسه‌اش میکنیم، BLE باز هم بهینه و کم‌مصرفه. راز این مصرف کم اینه که رادیوی دستگاه تا جای ممکن خاموش میمونه و فقط برای فرستادن مقدار کمی داده با سرعت پایین برای مدت کوتاهی روشن میشه.
    • هزینه پایین برای شروع توسعه: ماژول‌ها و چیپست‌های BLE در مقایسه با تکنولوژی‌های مشابه، قیمت پایین‌تری دارن. این به خاطر اینه که استفاده ازش خیلی زیاد شده و رقابت تو بازار بالا رفته.
    • دسترسی آزاد به مستندات فنی: برای بیشتر پروتکل‌ها و تکنولوژی‌های بی‌سیم دیگه، شما باید عضو رسمی اون گروه یا کنسرسیوم بشید تا بتونید به مشخصات فنیش دسترسی داشته باشید. عضویت تو این گروه‌ها میتونه خیلی گرون باشه (حتی تا هزاران دلار در سال). اما برای BLE، مستندات فنی نسخه‌های اصلی (مثل 4.0, 4.2, 5.0, 5.1, 5.2, 5.3 و غیره) رو میتونید به صورت رایگان از وب‌سایت Bluetooth.com دانلود کنید.
    • وجود گسترده در گوشی‌های هوشمند: این شاید بزرگترین مزیت BLE نسبت به رقباش مثل ZigBee، Z-Wave و Thread باشه. تقریبا همه مردم دنیا یک گوشی هوشمند دارن و تقریبا تمام این گوشی‌ها سخت‌افزار BLE رو داخلشون دارن. این به توسعه‌دهنده‌ها یک پایگاه کاربری بالقوه خیلی بزرگ برای اپلیکیشن‌هاشون میده.

    آیا BLE هیچ محدودیتی نداره؟

    به عنوان یک توسعه‌دهنده، فهمیدن محدودیت‌های یک تکنولوژی به اندازه فهمیدن مزیت‌هاش مهمه. اینطوری میتونید تصمیم بگیرید که آیا این تکنولوژی برای پروژه شما مناسبه یا نه. بیایید چند تا از مهم‌ترین محدودیت‌های BLE رو بررسی کنیم.

    • سرعت انتقال داده (Throughput): سرعت انتقال داده تو BLE توسط نرخ داده رادیوی فیزیکی محدود میشه. این نرخ به نسخه بلوتوثی که استفاده میشه بستگی داره.
      • برای نسخه‌های بلوتوث قبل از ۵.۰، این نرخ روی ۱ مگابیت بر ثانیه (Mbps) ثابته.
      • اما برای بلوتوث ۵.۰ و بالاتر، این نرخ بسته به حالت و لایه فیزیکی (PHY) که استفاده میشه، متغیره. میتونه مثل نسخه‌های قبلی ۱ مگابیت بر ثانیه باشه، یا وقتی از قابلیت سرعت بالا (high-speed) استفاده میشه به ۲ مگابیت بر ثانیه برسه.
      • وقتی هم از قابلیت برد بلند (long-range) استفاده میشه، این نرخ به ۵۰۰ یا ۱۲۵ کیلوبیت بر ثانیه (Kbps) کاهش پیدا میکنه.
      • نکته مهم: این نرخ‌ها مربوط به لایه رادیوییه. سرعتی که کاربر نهایی در سطح اپلیکیشن تجربه میکنه، خیلی کمتر از این حرف‌هاست.
    • برد (Range): تکنولوژی BLE برای کاربردهای با برد کوتاه طراحی شده، برای همین برد عملکردش محدوده. چند تا عامل روی برد BLE تاثیر میذارن:
      • فرکانس کاری: این تکنولوژی تو طیف فرکانسی ۲.۴ گیگاهرتز ISM کار میکنه که خیلی تحت تاثیر موانعی مثل اشیای فلزی، دیوارها و آب (مخصوصا بدن انسان) قرار میگیره.
      • طراحی آنتن: عملکرد و طراحی آنتن دستگاه BLE خیلی مهمه.
      • پوشش فیزیکی دستگاه: قاب و بدنه دستگاه روی عملکرد آنتن تاثیر میذاره، مخصوصا اگه آنتن داخلی باشه.
      • جهت‌گیری دستگاه: این مورد هم به موقعیت قرارگیری آنتن مربوط میشه (مثلا تو گوشی‌های هوشمند). به طور کلی برد BLE بین ۰ تا ۲۵ متر بهینه است و در شرایط ایده‌آل میتونه تا ۱۰۰ متر هم برسه.
    • نیاز به دروازه (Gateway) برای اتصال به اینترنت: برای اینکه داده رو از یک دستگاه که فقط BLE داره به اینترنت بفرستید، به یک دستگاه دیگه نیاز دارید که هم BLE داشته باشه و هم به اینترنت وصل باشه (مثلا یک گوشی هوشمند یا یک دستگاه مخصوص). این دستگاه واسط، داده رو از دستگاه BLE میگیره و بعد به اینترنت منتقل میکنه.

    BLE رو کجاها میبینیم؟ (کاربردهای واقعی)

    وقتی BLE تو سال ۲۰۱۰ معرفی شد، تمرکزش بیشتر روی کاربردهای اینترنت اشیا (IoT) بود که تو اونها حجم کمی از داده با سرعت پایین منتقل میشه. تو این ده سال اخیر، BLE تو کاربردهای خیلی متنوعی از دستگاه‌های مصرفی گرفته تا تولیدات صنعتی استفاده شده. بیایید چند تا از رایج‌ترین کاربردهاش رو ببینیم:

    • اتوماسیون خانگی: بخش بزرگی از بازار خانه هوشمند به لطف استفاده از بلوتوث LE ممکن شده. این تکنولوژی به دستگاه‌هایی مثل لامپ‌های هوشمند، ترموستات‌های هوشمند، قفل‌های هوشمند و سنسورهایی که دود یا باز بودن پنجره رو تشخیص میدن، اجازه میده با هم ارتباط برقرار کنن.
    • ردیاب‌های تناسب اندام: خیلی از ما ساعت‌های هوشمند یا مچ‌بندهای سلامتی داریم که ضربان قلب، تعداد قدم‌ها و چیزای دیگه رو ردیابی میکنن. این دستگاه‌های سلامتی و ردیاب فعالیت، با استفاده از BLE با اپلیکیشن‌های روی گوشیمون ارتباط برقرار میکنن. این انتقال‌های کوتاه و سریع داده در فاصله نزدیک، یک مثال عالی برای کاربرد BLE هست.
    • دستگاه‌های صوتی: همه ما با هدفون‌های بلوتوثی آشناییم، اما معمولا این دستگاه‌ها از بلوتوث کلاسیک استفاده میکنن. یکی از جدیدترین پیشرفت‌ها در زمینه بلوتوث کم‌مصرف، چیزی به اسم LE Audio هست. این استاندارد جدید چندین مزیت نسبت به بلوتوث سنتی داره، از جمله کیفیت صدای بهتر، مصرف انرژی کمتر و پشتیبانی از سمعک‌ها.
    • ردیابی تماس (Contact Tracing): سیستم‌های هوشمند ردیابی تماس دارن برای کمک به جلوگیری از شیوع بیماری‌های عفونی استفاده میشن. به جای گزارش‌دهی دستی، ردیابی تماس با استفاده از BLE به صورت مداوم «تگ»های BLE یا گوشی‌های هوشمند اطراف رو اسکن میکنه تا به صورت ناشناس تماس‌های نزدیک بین افراد رو ثبت کنه. مثلا در یک محیط کاری، به هر کارمند یک تگ BLE داده میشه و اگه یک نفر بیمار بشه، به راحتی میشه فهمید چه کسانی با اون در تماس نزدیک بودن.
    • تگ‌های پیدا کردن اشیا: با شلوغ شدن سفرها، بعضی‌ها تگ‌هایی مثل AirTag یا Tile رو به چمدونشون وصل میکنن تا اگه گم شد بتونن پیداش کنن. این دستگاه‌های ردیاب دقیق که با BLE کار میکنن، فقط برای چمدون نیستن. میتونید اونها رو به هر چیزی که فکر میکنید ممکنه گم بشه وصل کنید، مثل دوچرخه یا کلید ماشین، و موقعیتش رو از طریق یک اپلیکیشن روی گوشی پیدا کنید.
    • تبلیغات هدفمند: تصور کنید تو یک فروشگاه لباس هستید و یهو یک نوتیفیکیشن روی گوشیتون میاد که یک کوپن تخفیف برای همون فروشگاهی که توش هستید بهتون میده. این نوع تبلیغات شخصی‌سازی شده و مبتنی بر مکان، دقیقا کاریه که تبلیغ‌کننده‌ها و صاحبان فروشگاه‌ها میتونن انجام بدن. این کار به لطف پیشرفت‌های بلوتوث ۵.۰ و تکنولوژی پخش همگانی «بیکن»های بلوتوثی ممکنه.
    • مدیریت انبار: مدیران انبارها دارن از راهکارهای مبتنی بر BLE برای ردیابی دما و رطوبت محموله‌های حساس، تشخیص افتادن بسته‌های شکننده و حتی پیدا کردن بهینه‌ترین مکان برای نگهداری دارایی‌ها در انبار استفاده میکنن. پتانسیل زیادی وجود داره که هوش مصنوعی و BLE با هم ترکیب بشن و یک زنجیره لجستیک واقعا هوشمند ایجاد کنن.
    • ایمنی کارکنان: تگ‌های BLE میتونن به روش‌های مختلفی به حفظ ایمنی کارکنان کمک کنن. مثلا دکمه‌های وحشت (Panic buttons) برای کارمندان بانک یا هتل که در معرض خطر هستن. این افراد میتونن با فشار دادن تگ BLE به صورت نامحسوس درخواست کمک کنن. یا سیستم‌های تشخیص سقوط (Fall detection) در سایت‌های ساختمانی یا خانه‌های سالمندان که به محض تشخیص سقوط، به صورت خودکار هشدار ارسال میکنن.

    بیکن‌های BLE (BLE Beacons)

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

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

    خب، حالا بریم سراغ بخش فنی ماجرا: معماری BLE

    پروتکل بلوتوث کم‌مصرف، حتی برای توسعه‌دهنده‌های باتجربه هم ساده نیست. برای اینکه سفر شما برای یادگیری توسعه BLE رو شروع کنیم، میخوایم معماری پروتکل بلوتوث LE رو به صورت کلی و لایه‌های مختلفش رو با هم بررسی کنیم.

    بلوتوث کم‌مصرف یک پروتکل هست. مثل هر پروتکل دیگه‌ای، این هم مثل یک کتابچه قوانینه که دستگاه‌ها برای ارتباط و تبادل اطلاعات باید ازش پیروی کنن. مهمه که بدونید عملکرد کلی یک پروتکل به پروتکل‌های کوچیکتری تقسیم میشه که هر کدوم یک وظیفه خیلی تخصصی دارن. این پروتکل‌های کوچیکتر در یک معماری لایه‌ای به اسم پشته پروتکل (Protocol Stack) کنار هم قرار میگیرن.

    پشته پروتکل بلوتوث به طور کلی به سه بخش یا زیرسیستم اصلی تقسیم میشه: اپلیکیشن (Application)، میزبان (Host) و کنترلر (Controller). داخل هر کدوم از این بلوک‌ها، لایه‌های مشخصی وجود داره.

    لایه‌های پروتکل BLE

    اگه شما توسعه‌دهنده‌ای هستید که میخواید اپلیکیشن‌های BLE بنویسید، لازم نیست خیلی نگران لایه‌هایی که پایین‌تر از لایه مدیر امنیت (Security Manager) و پروتکل ویژگی (Attribute Protocol) هستن باشید. اما دونستن کلیات این لایه‌ها میتونه مفید باشه. بیایید یه نگاهی بهشون بندازیم.

    • لایه فیزیکی (Physical Layer – PHY):
      این لایه به رادیوی فیزیکی اشاره داره که برای ارتباط و مدوله/دمدوله کردن داده استفاده میشه. این لایه تو همون باند فرکانسی ISM (طیف ۲.۴ گیگاهرتز) کار میکنه.
    • لایه پیوند (Link Layer):
      این لایه با لایه فیزیکی (رادیو) در ارتباطه و برای لایه‌های بالاتر یک راه برای تعامل با رادیو فراهم میکنه. این لایه مسئول مدیریت وضعیت رادیو و همچنین الزامات زمانی برای پایبندی به مشخصات فنی بلوتوث کم‌مصرفه.
    • رابط کنترلر میزبان (Host Controller Interface – HCI):
      لایه HCI یک پروتکل استاندارد هست که توسط مشخصات بلوتوtoh تعریف شده و به لایه میزبان (Host) اجازه میده با لایه کنترلر (Controller) ارتباط برقرار کنه. این لایه‌ها میتونن روی چیپ‌های جداگانه باشن یا هر دو روی یک چیپ باشن.
    • پروتکل کنترل و تطبیق پیوند منطقی (L2CAP):
      لایه L2CAP مثل یک لایه تقسیم‌کننده پروتکل عمل میکنه. این لایه چندین پروتکل رو از لایه‌های بالاتر میگیره و اونها رو تو بسته‌های استاندارد BLE قرار میده. بعد این بسته‌ها رو به لایه‌های پایین‌تر میفرسته.
    • پروتکل ویژگی (Attribute Protocol – ATT):
      پروتکل ATT تعریف میکنه که یک سرور چطور داده‌هاش رو در اختیار یک کلاینت قرار میده و این داده‌ها چطور ساختاردهی شدن.
    • پروفایل ویژگی عمومی (Generic Attribute Profile – GATT):
      این لایه یکی از مهم‌ترین لایه‌ها برای توسعه‌دهنده‌هاست. GATT فرمت داده‌ای که توسط یک دستگاه BLE ارائه میشه رو تعریف میکنه. همچنین رویه‌های لازم برای دسترسی به این داده‌ها رو مشخص میکنه.

      تو GATT دو تا نقش اصلی وجود داره: سرور (Server) و کلاینت (Client).

      • سرور: دستگاهیه که داده‌هایی که کنترل میکنه یا در اختیار داره رو به بقیه نشون میده.

      • کلاینت: دستگاهیه که با سرور ارتباط برقرار میکنه تا داده‌های سرور رو بخونه یا رفتارش رو کنترل کنه.

      یادتون باشه که یک دستگاه BLE میتونه همزمان هم سرور باشه و هم کلاینت.

      برای فهمیدن GATT، باید با دو مفهوم کلیدی آشنا بشید: سرویس‌ها (Services) و مشخصه‌ها (Characteristics).


      • سرویس (Service): یک گروه از یک یا چند «ویژگی» (Attribute) هست. هدفش اینه که ویژگی‌های مرتبط که یک کارکرد خاص رو روی سرور انجام میدن، کنار هم جمع کنه. مثلا، «سرویس باتری» که توسط خود گروه SIG تعریف شده، شامل یک مشخصه به اسم «سطح باتری» هست.

      • مشخصه (Characteristic): همیشه بخشی از یک سرویسه و یک تیکه از اطلاعات یا داده رو نشون میده که سرور میخواد در اختیار کلاینت بذاره. مثلا، «مشخصه سطح باتری» میزان شارژ باقی‌مونده باتری رو نشون میده که کلاینت میتونه اون رو بخونه.

      در BLE، شش نوع عملیات روی مشخصه‌ها وجود داره:

      • دستورها (Commands)
      • درخواست‌ها (Requests)
      • پاسخ‌ها (Responses)
      • اعلان‌ها (Notifications)
      • نشانه‌ها (Indications)
      • تاییدها (Confirmations)
    • پروفایل دسترسی عمومی (Generic Access Profile – GAP):
      این هم یکی دیگه از لایه‌های بسیار مهم برای توسعه‌دهنده‌هاست. GAP یک چارچوب تعریف میکنه که میگه دستگاه‌های BLE چطور با هم تعامل کنن. این شامل موارد زیر میشه:

      • نقش‌های دستگاه‌های BLE

      • تبلیغات (Advertising) – (پخش همگانی، کشف، پارامترهای تبلیغ، داده تبلیغ)

      • برقراری ارتباط (Connection) – (شروع ارتباط، پذیرش ارتباط، پارامترهای ارتباط)

      • امنیت


      نقش‌های مختلف یک دستگاه BLE اینها هستن:



      • پخش‌کننده (Broadcaster): دستگاهی که تبلیغات (Advertisements) میفرسته اما بسته‌ای دریافت نمیکنه و اجازه اتصال هم به کسی نمیده. مثل یک بیکن.

      • ناظر (Observer): دستگاهی که به بسته‌های تبلیغاتی که بقیه میفرستن گوش میده اما با دستگاه تبلیغ‌کننده ارتباط برقرار نمیکنه.

      • مرکزی (Central): دستگاهی که دستگاه‌های تبلیغ‌کننده دیگه رو کشف میکنه و بهشون گوش میده. یک دستگاه مرکزی این قابلیت رو هم داره که به یک دستگاه تبلیغ‌کننده وصل بشه. معمولا گوشی‌های هوشمند یا کامپیوترها این نقش رو دارن.

      • پیرامونی (Peripheral): دستگاهی که تبلیغ میکنه و اتصال از دستگاه‌های مرکزی رو قبول میکنه. معمولا سنسورها، ساعت‌های هوشمند و دستگاه‌های کوچیک این نقش رو دارن.


      یادتون باشه که یک دستگاه میتونه همزمان چند تا نقش داشته باشه. مثلا گوشی هوشمند شما میتونه در نقش مرکزی باشه وقتی به ساعت هوشمندتون وصله، و همزمان در نقش پیرامونی باشه وقتی به کامپیوترتون وصله.


    ردیابی موقعیت با BLE

    یکی از جذاب‌ترین کاربردهای BLE، استفاده از اون برای ردیابی موقعیت در فضاهای داخلیه، جایی که GPS کار نمیکنه. این کار معمولا با دو روش انجام میشه: استفاده از سنسورها یا استفاده از بیکن‌ها.

    • موقعیت‌یابی با سنسورها: در این روش، سنسورهای BLE در مکان‌های ثابتی در یک فضای داخلی نصب میشن. این سنسورها به صورت غیرفعال به سیگنال‌های ارسالی از دستگاه‌های بلوتوثی مثل گوشی‌های هوشمند، تگ‌های ردیابی دارایی، بیکن‌ها و گجت‌های پوشیدنی گوش میدن. با توجه به قدرت سیگنال دریافتی (RSSI) از دستگاه فرستنده، موقعیت اون دستگاه تخمین زده میشه. این داده به یک سیستم موقعیت‌یاب داخلی (IPS) فرستاده میشه و اون سیستم با استفاده از الگوریتم‌های چندجانبه‌سازی (multilateration) موقعیت دقیق دستگاه رو محاسبه میکنه.
    • موقعیت‌یابی با بیکن‌ها: در این روش، بیکن‌ها در مکان‌های ثابت نصب میشن و به طور مداوم سیگنال‌هایی حاوی یک شناسه منحصر به فرد رو پخش میکنن. یک دستگاه مثل گوشی هوشمند که یک اپلیکیشن مخصوص روش نصب شده، وقتی در محدوده بیکن قرار میگیره، سیگنال رو دریافت میکنه. اگه دستگاه سیگنال حداقل سه بیکن رو دریافت کنه، میتونه با مقایسه قدرت سیگنال اونها، موقعیت خودش رو تخمین بزنه.

    دقت موقعیت‌یابی با BLE معمولا در حد چند متر (کمتر از ۵ متر در شرایط بهینه) هست. این دقت به اندازه تکنولوژی‌هایی مثل UWB (که دقت در حد سانتی‌متر داره) بالا نیست، اما برای خیلی از کاربردها کاملا کافیه و مزیت‌هایی مثل هزینه پایین و مصرف انرژی کم داره.

    آینده موقعیت‌یابی با BLE: با معرفی بلوتوث ۵.۱ و قابلیت جدیدش به اسم جهت‌یابی (Direction Finding)، قراره دقت موقعیت‌یابی با BLE به سطح زیر یک متر و حتی سانتی‌متر برسه. این قابلیت جدید به دستگاه‌ها اجازه میده نه تنها قدرت سیگنال، بلکه زاویه رسیدن سیگنال (Angle of Arrival – AoA) رو هم محاسبه کنن که باعث میشه موقعیت‌یابی خیلی دقیق‌تر بشه.

    پرسش و پاسخ‌های رایج در مورد BLE

    • سوال ۱: پس BLE همون بلوتوث معمولیه؟
      نه. با اینکه هر دو زیرمجموعه استاندارد بلوتوث هستن، اما دو تا پروتکل جدا و ناسازگار با هم هستن. بلوتوث کلاسیک برای انتقال مداوم داده مثل صدا طراحی شده و مصرف انرژی بالایی داره. BLE برای انتقال‌های کوتاه و کم‌حجم داده طراحی شده و مصرف انرژیش فوق‌العاده پایینه.
    • سوال ۲: چرا BLE برای اینترنت اشیا (IoT) اینقدر مهمه؟
      دو دلیل اصلی وجود داره: اول، مصرف انرژی خیلی پایینش که باعث میشه دستگاه‌های باتری‌خور بتونن برای ماه‌ها یا سال‌ها کار کنن. دوم، برای اکثر کاربردهای IoT مثل سنسورها، فقط لازمه حجم کمی از داده (مثلا فقط دمای فعلی) به صورت دوره‌ای ارسال بشه که BLE برای این کار کاملا بهینه است.
    • سوال ۳: BLE به زبان ساده چطور کار میکنه؟
      سه مرحله اصلی داره:
      1. تبلیغ (Advertising): دستگاه‌های پیرامونی (مثل یک سنسور) بسته‌های کوچیک داده رو به صورت مداوم پخش میکنن تا حضور خودشون رو اعلام کنن.
      2. اسکن (Scanning): دستگاه‌های مرکزی (مثل یک گوشی) به این بسته‌های تبلیغاتی گوش میدن تا دستگاه‌های اطراف رو پیدا کنن.
      3. اتصال (Connection): وقتی دستگاه مرکزی یک دستگاه پیرامونی رو پیدا کرد، میتونه بهش درخواست اتصال بده و بعد از اون، دو دستگاه میتونن داده رو به صورت دوطرفه رد و بدل کنن.
    • سوال ۴: نقش‌های مختلف دستگاه‌های BLE چی هستن؟
      چهار نقش اصلی وجود داره:
      • پیرامونی (Peripheral): دستگاهی که تبلیغ میکنه و منتظر اتصال میمونه (مثل ساعت هوشمند).
      • مرکزی (Central): دستگاهی که اسکن میکنه و اتصال رو برقرار میکنه (مثل گوشی موبایل).
      • پخش‌کننده (Broadcaster): دستگاهی که فقط تبلیغ میکنه و قابل اتصال نیست (مثل بیکن‌ها).
      • ناظر (Observer): دستگاهی که فقط به تبلیغات گوش میده و وصل نمیشه.
    • سوال ۵: چند تا مثال واقعی از کاربرد BLE میزنید؟
      حتما. ردیاب‌های تناسب اندام (مثل فیت‌بیت)، ساعت‌های هوشمند، تجهیزات پزشکی بی‌سیم (مثل مانیتورهای قند خون)، قفل‌های هوشمند در خانه، لامپ‌های هوشمند، تگ‌های پیدا کردن وسایل (مثل ایرتگ)، و سیستم‌های موقعیت‌یاب داخلی در فروشگاه‌ها و فرودگاه‌ها، همگی از BLE استفاده میکنن.

    منابع

    • [2] Bluetooth Low Energy (BLE) – Cisco Meraki Documentation
    • [4] Bluetooth RTLS: BLE Location Tracking & Positioning | Inpixon
    • [6] What is Medical BLE? | AiRISTA Blog
    • [8] BLE Scanner 4.0 on the App Store
    • [10] BLE Scanner (Connect & Notify) – Apps on Google Play
    • [1] BLE vs Bluetooth : r/embedded
    • [3] Bluetooth Low Energy (BLE): A Complete Guide
    • [5] Can someone explain BLE to me? (Bluetooth Modules) : r/embedded
    • [7] BLE | Bluetooth Low Energy – Why Everyone Is Using It?
    • [9] BLE (Bluetooth Low Energy): What Is BLE? | 7SIGNAL
  • آشنایی و کار با سرور دیتابیس مای‌اس‌کیو‌ال MySQL

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

    دیتابیس یعنی چی؟

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

    مدل رابطه‌ای یا Relational یعنی چی؟

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

    این ساختار منطقی، که بهش میگن «اسکیما» (Schema)، تعریف میکنه که داده‌ها چطور سازماندهی بشن و جدول‌های مختلف چه رابطه‌ای با هم دارن. مثلا میشه تعریف کرد که هر کاربر میتونه چند تا محصول رو بخره. اینجوری برنامه‌نویس‌ها و مدیرای دیتابیس میتونن خیلی راحت داده‌ها رو ذخیره، بازیابی و تحلیل کنن. از متن ساده و عدد و تاریخ گرفته تا چیزهای جدیدتر مثل JSON و وکتورها.

    SQL چیه؟

    خب، حالا که یه انبار مرتب داریم، چطوری باهاش حرف بزنیم؟ چطوری بهش بگیم «لیست همه کاربرایی که اهل تهران هستن رو بهم بده»؟ اینجا SQL وارد میشه. اس‌کیو‌ال (SQL) که مخفف Structured Query Language یا «زبان پرس‌وجوی ساختاریافته» هست، یه زبان برنامه‌نویسیه که برای بازیابی، آپدیت، حذف و کلا مدیریت داده‌ها توی دیتابیس‌های رابطه‌ای استفاده میشه. مای‌اس‌کیو‌ال هم اسمش رو از همین SQL گرفته و از این زبان برای مدیریت و پرس‌وجو از داده‌ها استفاده میکنه.

    تلفظ درستش چیه؟

    تلفظ رسمی این اسم «مای‌اس‌کیو‌ال» (My S-Q-L) هست، ولی خیلی‌ها بهش «مای‌سیکوئل» (My Sequel) هم میگن که یه تلفظ رایجه.

    پس به طور خلاصه، مای‌اس‌کیو‌ال یه سیستم مدیریت دیتابیسه که داده‌ها رو توی جدول‌های منظم نگهداری میکنه و با استفاده از زبان SQL به ما اجازه میده با این داده‌ها کار کنیم.

    بخش دوم: چرا اینقدر طرفدار داره و کجاها به کار میاد؟

    محبوبیت مای‌اس‌کیو‌ال اتفاقی نیست. چند تا دلیل کلیدی وجود داره که باعث شده این سیستم بعد از حدود ۳۰ سال هنوزم یکی از اولین انتخاب‌ها برای خیلی از پروژه‌ها باشه.

    ۱. اوپن سورس بودن و جامعه بزرگ

    یکی از بزرگترین مزیت‌های مای‌اس‌کیو‌ال اینه که اوپن سورسه. یعنی چی؟ یعنی هر کسی میتونه نرم‌افزارش رو از اینترنت دانلود کنه و بدون هیچ هزینه‌ای ازش استفاده کنه. شرکت‌ها حتی میتونن کد منبعش رو تغییر بدن تا با نیازهای خاص خودشون هماهنگ بشه.

    این نرم‌افزار تحت مجوزی به اسم GNU General Public License (GPL) منتشر میشه که یه سری قوانین مشخص داره. البته اگه شرکتی نخواد از این مجوز استفاده کنه یا بخواد کد مای‌اس‌کیو‌ال رو توی یه محصول تجاری قرار بده، میتونه نسخه تجاریش رو بخره.

    این اوپن سورس بودن باعث شده یه جامعه جهانی خیلی بزرگ و فعال دورش شکل بگیره. این جامعه کلی دانش و منبع تولید میکنه؛ از آموزش‌های مختلف گرفته تا راهنمایی توی فروم‌ها. همین جامعه با تست کردن نرم‌افزار توی سناریوهای مختلف، به پیدا کردن و رفع باگ‌ها کمک زیادی کرده و مای‌اس‌کیو‌ال رو به یه سیستم خیلی قابل اعتماد تبدیل کرده.

    ۲. کارایی، پایداری و مقیاس‌پذیری بالا

    مای‌اس‌کیو‌ال به سریع، قابل اعتماد و مقیاس‌پذیر بودن معروفه. این سیستم از اول برای این ساخته شده که بتونه دیتابیس‌های بزرگ رو به سرعت مدیریت کنه و سال‌هاست که توی محیط‌های کاری خیلی سنگین و حساس استفاده میشه.

    • مقیاس‌پذیری (Scalability): یکی از ویژگی‌های مهم مای‌اس‌کیو‌ال، معماری تکثیر (Replication) داخلیشه. این ویژگی به شرکت‌های بزرگی مثل فیسبوک اجازه میده که اپلیکیشن‌هاشون رو برای پشتیبانی از میلیاردها کاربر مقیاس‌پذیر کنن. یعنی وقتی کسب‌وکار رشد میکنه و تعداد کاربرها زیاد میشه، مای‌اس‌کیو‌ال هم میتونه پا به پاش بزرگ بشه.
    • تراکنش‌های ACID: برنامه‌نویس‌ها روی دو تا قابلیت کلیدی مای‌اس‌کیو‌ال خیلی حساب میکنن: یکی همین مقیاس‌پذیری و اون یکی پشتیبانی از تراکنش‌های ACID. این کلمه مخفف چهارتا خاصیته: «اتمی بودن (Atomicity)، سازگاری (Consistency)، ایزوله‌سازی (Isolation) و دوام (Durability)». این چهارتا ویژگی تضمین میکنن که تراکنش‌های دیتابیس به شکل قابل اعتماد و دقیقی پردازش بشن. با این قابلیت، مای‌اس‌کیو‌ال میتونه تضمین کنه که همه تغییرات داده‌ها به شکلی پایدار و مطمئن انجام میشن، حتی اگه وسط کار سیستم به مشکل بخوره یا برق بره.

    ۳. سادگی در استفاده و سازگاری گسترده

    خیلی‌ها مای‌اس‌کیو‌ال رو به خاطر سادگی در نصب و استفاده تحسین میکنن. در عین حال، به اندازه‌ای قابل اعتماد و مقیاس‌پذیره که برای سازمان‌هایی با حجم داده بسیار بزرگ و تعداد کاربران زیاد هم مناسبه.

    این سیستم با پلتفرم‌های تکنولوژی و زبان‌های برنامه‌نویسی مختلفی مثل جاوا، پایتون، پی‌اچ‌پی (PHP) و جاوااسکریپت سازگاری بالایی داره. یه نکته جالب دیگه اینه که از تکثیر (replication) بین نسخه‌های مختلف هم پشتیبانی میکنه. یعنی یه اپلیکیشن که با مای‌اس‌کیو‌ال نسخه ۵.۷ کار میکنه، میتونه به راحتی به نسخه ۸.۰ تکثیر بشه.

    علاوه بر این، مای‌اس‌کیو‌ال انعطاف‌پذیری خوبی برای توسعه اپلیکیشن‌های دیتابیس سنتی (SQL) و اپلیکیشن‌های بدون اسکیما (NoSQL) داره. این یعنی برنامه‌نویس‌ها میتونن داده‌های رابطه‌ای و اسناد JSON رو توی یک دیتابیس و یک اپلیکیشن با هم ترکیب کنن.

    ۴. مقرون به صرفه بودن

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

    کاربردهای واقعی مای‌اس‌کیو‌ال

    توانایی مای‌اس‌کیو‌ال در ذخیره و تحلیل حجم عظیمی از داده‌ها باعث شده که توی کارهای خیلی متنوعی، از کمک به تصمیم‌گیری‌های پیچیده تجاری گرفته تا پیدا کردن یه رستوران محلی برای قرار شام، کاربرد داشته باشه. بعضی از کاربردهای اصلیش ایناست:

    • وب‌سایت‌های فروشگاهی (Ecommerce): برای مدیریت اطلاعات مشتریان و محصولات.
    • سیستم‌های مدیریت محتوا (CMS): برای ارائه محتوای وب‌سایت‌ها.
    • اپلیکیشن‌های مالی: برای ردیابی امن تراکنش‌ها و داده‌های مالی.
    • شبکه‌های اجتماعی: برای ذخیره پروفایل کاربران و تعاملاتشون.

    بخش سوم: سرور چیه و چرا مای‌اس‌کیو‌ال بهش نیاز داره؟

    خب، حالا که فهمیدیم مای‌اس‌کیو‌ال چیه، بیاید در مورد یه مفهوم کلیدی دیگه حرف بزنیم: «سرور». شاید شنیده باشید که میگن «سرور مای‌اس‌کیو‌ال». این یعنی چی؟

    مفهوم موتور (Engine) دیتابیس

    هر سیستم مدیریت دیتابیس رابطه‌ای (RDBMS) یه چیزی به اسم «موتور» (Engine) داره. این موتور در واقع اون بخشیه که کوئری‌های شما رو تفسیر میکنه و نتایج رو برمیگردونه. بدون این موتور، دیتابیس شما چیزی بیشتر از یه فضای ذخیره‌سازی ساده نیست. به این موتور به طور کلی میگن «سرور».

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

    چرا از یه فایل متنی ساده استفاده نکنیم؟

    شاید بپرسید چرا اینقدر پیچیده‌اش کنیم؟ چرا داده‌ها رو توی یه فایل متنی ساده نریزیم؟ خب، میتونید این کار رو بکنید. میتونید داده‌هاتون رو سریالایز کنید و توی یه فایل متنی ذخیره کنید. ولی وقتی این کار رو میکنید، تمام مسئولیت ذخیره‌سازی و مدیریت داده‌ها میفته گردن کد خودتون.

    یه مفهوم کلیدی توی دیتابیس‌های مبتنی بر SQL، همون اصول ACID هست که قبلا در موردش حرف زدیم. سرور دیتابیس این توانایی رو داره که چندین کوئری همزمان رو مدیریت و صف‌بندی کنه و در عین حال، این اصول رو حفظ کنه. دیتابیس‌ها برای کارایی بالا به حافظه (RAM) و پردازنده (CPU) زیادی نیاز دارن و باید به فضای ذخیره‌سازی با تاخیر کم (low-latency) دسترسی داشته باشن.

    مدل کلاینت/سرور

    مای‌اس‌کیو‌ال یه سیستم کلاینت/سرور هست. این سیستم از یه سرور SQL چند رشته‌ای (multithreaded) تشکیل شده که از بک‌اند‌های مختلفی پشتیبانی میکنه. در کنارش، چندین برنامه و کتابخونه کلاینت، ابزارهای مدیریتی و رابط‌های برنامه‌نویسی اپلیکیشن (API) متنوعی هم وجود داره.

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

    چرا سرور رو روی یه سخت‌افزار جدا میذارن؟

    چند تا دلیل مهم برای این کار وجود داره:

    1. منابع سیستم: دیتابیس‌ها به شدت به ورودی/خروجی (IO) وابسته‌ان. اگه حافظه کافی برای بارگذاری همه چیز توی رم وجود نداشته باشه، باید از فایل سیستم استفاده بشه. ممکنه روی کامپیوتر شما منابع کافی برای اجرای همزمان دیتابیس و برنامه اصلی با کارایی مطلوب وجود نداشته باشه.
    2. امنیت: نسخه‌های تجاری و سازمانی موتورهای دیتابیس برای رسیدن به کارایی بالاتر، نیاز دارن که به سطح پایین‌تری از سیستم دسترسی داشته باشن و امتیازات امنیتی بیشتری بگیرن. این موضوع میتونه یه ریسک امنیتی بزرگ برای داده‌های شرکتی باشه. به همین دلیل، موتور دیتابیس معمولا روی یه سرور اختصاصی با یه زمینه امنیتی خاص میزبانی میشه که کاربرای عادی اصلا اجازه لاگین به کنسولش رو ندارن. چون این سرورها میتونن آسیب‌پذیر باشن، معمولا از فایروال‌ها برای مقاوم‌سازیشون در برابر حملات استفاده میشه.
    3. مدیریت: مدیریت همه این موارد روی یه کامپیوتر شخصی یا ایستگاه کاری میتونه خیلی دردسرساز باشه.

    بحث مرکزی‌سازی: آیا همیشه خوبه که یه سرور دیتابیس برای همه سرویس‌ها داشته باشیم؟

    یه سوالی که برای خیلی از مدیران سیستم پیش میاد اینه که آیا بهتره یه ماشین مجازی (VM) یا سرور اختصاصی فقط برای مای‌اس‌کیو‌ال داشته باشیم و بقیه سرویس‌ها (مثل Nextcloud و…) به اون وصل بشن، یا اینکه برای هر سرویس، یه سرور مای‌اس‌کیو‌ال جدا روی همون ماشین مجازی خودش نصب کنیم؟

    جواب کوتاه اینه که «نه، مرکزی‌سازی همیشه بهترین راه نیست». رویکردهای مختلفی برای شرایط مختلف وجود داره و این یه تصمیمه که به نیازهای خاص هر پروژه بستگی داره.

    بخش چهارم: چطوری مای‌اس‌کیو‌ال رو به دست بیاریم؟

    خب، حالا که با مفاهیم اولیه آشنا شدیم، بیاید ببینیم چطوری میشه مای‌اس‌کیو‌ال رو دانلود و نصب کرد. مای‌اس‌کیو‌ال در چند نسخه مختلف ارائه میشه که هر کدوم برای یه سری کاربردها مناسبن.

    نسخه‌های مختلف مای‌اس‌کیو‌ال

    • MySQL Enterprise Edition: این نسخه جامع‌ترین مجموعه از ویژگی‌های پیشرفته، ابزارهای مدیریتی و پشتیبانی فنی رو برای مای‌اس‌کیو‌ال شامل میشه. هدفش رسیدن به بالاترین سطح از مقیاس‌پذیری، امنیت، قابلیت اطمینان و آپ‌تایم (uptime) هست.
    • MySQL NDB Cluster CGE: این نسخه یه دیتابیس تراکنشی اوپن سورس و real-time هست که برای دسترسی سریع و همیشه روشن به داده‌ها در شرایطی با توان عملیاتی بالا (high throughput) طراحی شده. این نسخه شامل MySQL NDB Cluster Manager و همه چیزهایی که در نسخه Enterprise Edition هست هم میشه.
    • MySQL Community (GPL) Downloads: این همون نسخه اوپن سورس و رایگان مای‌اس‌کیو‌ال هست که تحت مجوز GPL منتشر میشه و اکثر افراد از این نسخه برای پروژه‌هاشون استفاده میکنن.
    • MySQL برای ISVها، OEMها و VARها: جالبه بدونید که بیش از ۲۰۰۰ تا ISV (فروشنده نرم‌افزار مستقل)، OEM (سازنده تجهیزات اصلی) و VAR (نماینده فروش با ارزش افزوده) به مای‌اس‌کیو‌ال به عنوان دیتابیس تعبیه شده (embedded) در محصولاتشون اعتماد میکنن. این کار بهشون کمک میکنه تا اپلیکیشن‌ها، سخت‌افزارها و دستگاه‌هاشون رو رقابتی‌تر کنن، سریع‌تر به بازار عرضه کنن و هزینه تمام شده کالاهاشون رو کاهش بدن.

    راهنمای نصب با MySQL Installer

    برای نصب مای‌اس‌کیو‌ال روی ویندوز، یه ابزار خیلی راحت به اسم MySQL Installer وجود داره. این ابزار یه تجربه نصب جادوگر-محور (wizard-based) رو برای تمام نیازهای نرم‌افزاری مای‌اس‌کیو‌ال شما فراهم میکنه.

    • نسخه 8.0.43: اینستالرهای نسخه‌های ۵.۷ تا ۸.۰ شامل آخرین ورژن‌های محصولات مای‌اس‌کیو‌ال هستن.
    • نکته مهم در مورد نسخه‌های جدید: توجه داشته باشید که سری ۸.۰ آخرین سری هست که MySQL Installer داره. از نسخه ۸.۱ به بعد، باید از فایل MSI یا آرشیو Zip خود محصول مای‌اس‌کیو‌ال برای نصب استفاده کنید. همچنین، سرور مای‌اس‌کیو‌ال نسخه ۸.۱ و بالاتر، ابزاری به اسم MySQL Configurator رو هم همراه خودش داره که به پیکربندی سرور کمک میکنه.
    کدوم فایل رو انتخاب کنیم؟

    وقتی میخواید اینستالر رو دانلود کنید، دو تا گزینه اصلی دارید:

    1. mysql-installer-web-community: اگه موقع اجرای اینستالر به اینترنت وصل هستید، این فایل رو انتخاب کنید. این نسخه حجم کمتری داره و فایل‌های مورد نیاز رو موقع نصب دانلود میکنه.
    2. mysql-installer-community: اگه موقع اجرای اینستالر به اینترنت دسترسی ندارید، این فایل رو انتخاب کنید. این نسخه همه فایل‌های لازم رو داخل خودش داره و حجمش بیشتره.

    یه نکته فنی هم اینه که خود برنامه MySQL Installer ۳۲ بیتی هست، ولی میتونه هم باینری‌های ۳۲ بیتی و هم ۶۴ بیتی رو نصب کنه.

    بخش پنجم: یه کیس استادی واقعی: ساختن یه سرور قدرتمند برای مای‌اس‌کیو‌ال

    تئوری کافیه، بیاید یه مثال واقعی رو با هم بررسی کنیم. فرض کنید صاحب یه کسب‌وکار کوچیک هستید و میخواید یه سرور دیتابیس جدید برای میزبانی یه دیتابیس تحلیل صنعت و تحقیقات بازار راه بندازید. این سناریو از یه فروم واقعی به اسم Level1Techs برداشته شده.

    مشخصات دیتابیس مورد نظر:

    • نسخه مای‌اس‌کیو‌ال: ۸.۴
    • اندازه دیتابیس: حدود ۱ ترابایت، پخش شده در حدود ۱۵۰ تا جدول.
    • مشخصات جداول: طولانی‌ترین جدول حدود ۱۰ میلیارد ردیف داره و میانگین طول جداول ۱۰۰ میلیون ردیفه.
    • نوع کاربری:
      • نوشتن (Writes) خیلی کم: به جز بارگذاری اولیه، آپدیت‌ها به صورت ساعتی یا روزانه توسط خزنده‌های وب (crawlers) مختلف انجام میشه و فقط یه کاربر مینویسه.
      • کوئری‌های (Queries) کم ولی پیچیده: کوئری‌ها شامل تعداد زیادی JOIN و WHERE هستن و فقط یه کاربر برای گزارش‌گیری روزانه و تحلیل‌های موردی ازشون استفاده میکنه.

    سخت‌افزار جدید پیشنهادی:

    بر اساس این نیازها، کاربر یه سخت‌افزار خیلی جالب رو پیشنهاد داده. بیاید قطعاتش رو با هم بررسی کنیم:

    • پردازنده (CPU): AMD Ryzen 9 7900X
      • چرا این انتخاب شده؟ بر اساس نوع کاربری که کوئری‌های پیچیده ولی تکی داره، عملکرد تک‌هسته‌ای (single core performance) خیلی کلیدیه. این پردازنده میتونه تا فرکانس ۵.۶ گیگاهرتز بوست بشه که برای این کار عالیه.
    • حافظه (RAM): 4x 32GB DDR5 ECC UDIMM 2Rx8 4800
      • چرا ECC؟ عبارت ECC مخفف Error-Correcting Code هست. این نوع رم میتونه خطاهای کوچیک حافظه رو به صورت خودکار شناسایی و تصحیح کنه. برای یه سرور دیتابیس که پایداری داده‌ها حیاتیه، استفاده از رم ECC یه تصمیم هوشمندانه است.
    • مادربورد (Motherboard): AsRock Rack B650D4U-2L2T/BCM
    • فضای ذخیره‌سازی (Storage):
      • درایوهای اصلی: 4x Samsung PM9A3 1920GB 2.5″ in a ZFS RAID 10
      • کش نوشتن (SLOG): 1x Intel Optane P4800X as ZFS SLOG vdev
    • سیستم عامل (OS): Debian 12

    مقایسه با سخت‌افزار فعلی:

    سخت‌افزار فعلی این کاربر یه Intel Xeon E3-1230 v6 با ۳۲ گیگابایت رم غیر-ECC و یه SSD معمولی بوده. ارتقای پیشنهادی یه جهش عظیم در عملکرد محسوب میشه.

    یه سوال مهم: Ryzen یا EPYC؟

    کاربر یه سوال خوب هم پرسیده: آیا بهتر نیست به جای این سیستم، یه سرور مبتنی بر پردازنده استفاده شده EPYC (مثلا مدل 7F52) ببندم؟

    • مزایای EPYC: این پردازنده ۴ برابر کش L3 بیشتری داره و از رم بیشتری هم پشتیبانی میکنه.
    • معایب EPYC: فرکانس بوستش فقط تا ۳.۹ گیگاهرتز میرسه، در حالی که Ryzen تا ۵.۶ گیگاهرتز میره.

    اینجا یه بده‌بستان (trade-off) وجود داره. برای کاربری خاص این شخص که عملکرد تک‌هسته‌ای مهمه، Ryzen 7900X با فرکانس بالاترش احتمالا انتخاب بهتریه. اما برای سناریوهایی با تعداد کاربران همزمان زیاد، EPYC با کش و هسته‌های بیشترش میتونه برنده باشه.

    بخش ششم: مدیریت مای‌اس‌کیو‌ال با وب‌مین (Webmin) – یه راهنمای کامل

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

    شروع کار با ماژول مای‌اس‌کیو‌ال در وب‌مین

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

    ساختن یه دیتابیس جدید

    وقتی مای‌اس‌کیو‌ال برای اولین بار نصب میشه، یه دیتابیس به اسم mysql ساخته میشه که اطلاعات مربوط به کاربران و دسترسی‌ها رو تو خودش نگه میداره. بهتره برای داده‌های خودتون یه دیتابیس جدا بسازید. مراحلش اینه:

    1. روی لینک «Create a new database» کلیک کنید.
    2. یه اسم برای دیتابیس جدیدتون توی فیلد «Database name» وارد کنید. اسم باید فقط شامل حروف و اعداد باشه و فاصله نداشته باشه.
    3. روی دکمه «Create» کلیک کنید. به همین راحتی!

    ساختن یه جدول جدید

    حالا که دیتابیس رو داریم، باید توش جدول بسازیم.

    1. روی آیکون دیتابیسی که ساختید کلیک کنید.
    2. تعداد فیلدهایی (ستون‌هایی) که میخواید جدولتون داشته باشه رو وارد کنید و روی دکمه «Create a new table» کلیک کنید.
    3. یه اسم برای جدولتون توی فیلد «Table name» وارد کنید.
    4. نوع جدول (Table type): اینجا میتونید نوع موتور ذخیره‌سازی جدول رو انتخاب کنید. رایج‌ترین‌ها اینان:
    5. تعریف فیلدها (Initial fields):
    6. وقتی همه فیلدها رو تعریف کردید، روی دکمه «Create» کلیک کنید.

    مشاهده و ویرایش محتوای جدول

    اگه میخواید داده‌های داخل یه جدول رو ببینید، ویرایش کنید، یا ردیف جدیدی اضافه کنید:

    1. روی آیکون دیتابیس و بعد روی آیکون جدول مورد نظرتون کلیک کنید.
    2. روی دکمه «View Data» کلیک کنید.
    3. لیستی از ردیف‌های جدول به شما نشون داده میشه. اگه جدول شما کلید اصلی داشته باشه، میتونید:

    نکته مهم: اگه یه جدول کلید اصلی نداشته باشه، وب‌مین نمیتونه ردیف‌های خاصی رو برای ویرایش یا حذف شناسایی کنه. پس همیشه برای جدول‌هاتون یه کلید اصلی تعریف کنید.

    پشتیبان‌گیری (Backup) و بازیابی (Restore)

    بکاپ گرفتن از دیتابیس‌های مهم یکی از حیاتی‌ترین کارهاست. وب‌مین این کار رو خیلی ساده کرده.

    برای ساختن بکاپ:

    1. وارد صفحه دیتابیس مورد نظر بشید.
    2. روی دکمه «Backup Database» کلیک کنید.
    3. توی فیلد «Backup to file»، آدرس فایلی که میخواید بکاپ توش ذخیره بشه رو وارد کنید (مثلا /tmp/backup.sql).
    4. یه گزینه مهم به اسم «Add drop table statements to backup?» وجود داره. اگه این رو روی «Yes» بذارید، موقع بازیابی بکاپ، اگه جدولی با همون اسم از قبل وجود داشته باشه، اول حذف میشه و بعد داده‌های جدید جایگزین میشن. این برای بکاپ‌های معمولی خوبه. اگه روی «No» بذارید، داده‌های بکاپ به داده‌های موجود اضافه میشن.
    5. روی «Backup Now» کلیک کنید.

    فایل بکاپ مای‌اس‌کیو‌ال در واقع یه فایل متنیه که پر از دستورات SQL برای ساختن دوباره جدول‌ها و وارد کردن داده‌هاست.

    برای بازیابی بکاپ:

    1. وارد صفحه دیتابیسی بشید که میخواید بکاپ رو توش بازیابی کنید.
    2. روی دکمه «Execute SQL» کلیک کنید.
    3. به بخش «Select SQL commands file to execute on database» برید.
    4. فایل بکاپتون رو از روی سرور یا کامپیوتر خودتون انتخاب کنید.
    5. روی «Execute» کلیک کنید.

    مدیریت کاربران و دسترسی‌ها (Permissions)

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

    برای مدیریت کاربران، روی آیکون «User Permissions» در صفحه اصلی ماژول کلیک کنید. از اونجا میتونید کاربر جدید بسازید، پسوردها رو عوض کنید، و دسترسی‌ها رو برای هر کاربر به صورت دقیق مشخص کنید. مثلا برای یه اپلیکیشن، بهتره یه کاربر جدا بسازید که فقط به دیتابیس همون اپلیکیشن دسترسی داشته باشه و فقط بتونه کارهای لازم مثل خوندن و نوشتن رو انجام بده.

    بخش هفتم: مای‌اس‌کیو‌ال در دنیای ابری: آشنایی با HeatWave

    حالا که با نسخه سنتی مای‌اس‌کیو‌ال آشنا شدیم، بیاید یه نگاهی به آینده و نسخه‌های ابریش بندازیم. اوراکل یه سرویس ابری خیلی قدرتمند برای مای‌اس‌کیو‌ال به اسم HeatWave ارائه میده.

    HeatWave چیه؟

    HeatWave در واقع یه شتاب‌دهنده کوئری درون-حافظه‌ای (in-memory) برای دیتابیس مای‌اس‌کیو‌ال هست. این تنها سرویس دیتابیس ابری مای‌اس‌کیو‌اله که چنین شتاب‌دهنده‌ای رو ارائه میده و میتونه تراکنش‌ها (transactions) رو با تحلیل‌های همزمان (real-time analytics) ترکیب کنه.

    این یعنی چی؟ یعنی دیگه نیازی به فرآیندهای پیچیده، زمان‌بر و پرهزینه ETL (Extract, Transform, Load) برای انتقال داده‌ها به یه دیتابیس تحلیلی جداگونه نیست. شما میتونید روی همون داده‌های تراکنشی خودتون، به صورت همزمان تحلیل‌های سنگین انجام بدید. این کار باعث افزایش فوق‌العاده زیاد عملکرد مای‌اس‌کیو‌ال برای کارهای تحلیلی و ترکیبی میشه.

    ویژگی‌های پیشرفته HeatWave:

    • HeatWave AutoML: به توسعه‌دهنده‌ها و تحلیل‌گرای داده اجازه میده که مدل‌های یادگیری ماشین (Machine Learning) رو به صورت کاملا خودکار داخل HeatWave MySQL بسازن، آموزش بدن، پیاده‌سازی کنن و خروجی‌هاشون رو توضیح بدن.
    • HeatWave GenAI: کاربران میتونن از هوش مصنوعی مولد (Generative AI) یکپارچه و خودکار هم استفاده کنن.
    • HeatWave Autopilot: این ویژگی با استفاده از اتوماسیون مبتنی بر یادگیری ماشین، به صورت خودکار به بهبود عملکرد مای‌اس‌کیو‌ال و کاهش هزینه‌ها کمک میکنه، بدون اینکه به تخصص در زمینه تیونینگ دیتابیس نیاز باشه.

    این سرویس روی پلتفرم‌های ابری مختلفی مثل Oracle Cloud Infrastructure (OCI)، Amazon Web Services (AWS) و Microsoft Azure در دسترسه.

    بخش هشتم: وقتی همه چیز خراب میشه: راهنمای عیب‌یابی (Troubleshooting)

    هیچ سیستمی بی‌نقص نیست و گاهی وقتا مای‌اس‌کیو‌ال هم به مشکل میخوره. بیاید چند تا از مشکلات رایج و راه‌های حلشون رو بررسی کنیم.

    چطور بفهمیم سرور مای‌اس‌کیو‌ال کار میکنه یا نه؟

    گاهی وقتا یه برنامه نمیتونه به دیتابیس وصل بشه و خطای «Unable to connect to MySQL server» میده. اولین قدم اینه که ببینیم اصلا سرور مای‌اس‌کیو‌ال در حال اجرا هست یا نه. چند تا راه برای این کار توی ترمینال لینوکس وجود داره:

    • sudo service mysql status یا sudo service mysqld status
    • ps aux | grep mysql (این دستور همه پروسه‌هایی که کلمه mysql توشون هست رو نشون میده)
    • lsof -i :3306 (این دستور چک میکنه که آیا پروسه‌ای به پورت پیش‌فرض مای‌اس‌کیو‌ال یعنی ۳۳۰۶ گوش میده یا نه)

    یه نکته مهم: «پروسه در حال اجراست» همیشه به معنی «سرویس در دسترس است» نیست. ممکنه پروسه بالا باشه ولی به خاطر مشکلات پیکربندی یا چیزای دیگه، از بیرون نشه بهش وصل شد.

    اگه سرور در حال اجرا بود، مشکل میتونه از جای دیگه باشه. مثلا:

    • خطای احراز هویت: نام کاربری یا پسورد اشتباهه.
    • اسم اشتباه دیتابیس: اسم دیتابیسی که میخواید بهش وصل بشید رو اشتباه وارد کردید.
    • فایروال: ممکنه فایروال سرور یا کلاینت، اتصال به پورت ۳۳۰۶ رو مسدود کرده باشه.

    بهترین راه برای تست، اینه که سعی کنید از طریق خود ترمینال به صورت دستی به مای‌اس‌کیو‌ال وصل بشید:

    mysql -u <username> -p <database-name>

    یه مشکل رایج در XAMPP (روی مک)

    یه مشکل رایج که برای توسعه‌دهنده‌ها پیش میاد، مخصوصا اونایی که از پکیج‌هایی مثل XAMPP استفاده میکنن، اینه که مای‌اس‌کیو‌ال بعد از ری‌استارت کردن کامپیوتر دیگه روشن نمیشه. توی پنل مدیریت XAMPP چراغش قرمز میمونه و وقتی سعی میکنید وارد phpMyAdmin بشید، با خطای #2002 - No such file or directory مواجه میشید.

    این مشکل معمولا به این دلیله که یه پروسه قدیمی از مای‌اس‌کیو‌ال هنوز توی پس‌زمینه در حال اجراست و جلوی اجرا شدن پروسه جدید رو میگیره. راه حلش اینه که اون پروسه قدیمی رو به صورت دستی از بین ببرید (kill کنید).

    راه حل قدم به قدم در ترمینال مک:

    1. ترمینال رو باز کنید و دستور sudo su رو تایپ کنید و پسوردتون رو وارد کنید تا دسترسی روت بگیرید.
    2. دستور ps aux | grep mysql رو وارد کنید. این دستور لیستی از پروسه‌های مربوط به مای‌اس‌کیو‌ال رو به شما نشون میده.
    3. توی لیست، باید شناسه پروسه (process ID یا PID) رو پیدا کنید. این یه عدد هست که معمولا در ستون دوم قرار داره.
    4. حالا با دستور kill -9 {process id} اون پروسه رو از بین ببرید. مثلا: kill -9 739.
    5. حالا به پنل XAMPP برگردید و دوباره سعی کنید مای‌اس‌کیو‌ال رو استارت کنید. به احتمال زیاد مشکل حل میشه.

    پرسش و پاسخ‌های متداول

    سوال: مای‌اس‌کیو‌ال چیست و چرا استفاده میشود؟

    جواب: مای‌اس‌کیو‌ال محبوب‌ترین دیتابیس اوپن سورس دنیاست. توسعه‌دهنده‌ها و مدیران دیتابیس از اون برای ذخیره، آپدیت و تحلیل داده‌ها در اپلیکیشن‌هاشون استفاده میکنن.

    سوال: تفاوت بین SQL و مای‌اس‌کیو‌ال چیست؟

    جواب: SQL یه زبان برنامه‌نویسیه که برای مدیریت و تحلیل داده‌های ذخیره شده در دیتابیس‌ها طراحی شده. مای‌اس‌کیو‌ال یه سیستم مدیریت دیتابیسه که بخشی از اسمش رو از SQL گرفته و از زبان SQL برای مدیریت داده‌ها در دیتابیس‌ها استفاده میکنه.

    سوال: آیا نسخه ابری از مای‌اس‌کیو‌ال وجود دارد؟

    جواب: بله. HeatWave MySQL یه سرویس دیتابیس کاملا مدیریت شده است و تنها سرویس ابریه که بر اساس MySQL Enterprise Edition ساخته شده. این سرویس عملکرد کوئری‌های مای‌اس‌کیو‌ال رو به شدت بهبود میده و تحلیل‌های همزمان روی داده‌های تراکنشی رو ممکن میکنه. این سرویس روی OCI، AWS و Microsoft Azure در دسترسه.

    سوال: مای‌اس‌کیو‌ال در مقایسه با سایر دیتابیس‌ها چگونه است؟

    جواب: مای‌اس‌کیو‌ال یه دیتابیس رابطه‌ای اوپن سورسه. این یعنی داده‌ها رو در ردیف‌ها و ستون‌ها ذخیره میکنه و روابط بین اونها رو در اسکیماها تعریف میکنه. دیتابیس‌های رابطه‌ای محبوب دیگه‌ای هم وجود دارن که اوپن سورس نیستن، مثل Oracle Database. همچنین دیتابیس‌های محبوبی وجود دارن که اصلا رابطه‌ای نیستن. به این‌ها دیتابیس‌های NoSQL میگن، مثل MongoDB.

    منابع

    • [2] Ryzen build for MySQL database server – Hardware Hub / Build a PC – Level1Techs Forums
    • [4] MySQL Database Server | Webmin
    • [6] php – MySQL Database won’t start in XAMPP Manager-osx – Stack Overflow
    • [8] Is centralizing MySQL/mariadb databases on one server best-practice ? : r/sysadmin
    • [10] ssh – How to check if MySQL server is working or not? – Server Fault
    • [1] MySQL
    • [3] MySQL: Understanding What It Is and How It’s Used
    • [5] MySQL :: MySQL Downloads
    • [7] MySQL :: Download MySQL Installer
    • [9] sql – Why do we use servers with MySql? – Stack Overflow

  • همه چیز درباره دیتابیس اوراکل؛ Oracle Database

    اول از همه بیاید ببینیم این اوراکل اصلا چی هست. اوراکل یک سیستم مدیریت پایگاه داده چند مدلی و اختصاصی هست که توسط شرکتی به همین نام یعنی «شرکت اوراکل» ساخته شده و به فروش میرسه. «چند مدلی» یعنی میتونه انواع مختلف داده رو مدیریت کنه. معمولا ازش برای کارهای سنگینی مثل پردازش تراکنش‌های آنلاین (OLTP)، انبار داده (DW) و کارهای ترکیبی استفاده میشه. حالا اینا یعنی چی؟

    • پردازش تراکنش آنلاین (OLTP): فکر کنید به خرید و فروش‌های لحظه‌ای توی یه فروشگاه آنلاین یا تراکنش‌های بانکی. این‌ها کارهایی هستن که باید سریع و دقیق انجام بشن.
    • انبار داده (DW): تصور کنید یه شرکت میخواد تمام داده‌های فروش چند سال گذشته‌اش رو تحلیل کنه تا ببینه چه محصولاتی بیشتر فروش رفتن. این حجم عظیم از داده‌ها توی انبار داده نگهداری و تحلیل میشه.

    اوراکل رو میشه روی سرورهای خودتون، روی فضای ابری (Cloud) یا به صورت ترکیبی (Hybrid Cloud) نصب و استفاده کرد. زبونی هم که برای کار با این پایگاه داده استفاده میشه، زبون معروف SQL هست که باهاش میشه داده‌ها رو به‌روزرسانی یا بازیابی کرد.

    یه نگاه کوتاه به تاریخچه

    داستان اوراکل از سال ۱۹۷۷ شروع شد. لری الیسون به همراه دو تا از دوست‌ها و همکارای سابقش، باب ماینر و اد اوتس، یه شرکت مشاوره به اسم «آزمایشگاه‌های توسعه نرم‌افزار» یا همون SDL رو راه انداختن. این شرکت بعدا به شرکت اوراکل تبدیل شد. SDL اولین نسخه نرم‌افزار اوراکل رو توسعه داد. جالبه بدونید که اسم «اوراکل» از اسم رمز یه پروژه میاد که CIA بودجه‌اش رو تامین میکرد و الیسون قبلا توی شرکت Ampex روی اون کار کرده بود. حتی اولین مشتری اوراکل هم خود CIA بود و بهشون اجازه داد از این اسم رمز برای محصول جدیدشون استفاده کنن.

    یه نکته جالب اینه که الیسون میخواست پایگاه داده‌اش با System R شرکت IBM سازگار باشه، اما IBM کدهای خطای نرم‌افزارش رو منتشر نکرد. با این حال، تا سال ۱۹۸۵ اوراکل تبلیغ میکرد که برنامه‌هایی که برای SQL/DS یا DB2 نوشته شدن، بدون هیچ تغییری روی اوراکل هم اجرا میشن.

    هیچوقت نسخه‌ای به اسم Oracle v1 وجود نداشت. دلیلش هم این بود که الیسون معتقد بود «هیچکس دلش نمیخواد نسخه ۱ یه محصول رو بخره».

    بخش دوم: معماری اوراکل؛ چطور کار میکنه؟

    خب، حالا که فهمیدیم اوراکل چیه، بیاید بریم سراغ بخش جذاب ماجرا: معماری و ساختارش. یه سرور پایگاه داده مثل اوراکل، کلید حل مشکلات مدیریت اطلاعاته. یه سرور خوب باید بتونه حجم زیادی از داده رو توی یه محیط چندکاربره مدیریت کنه؛ یعنی چندین نفر بتونن همزمان به یک داده دسترسی داشته باشن، اون هم با عملکرد بالا. تازه باید جلوی دسترسی‌های غیرمجاز رو بگیره و راه‌حل‌های خوبی هم برای بازیابی اطلاعات بعد از خرابی داشته باشه.

    اوراکل برای این کارها یه سری ویژگی‌ها داره. مثلا میتونه پایگاه داده‌های خیلی بزرگ (حتی در حد ترابایت) رو مدیریت کنه و کنترل کاملی روی مصرف فضا به ما بده. میتونه تعداد زیادی کاربر همزمان رو پشتیبانی کنه و عملکرد بالایی در پردازش تراکنش‌ها داشته باشه. حتی توی بعضی جاها، اوراکل ۲۴ ساعته و بدون وقفه کار میکنه.

    دو بخش اصلی: پایگاه داده و نمونه (Instance)

    1. پایگاه داده: مجموعه‌ای از داده‌هاست که به عنوان یک واحد در نظر گرفته میشن. هدفش هم ذخیره و بازیابی اطلاعات مرتبطه. پایگاه داده یه ساختار فیزیکی و یه ساختار منطقی داره.
    2. نمونه (Instance): هر بار که یه پایگاه داده استارت میخوره، یه قسمتی از حافظه به اسم System Global Area (SGA) بهش اختصاص داده میشه و یه سری فرایندهای پس‌زمینه (Background Processes) هم شروع به کار میکنن. به ترکیب این فرایندها و حافظه میگیم یه «نمونه اوراکل».

    این دو تا از هم جدا هستن. این جدایی به ما اجازه میده که نحوه ذخیره‌سازی فیزیکی داده‌ها رو بدون اینکه روی دسترسی به ساختارهای منطقی تاثیری بذاره، مدیریت کنیم.

    بخش سوم: ساختار فیزیکی؛ فایل‌های واقعی روی دیسک

    ساختار فیزیکی یه پایگاه داده اوراکل از فایل‌هایی تشکیل شده که روی سیستم‌عامل شما قرار دارن. این فایل‌ها محل ذخیره‌سازی واقعی اطلاعات پایگاه داده هستن. سه نوع فایل اصلی داریم:

    1. فایل‌های داده (Datafiles): هر پایگاه داده اوراکل حداقل یه فایل داده داره. تمام داده‌های پایگاه داده، مثل داده‌های جدول‌ها و ایندکس‌ها، به صورت فیزیکی توی این فایل‌ها ذخیره میشن. ویژگی‌های این فایل‌ها اینه که میتونن به یه پایگاه داده تعلق داشته باشن، اندازه‌شون میتونه به صورت خودکار زیاد بشه و میشه اونها رو به صورت آنلاین (در دسترس) یا آفلاین (غیرقابل دسترس) قرار داد. وقتی یه کاربر اطلاعاتی رو میخواد، اگه اون اطلاعات توی حافظه موقت (Cache) نباشه، از روی این فایل‌ها خونده و در حافظه ذخیره میشه. برای بالا بردن عملکرد، داده‌های جدید یا تغییر کرده فورا روی دیسک نوشته نمیشن، بلکه توی حافظه جمع میشن و بعدا به صورت یکجا توسط یه فرایند پس‌زمینه به اسم DBWn روی فایل‌ها نوشته میشن.
    2. فایل‌های لاگ دوباره‌کاری (Redo Log Files): هر پایگاه داده اوراکل حداقل دو تا از این فایل‌ها داره. به مجموعه این فایل‌ها میگیم Redo Log. کار اصلی Redo Log اینه که تمام تغییراتی که روی داده‌ها اعمال میشه رو ثبت کنه. اگه یه مشکلی پیش بیاد (مثلا برق بره) و داده‌های تغییر کرده روی فایل‌های داده نوشته نشن، میشه از روی این فایل‌ها تغییرات رو بازیابی کرد تا هیچ کاری از دست نره. این فایل‌ها برای محافظت از پایگاه داده در برابر خرابی خیلی حیاتی هستن. اوراکل حتی اجازه میده چند نسخه از این فایل‌ها رو روی دیسک‌های مختلف داشته باشید تا اگه یکی خراب شد، بقیه سالم بمونن. به فرایند اعمال اطلاعات این فایل‌ها در زمان بازیابی میگن Rolling Forward.
    3. فایل‌های کنترل (Control Files): هر پایگاه داده اوراکل یه فایل کنترل داره. این فایل اطلاعات مربوط به ساختار فیزیکی پایگاه داده رو نگه میداره. مثلا:

      هر بار که یه نمونه از پایگاه داده استارت میخوره، از این فایل برای شناسایی فایل‌های داده و Redo Log استفاده میشه. اگه ساختار فیزیکی پایگاه داده تغییر کنه (مثلا یه فایل داده جدید اضافه بشه)، این فایل به صورت خودکار توسط اوراکل آپدیت میشه. این فایل در زمان بازیابی پایگاه داده هم خیلی مهمه.

      • اسم پایگاه داده
      • اسم و مکان فایل‌های داده و فایل‌های Redo Log
      • اطلاعات مربوط به زمان ایجاد پایگاه داده

    بخش چهارم: ساختار منطقی؛ سازماندهی داده‌ها به شکل مجازی

    حالا بریم سراغ ساختار منطقی. این ساختار به ما میگه که فضای فیزیکی پایگاه داده چطور استفاده میشه.

    1. فضای جدولی (Tablespaces): یه پایگاه داده به واحدهای ذخیره‌سازی منطقی به اسم Tablespace تقسیم میشه. این فضاها ساختارهای منطقی مرتبط رو با هم گروه‌بندی میکنن. مثلا میشه تمام آبجکت‌های یه اپلیکیشن رو توی یه Tablespace جدا گذاشت تا مدیریت‌شون راحت‌تر بشه. هر پایگاه داده حداقل یه Tablespace به اسم SYSTEM داره. یه Tablespace میتونه آنلاین (در دسترس) یا آفلاین (غیرقابل دسترس) باشه.
    2. اسکیما (Schema): اسکیما مجموعه‌ای از آبجکت‌های پایگاه داده هست. آبجکت‌های اسکیما مستقیما به داده‌های پایگاه داده اشاره دارن. این آبجکت‌ها شامل چیزهایی مثل جدول‌ها، ویوها، سکانس‌ها، رویه‌های ذخیره شده، مترادف‌ها، ایندکس‌ها، کلاسترها و لینک‌های پایگاه داده هستن. هیچ رابطه‌ای بین Tablespace و Schema وجود نداره؛ یعنی آبجکت‌های یه اسکیما میتونن توی Tablespaceهای مختلف باشن و یه Tablespace هم میتونه آبجکت‌هایی از اسکیماهای مختلف رو نگه داره.
    3. بلوک‌های داده، اکستنت‌ها و سگمنت‌ها (Data Blocks, Extents, and Segments): اوراکل برای کنترل دقیق مصرف فضای دیسک از این سه ساختار منطقی استفاده میکنه.

      وقتی اکستنت‌های یه سگمنت پر میشن، اوراکل به صورت پویا فضای جدیدی رو تخصیص میده. برای همین ممکنه اکستنت‌های یه سگمنت روی دیسک پشت سر هم نباشن.

      • بلوک داده (Data Block): کوچک‌ترین واحد ذخیره‌سازی داده در اوراکل هست. هر بلوک داده معادل تعداد مشخصی بایت از فضای فیزیکی دیسک هست. اندازه این بلوک‌ها موقع ساختن پایگاه داده مشخص میشه.
      • اکستنت (Extent): سطح بعدی، اکستنت هست. اکستنت تعداد مشخصی بلوک داده پشت سر هم هست که در یک تخصیص واحد برای ذخیره نوع خاصی از اطلاعات به دست میاد.
      • سگمنت (Segment): سطح بالاتر از اکستنت، سگمنت هست. سگمنت مجموعه‌ای از اکستنت‌هاست که برای یه ساختار منطقی خاص تخصیص داده شده. انواع مختلف سگمنت داریم:
        • سگمنت داده (Data Segment): هر جدول غیرکلاستری یه سگمنت داده داره که تمام داده‌هاش اونجا ذخیره میشه.
        • سگمنت ایندکس (Index Segment): هر ایندکس یه سگمنت ایندکس داره که داده‌هاش رو ذخیره میکنه.
        • سگمنت بازگشتی (Rollback Segment): برای ذخیره موقت اطلاعات «undo» یا بازگشتی استفاده میشه. این اطلاعات برای بازیابی تراکنش‌های ناتمام یا ایجاد نماهای سازگار با خواندن (Read-Consistent Views) به کار میره.
        • سگمنت موقت (Temporary Segment): وقتی یه دستور SQL برای اجرا به یه فضای کاری موقت نیاز داره، اوراکل این سگمنت‌ها رو ایجاد میکنه. بعد از اتمام دستور، این فضا آزاد میشه.

    بخش پنجم: آبجکت‌های اسکیما؛ ابزارهای ما برای کار با داده

    حالا بیاید با ابزارهایی که توی یه اسکیما داریم بیشتر آشنا بشیم. این‌ها همون چیزهایی هستن که یه برنامه‌نویس یا مدیر پایگاه داده مستقیما باهاشون سر و کار داره.

    • جدول (Table): واحد اصلی ذخیره‌سازی داده توی پایگاه داده اوراکل هست. داده‌ها توی سطرها و ستون‌ها ذخیره میشن. هر جدول یه اسم و مجموعه‌ای از ستون‌ها داره. هر ستون هم اسم، نوع داده (مثلا CHAR, DATE, NUMBER) و عرض مشخصی داره.
    • ویو (View): یه ویو مثل یه نمایش سفارشی از داده‌های یک یا چند جدول هست. میشه بهش به عنوان یه «کوئری ذخیره شده» هم نگاه کرد. ویوها خودشون داده‌ای رو ذخیره نمیکنن، بلکه داده‌ها رو از جدول‌های پایه‌ای که روی اون‌ها ساخته شدن، میگیرن. از ویوها معمولا برای ساده‌سازی دسترسی به داده، ایجاد امنیت (مثلا فقط ستون‌های خاصی رو نشون بدیم) یا نمایش داده از چند جدول به صورت یکجا استفاده میشه.
    • ویوی محقق شده (Materialized View): این نوع ویو، برخلاف ویوهای عادی، نتایج یه کوئری رو توی یه آبجکت جدا ذخیره میکنه. یعنی واقعا فضا اشغال میکنه و داده داره. این کار باعث میشه عملکرد کوئری‌ها، مخصوصا توی محیط‌های انبار داده، خیلی بهتر بشه. اسم دیگه‌اش «اسنپ‌شات» (Snapshot) هست.
    • سکانس (Sequence): یه لیست سریالی از اعداد منحصر به فرد تولید میکنه. معمولا برای ستون‌هایی مثل شماره کارمندی یا کد محصول استفاده میشه تا مطمئن باشیم هیچ دو سطری شماره یکسان ندارن. کار برنامه‌نویسی رو خیلی راحت میکنه چون دیگه لازم نیست خودمون نگران تولید اعداد منحصر به فرد باشیم.
    • ایندکس (Index): یه ساختار اختیاریه که برای بالا بردن سرعت بازیابی داده‌ها ساخته میشه. دقیقا مثل فهرست آخر یه کتاب که به شما کمک میکنه یه مطلب رو سریع‌تر پیدا کنید، ایندکس هم به اوراکل کمک میکنه سطر مورد نظر رو سریع‌تر پیدا کنه. ایندکس‌ها روی یک یا چند ستون از یه جدول ساخته میشن و بعد از ساخته شدن، به صورت خودکار توسط اوراکل نگهداری و استفاده میشن.
    • کلاستر و هش کلاستر (Cluster and Hash Cluster): اینها هم ساختارهای اختیاری برای ذخیره‌سازی داده‌های جدول هستن. کلاسترها گروهی از جدول‌ها هستن که چون ستون‌های مشترکی دارن و معمولا با هم استفاده میشن، به صورت فیزیکی کنار هم ذخیره میشن. این کار زمان دسترسی به دیسک رو کم میکنه.
    • مترادف (Synonym): یه اسم مستعار برای یه جدول، ویو، سکانس یا واحد برنامه هست. از مترادف‌ها برای ساده کردن دسترسی به آبجکت‌ها یا مخفی کردن اسم و مالک واقعی اون‌ها استفاده میشه.
    • لینک پایگاه داده (Database Link): یه آبجکت نام‌گذاری شده هست که یه «مسیر» از یه پایگاه داده به پایگاه داده دیگه رو توصیف میکنه. این لینک‌ها توی پایگاه داده‌های توزیع شده برای دسترسی به داده‌های روی سرورهای دیگه استفاده میشن.
    • واحدهای برنامه (Program Units): این‌ها شامل رویه‌ها (Procedures)، توابع (Functions) و پکیج‌ها (Packages) میشن. این واحدها مجموعه‌ای از دستورات SQL و PL/SQL هستن که به عنوان یه واحد قابل اجرا برای انجام یه کار خاص گروه‌بندی میشن.
      • PL/SQL: این زبان رویه‌ای اوراکل، یه افزونه برای SQL هست. به شما اجازه میده منطق برنامه‌نویسی مثل IF...THEN یا حلقه‌ها رو به دستورات SQL اضافه کنید. استفاده از PL/SQL ذخیره شده توی پایگاه داده باعث میشه ترافیک شبکه کم بشه و امنیت و عملکرد برنامه بالا بره.

    بخش ششم: مغز متفکر اوراکل؛ حافظه و فرایندها

    اوراکل برای مدیریت و دسترسی به پایگاه داده از ساختارهای حافظه و فرایندها استفاده میکنه. همه این ساختارها توی حافظه اصلی (RAM) کامپیوترهایی که سیستم پایگاه داده رو تشکیل میدن، وجود دارن.

    ساختارهای حافظه

    1. System Global Area (SGA): این یه ناحیه حافظه مشترکه که داده‌ها و اطلاعات کنترلی یه نمونه اوراکل رو نگه میداره. وقتی یه نمونه استارت میخوره، SGA تخصیص داده میشه و وقتی خاموش میشه، آزاد میشه. کاربرانی که به سرور وصل هستن، داده‌های توی SGA رو به اشتراک میذارن. برای عملکرد بهتر، SGA باید تا جای ممکن بزرگ باشه (البته به شرطی که توی حافظه واقعی جا بشه). SGA خودش چند تا بخش داره:
      • Database Buffer Cache: جدیدترین بلوک‌های داده‌ای که استفاده شدن اینجا ذخیره میشن. چون داده‌های پراستفاده توی حافظه نگه داشته میشن، نیاز به خوندن و نوشتن از روی دیسک (I/O) کم میشه و عملکرد بالا میره.
      • Redo Log Buffer: ورودی‌های Redo Log (لیست تغییرات) قبل از اینکه روی فایل‌های Redo Log نوشته بشن، اینجا ذخیره میشن.
      • Shared Pool: این بخش شامل ساختارهای حافظه مشترک مثل نواحی SQL مشترک هست. هر دستور SQL منحصر به فردی که به پایگاه داده فرستاده میشه، باید پردازش بشه. اطلاعات پردازش اون، مثل درخت تجزیه و نقشه اجرا، توی یه ناحیه SQL مشترک ذخیره میشه. اگه چند اپلیکیشن همون دستور رو اجرا کنن، از همین ناحیه مشترک استفاده میکنن و اینطوری در مصرف حافظه صرفه‌جویی میشه.
      • Large Pool: یه ناحیه اختیاری در SGA هست که برای کارهای سنگینی مثل بکاپ و بازیابی، فرایندهای I/O سرور و حافظه نشست‌ها در پیکربندی سرور چند رشته‌ای استفاده میشه.
    2. Program Global Area (PGA): این یه بافر حافظه هست که داده‌ها و اطلاعات کنترلی یه فرایند سرور رو نگه میداره. هر فرایند سرور PGA مخصوص به خودش رو داره و این حافظه مشترک نیست.

    فرایندها (Processes)

    یه فرایند مثل یه «رشته کنترلی» توی سیستم‌عامل هست که میتونه یه سری مراحل رو اجرا کنه. اوراکل دو نوع کلی فرایند داره:

    1. فرایندهای کاربر (User Processes): این فرایندها کد یه برنامه کاربردی (مثلا یه برنامه نوشته شده با Pro*C/C++) یا یه ابزار اوراکل (مثل Oracle Enterprise Manager) رو اجرا میکنن. فرایند کاربر با فرایندهای سرور ارتباط برقرار میکنه.
    2. فرایندهای اوراکل (Oracle Processes): اینها خودشون دو دسته‌ان:
      • فرایندهای سرور (Server Processes): اوراکل این فرایندها رو برای رسیدگی به درخواست‌های فرایندهای کاربر متصل ایجاد میکنه. فرایند سرور با فرایند کاربر ارتباط برقرار میکنه و با اوراکل تعامل میکنه تا درخواست‌ها رو انجام بده. مثلا اگه یه کاربر داده‌ای رو بخواد که توی بافرهای پایگاه داده نیست، فرایند سرور مرتبط، بلوک‌های داده مناسب رو از فایل‌های داده میخونه و توی SGA میذاره.
      • فرایندهای پس‌زمینه (Background Processes): اوراکل برای هر نمونه یه سری فرایند پس‌زمینه ایجاد میکنه. این فرایندها به صورت ناهمزمان I/O انجام میدن و بر سایر فرایندهای اوراکل نظارت میکنن تا موازی‌سازی رو افزایش بدن و عملکرد و قابلیت اطمینان رو بهتر کنن. بعضی از این فرایندهای مهم اینها هستن:
        • DBWn (Database Writer): بلوک‌های تغییر کرده رو از Database Buffer Cache روی فایل‌های داده مینویسه. این کار رو معمولا زمانی انجام میده که حافظه بافر آزاد کم باشه.
        • LGWR (Log Writer): ورودی‌های Redo Log رو روی دیسک مینویسه.
        • CKPT (Checkpoint): در زمان‌های مشخص، به DBWn سیگنال میده که تمام بافرهای تغییر کرده رو روی دیسک بنویسه. به این رویداد میگن «چک‌پوینت».
        • SMON (System Monitor): وقتی یه نمونه که خراب شده دوباره استارت میخوره، بازیابی رو انجام میده. همچنین سگمنت‌های موقت بی‌استفاده رو پاک میکنه.
        • PMON (Process Monitor): وقتی یه فرایند کاربر با شکست مواجه میشه، بازیابی فرایند رو انجام میده. یعنی حافظه کش رو پاک میکنه و منابعی که اون فرایند استفاده میکرده رو آزاد میکنه.
        • ARCn (Archiver): فایل‌های Redo Log آنلاین رو وقتی پر میشن، در محل ذخیره‌سازی آرشیو کپی میکنه. این فرایند فقط وقتی فعاله که پایگاه داده در حالت ARCHIVELOG باشه.
        • RECO (Recoverer): تراکنش‌های توزیع شده‌ای که به خاطر مشکلات شبکه یا سیستم بلاتکلیف موندن رو حل میکنه.

    بخش هفتم: تراکنش‌ها و یکپارچگی داده؛ چطور اوراکل نظم رو حفظ میکنه؟

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

    اوراکل این مشکلات رو با استفاده از قفل‌ها (Locks) و یه مدل سازگاری چند نسخه‌ای (Multiversion Consistency Model) حل میکنه. اساس این ویژگی‌ها مفهوم تراکنش (Transaction) هست.

    تراکنش (Transaction) چیه؟

    یه تراکنش یه واحد منطقی از کاره که شامل یک یا چند دستور SQL میشه که توسط یه کاربر اجرا میشن. یه تراکنش با اولین دستور SQL قابل اجرای کاربر شروع میشه و وقتی به صراحت Commit (ثبت نهایی) یا Rollback (لغو و بازگشت به حالت قبل) بشه، تموم میشه.

    مثال بانکی:

    فرض کنید یه مشتری میخواد از حساب پس‌اندازش به حساب جاریش پول منتقل کنه. این تراکنش میتونه شامل سه تا عملیات جدا باشه:

    1. کاهش موجودی حساب پس‌انداز.
    2. افزایش موجودی حساب جاری.
    3. ثبت این تراکنش در دفتر روزنامه تراکنش‌ها.

    اوراکل باید تضمین کنه که هر سه تا دستور انجام میشن تا حساب‌ها در تعادل باقی بمونن. اگه یه مشکلی (مثلا خرابی سخت‌افزاری) جلوی اجرای یکی از این دستورها رو بگیره، بقیه دستورهای این تراکنش هم باید لغو بشن. به این کار میگن Rollback.

    • Commit: تغییرات ناشی از تمام دستورات SQL توی یه تراکنش رو دائمی میکنه.
    • Rollback: هر تغییری که در نتیجه دستورات SQL در تراکنش ایجاد شده رو لغو میکنه.
    • Savepoint: برای تراکنش‌های طولانی، میشه نشانگرهای میانی به اسم Savepoint تعریف کرد. اینطوری میشه یه تراکنش رو به بخش‌های کوچیک‌تر تقسیم کرد و در صورت نیاز، فقط تا یه Savepoint مشخص کار رو به عقب برگردوند.

    سازگاری خواندن (Read Consistency)

    اوراکل تضمین میکنه که داده‌ای که یه کاربر میبینه، با یه نقطه زمانی خاص سازگاره و توسط کاربرای دیگه‌ای که همزمان دارن داده‌ها رو تغییر میدن، تحت تاثیر قرار نمیگیره. ساده‌ترین راه برای درک این موضوع اینه که تصور کنید هر کاربر داره روی یه کپی شخصی از پایگاه داده کار میکنه.

    وقتی یه آپدیت اتفاق میفته، مقادیر اصلی داده که تغییر کردن، توی سگمنت‌های بازگشتی (Rollback Segments) پایگاه داده ثبت میشن. تا وقتی این آپدیت به عنوان بخشی از یه تراکنش Commit نشده باقی بمونه، هر کاربری که بعدا اون داده‌های تغییر کرده رو کوئری بگیره، مقادیر اصلی رو میبینه. اوراکل از اطلاعات توی SGA و سگمنت‌های بازگشتی استفاده میکنه تا یه نمای سازگار با خواندن از داده‌های یه جدول برای یه کوئری بسازه.

    قفل‌ها (Locks)

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

    دو نوع اصلی قفل وجود داره: قفل انحصاری (Exclusive Lock) و قفل اشتراکی (Share Lock). روی یه منبع (مثل یه سطر یا جدول) فقط یه قفل انحصاری میشه گذاشت، اما میشه چندین قفل اشتراکی روی همون منبع داشت.

    بخش هشتم: امنیت در اوراکل

    سیستم‌های پایگاه داده چندکاربره مثل اوراکل، ویژگی‌های امنیتی دارن که نحوه دسترسی و استفاده از پایگاه داده رو کنترل میکنن. امنیت پایگاه داده رو میشه به دو دسته تقسیم کرد:

    1. امنیت سیستم (System Security): مکانیزم‌هایی که دسترسی و استفاده از پایگاه داده رو در سطح سیستم کنترل میکنن. مثل:
      • نام کاربری و رمز عبور معتبر برای اتصال به پایگاه داده.
      • تخصیص فضای دیسک برای کاربران.
      • محدودیت منابع سیستم برای کاربران.
      • ممیزی (Auditing) اقدامات کاربران.
    2. امنیت داده (Data Security): مکانیزم‌هایی که دسترسی و استفاده از پایگاه داده رو در سطح آبجکت‌های اسکیما کنترل میکنن. مثل:
      • اینکه چه کاربرانی به چه آبجکت‌هایی دسترسی دارن.
      • چه عملیاتی روی اون آبجکت‌ها میتونن انجام بدن.

    اوراکل امنیت رو با استفاده از چند ابزار مختلف مدیریت میکنه:

    • کاربران (Users): هر پایگاه داده اوراکل یه لیست از نام‌های کاربری داره. برای دسترسی به پایگاه داده، کاربر باید با یه نام کاربری و رمز عبور معتبر وصل بشه.
    • امتیازات (Privileges): امتیاز یعنی حق اجرای یه نوع خاص از دستور SQL. دو نوع امتیاز داریم:
      • امتیازات سیستم (System Privileges): به کاربر اجازه میده یه کار خاص در سطح کل سیستم انجام بده. مثلا امتیاز ساختن یه Tablespace.
      • امتیازات آبجکت (Schema Object Privileges): به کاربر اجازه میده یه کار خاص روی یه آبجکت مشخص انجام بده. مثلا امتیاز حذف کردن سطرها از یه جدول خاص.
    • نقش‌ها (Roles): نقش‌ها گروه‌های نام‌گذاری شده از امتیازات مرتبط هستن که به کاربران یا نقش‌های دیگه داده میشن. مدیریت امتیازات از طریق نقش‌ها خیلی راحت‌تره. مثلا میشه یه نقش برای یه اپلیکیشن ساخت و تمام امتیازات لازم برای اجرای اون اپلیکیشن رو به اون نقش داد. بعد اون نقش رو به کاربرانی که باید از اپلیکیشن استفاده کنن، تخصیص داد.

    بخش نهم: نسخه‌های مختلف اوراکل

    اوراکل در طول سال‌ها نسخه‌های مختلفی رو منتشر کرده. نام‌گذاری نسخه‌ها هم یه قرارداد خاصی داره. مثلا پسوندهای «c»، «g» و «i» به ترتیب به معنی «Cloud»، «Grid» و «Internet» بودن. در نسخه فعلی یعنی Oracle Database 23ai، پسوند «ai» به معنی «هوش مصنوعی» (Artificial Intelligence) هست. در ادامه یه جدول از نسخه‌های مهم اوراکل و ویژگی‌های کلیدی‌شون رو میبینید:

    نسخه پایگاه داده اوراکلتاریخ انتشار اولیهویژگی‌های برجسته
    Oracle v21979اولین پایگاه داده رابطه‌ای SQL تجاری موجود.
    Oracle v61988قفل‌گذاری در سطح سطر، بکاپ و بازیابی آنلاین.
    Oracle7ژوئن 1992رویه‌های ذخیره شده PL/SQL، تریگرها.
    Oracle8i Database1998پروتکل‌های اینترنتی بومی و جاوا.
    Oracle9i Database2001Oracle Real Application Clusters (RAC)، Oracle XML DB.
    Oracle Database 10g2003مدیریت خودکار پایگاه داده، زیرساخت Grid، Oracle ASM.
    Oracle Database 11gسپتامبر 2007Active Data Guard، Secure Files، Exadata.
    Oracle Database 12cژوئیه 2013معماری چندمستاجری (Multitenant)، In-Memory Column Store، JSON بومی.
    Oracle Database 18cفوریه 2018یکپارچه‌سازی با Active Directory، توابع جدول چندریختی.
    Oracle Database 19c (LTR)فوریه 2019ایجاد خودکار ایندکس، نگهداری آمار به صورت Real-Time.
    Oracle Database 21c (IR)دسامبر 2020جداول بلاک‌چین، اجرای جاوا اسکریپت در پایگاه داده.
    Oracle Database 23ai (LTR)۲ می ۲۰۲۴جستجوی برداری هوش مصنوعی (AI Vector Search)، دوگانگی رابطه‌ای JSON، پشتیبانی از میکروسرویس‌های تراکنشی.

    (LTR مخفف Long Term Release و IR مخفف Innovation Release هست)

    بخش دهم: پرسش و پاسخ از دنیای واقعی

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

    سوال ۱: من یه مدیر پایگاه داده SQL Server هستم. یاد گرفتن اوراکل چقدر سخته؟

    این سوالی هست که خیلی‌ها میپرسن. بر اساس تجربه کاربری که در این زمینه سوال پرسیده، اونها با دو سال سابقه کار با SQL Server، از اوراکل به خاطر نیازمندی‌های بالای مدیرانش و حقوق بهترشون کمی واهمه داشتن. اما واقعیت اینه که گذار از یه پایگاه داده به پایگاه داده دیگه شدنیه، مخصوصا اگه پس‌زمینه لینوکسی قوی‌تری داشته باشید، چون اوراکل خیلی جاها روی لینوکس اجرا میشه. خیلی از شرکت‌های بزرگ مثل شرکت‌های دفاعی، دولتی، پزشکی و بانکی از اوراکل استفاده میکنن. ممکنه دلیلش این باشه که اپلیکیشن‌های قدیمی‌شون روی اوراکل بوده و به یه استاندارد تبدیل شده. اگه به یادگیری علاقه دارید، شجاع باشید و شاخه کاریتون رو گسترش بدید.

    سوال ۲: چطور میتونم اسم سروری که پایگاه داده اوراکل روش میزبانی میشه رو پیدا کنم؟

    این یه سوال فنی رایجه. چند تا راه برای این کار وجود داره. یه راه ساده استفاده از این کوئری هست:

    select sys_context('USERENV','SERVER_HOST') from dual

    این دستور نیاز به هیچ امتیاز خاصی نداره و برای همین استفاده ازش توی رویه‌های ذخیره شده راحته. البته این پارامتر یعنی SERVER_HOST فقط از نسخه 10G به بعد در دسترسه. با استفاده از sys_context میشه اطلاعات مفید دیگه‌ای هم به دست آورد:

    select
      sys_context ( 'USERENV', 'DB_NAME' ) db_name,
      sys_context ( 'USERENV', 'SESSION_USER' ) user_name,
      sys_context ( 'USERENV', 'SERVER_HOST' ) db_host,
      sys_context ( 'USERENV', 'HOST' ) user_host
    from dual

    این کوئری اسم پایگاه داده، اسم کاربر نشست، هاست پایگاه داده و هاست کاربر رو برمیگردونه.

    سوال ۳: نمیتونم سرور رو متوقف کنم و پیام «Cannot stop/start server – Oracle database server is in existing mode» رو میگیرم. مشکل چیه؟

    یه کاربری با نسخه 9.0.00 با این مشکل مواجه شده بود. وقتی از دستورات stop_all و start_all استفاده میکرد، این پیام رو دریافت میکرد. به نظر میرسید که با وجود این پیام، تمام فرایندهای EM واقعا متوقف میشدن. برای start_all هم این پیام اول نشون داده میشد ولی بعد از چند ثانیه رمز DBO رو میپرسید و فرایندها رو شروع میکرد. این کاربر اشاره کرده بود که پایگاه داده‌اش روی یه سرور اختصاصی نیست و با پایگاه داده‌های دیگه به اشتراک گذاشته شده. این پیام از اسکریپت‌های CM میاد و مدیران پایگاه داده (DBA) نتونسته بودن توضیحش بدن. اینجور مشکلات معمولا به پیکربندی خاص اون محیط برمیگرده.

    سوال ۴: آیا جاوا حتما باید روی سرورهای پایگاه داده اوراکل نصب باشه؟

    یه کاربری که سرورهاش فقط میزبان پایگاه داده اوراکل (نسخه 11g) بودن، این سوال رو پرسیده بود. نصب اوراکل به همراه جاوا انجام شده بود (مثلا در مسیر \OraHome_1\product\11.2.0\dbhome_1\jdk). تیم عملیات شبکه بهش گفته بود که باید تمام نسخه‌های جاوا رو نگهداری و آپدیت کنه. اون کاربر ترجیح میداد اگه جاوا ضروری نیست، اون رو حذف کنه تا از زحمت نگهداریش خلاص بشه. واقعیت اینه که خیلی از ویژگی‌های داخلی اوراکل به جاوا وابسته هستن. بنابراین، جاوا به عنوان بخشی از نصب پایگاه داده اوراکل مورد نیازه و حذف کردنش میتونه مشکلات جدی ایجاد کنه.

    سوال ۵: بکاپ پایگاه داده روی سرور فیزیکی اوراکل در لینوکس چطور کار میکنه؟

    یه کاربر که با نرم‌افزار Veeam کار میکرد، میخواست بدونه بکاپ‌گیری از اوراکل روی سرورهای فیزیکی لینوکس چطوریه، چون Veeam بیشتر برای ماشین‌های مجازی بهینه شده. نرم‌افزارهایی مثل Veeam Agent for Linux (VAL) میتونن از سرورهای فیزیکی لینوکس بکاپ بگیرن. این بکاپ‌ها کل ماشین رو شامل میشن و به صورت فایل‌سیستمی سازگار هستن. در نسخه‌های جدیدتر این ابزارها، ویژگی‌هایی برای اطمینان از سازگاری تراکنشی (Transaction Consistency) پایگاه داده اوراکل هم اضافه شده. این یعنی قبل از بکاپ، پایگاه داده در حالتی قرار میگیره که بکاپ گرفته شده سالم و قابل بازیابی باشه.

    منابع

    • [2] Oracle Database – Wikipedia
    • [4] Java on Oracle Database Server? – Oracle Forums
    • [6] SQL Server DBA – How Hard is Oracle Database? : r/Database
    • [8] How database backup works on physical Oracle Database server in Linux
    • [10] Find the server name for an Oracle database – Stack Overflow
    • [1] Database | Oracle
    • [3] Introduction to the Oracle Server
    • [5] Database Software Downloads | Oracle
    • [7] Introduction to the Oracle Server
    • [9] Cannot stop server – Oracle database server is in existing mode – Discussion – BMC Community
  • مانگو دی‌بی (MongoDB) چیست؟ راهنمای کامل سرور دیتابیس

    برای اینکه بفهمیم مانگو دی‌بی چیه، اول باید ببینیم قبل از اون دنیا چه شکلی بود. سال‌ها، پادشاه بی‌چون‌وچرای دنیای دیتابیس‌ها، سیستم‌های مدیریت دیتابیس رابطه‌ای یا همون RDBMS بودن. اسم‌هایی مثل MySQL رو حتما شنیدید. این دیتابیس‌ها مثل یک جدول اکسل خیلی بزرگ و منظم عمل می‌کنن. همه چیز در قالب جدول‌ها، سطرها و ستون‌های از پیش تعریف شده ذخیره میشه. مثلا اگه یه دیتابیس برای دانشجوها داشته باشید، یه جدول دارید به اسم «دانشجو» با ستون‌های مشخص: شماره دانشجویی، نام، نام خانوادگی و… . این ساختار خیلی منظم و دقیقه و برای خیلی از کارها، مثل سیستم‌های مالی و حسابداری که داده‌ها ساختار کاملا مشخصی دارن، عالیه.

    اما دنیای مدرن یه چالش جدید ایجاد کرد. با اومدن اپلیکیشن‌های موبایل، شبکه‌های اجتماعی و اینترنت اشیا (IoT)، ما با حجم عظیمی از داده‌هایی روبرو شدیم که همیشه ساختار مشخص و منظمی نداشتن. به این نوع داده‌ها میگن داده‌های بدون ساختار یا نیمه‌ساختاریافته. مثلا پست‌های یک شبکه اجتماعی رو در نظر بگیرید. یه پست میتونه فقط متن باشه، یکی دیگه عکس و متن داشته باشه، یکی ویدیو و کپشن، و یکی دیگه ترکیبی از همه اینها با کلی تگ و کامنت. جا دادن این همه تنوع توی جدول‌های خشک و بی‌روح SQL خیلی سخت و گاهی غیرممکن بود. توسعه‌دهنده‌ها به ابزاری نیاز داشتن که انعطاف‌پذیر باشه و بتونه با این داده‌های متنوع و نامنظم کار کنه. این‌جا بود که دیتابیس‌های NoSQL (که مخفف Not only SQL هست) وارد میدون شدن و مانگو دی‌بی یکی از پرچم‌دارهای این نسل جدیده.

    مانگو دی‌بی دقیقا چیه؟ خداحافظی با جدول‌ها

    خب، بریم سر اصل مطلب. مانگو دی‌بی یک دیتابیس از نوع NoSQL و سند-گرا (Document-Oriented) هست. این یعنی چی؟ یعنی به جای اینکه داده‌ها رو توی سطر و ستون ذخیره کنه، اون‌ها رو توی ساختارهایی شبیه به اسناد JSON ذخیره می‌کنه. اگه با برنامه‌نویسی جاوا اسکریپت آشنا باشید، حتما با JSON کار کردید. JSON یه فرمت متنی ساده برای نمایش داده‌ها به صورت زوج‌های «کلید-مقدار» هست. مثلا اطلاعات یه کاربر میتونه این شکلی باشه:

    {
      "نام": "سارا",
      "نام_خانوادگی": "رضایی",
      "سن": 25,
      "علاقمندی‌ها": ["کتاب", "موسیقی", "سفر"]
    }

    مانگو دی‌بی داده‌ها رو در قالبی به اسم BSON ذخیره می‌کنه که مخفف Binary JSON هست. BSON در واقع نسخه باینری یا دودویی JSON هست که کارایی بالاتری داره و از انواع داده‌ای بیشتری مثل تاریخ و داده‌های باینری هم پشتیبانی می‌کنه.

    مزیت اصلی این مدل سند-گرا، انعطاف‌پذیری فوق‌العاده اونه. هر سند میتونه ساختار منحصر به فرد خودش رو داشته باشه. مثلا توی همون دیتابیس کاربرها، یه کاربر میتونه فیلد «ایمیل» داشته باشه و یکی دیگه نداشته باشه. یا یه کاربر فیلد «آدرس» داشته باشه که خودش شامل چند فیلد دیگه مثل شهر و خیابون هست. این ویژگی باعث میشه مدل داده‌ای دیتابیس شما خیلی به مدل داده‌ای اپلیکیشن شما نزدیک باشه و کار کردن باهاش برای توسعه‌دهنده‌ها خیلی راحت‌تر و سریع‌تر بشه. دیگه لازم نیست برای هر تغییر کوچیکی، کل ساختار دیتابیس رو عوض کنید.

    معماری و اجزای اصلی مانگو دی‌بی

    برای اینکه بهتر با کارکرد مانگو دی‌بی آشنا بشیم، بیایید اجزای اصلیش رو بشناسیم و با معادلشون توی دنیای دیتابیس‌های رابطه‌ای (RDBMS) مقایسه کنیم. این مقایسه کمک می‌کنه تصویر واضح‌تری تو ذهنتون شکل بگیره.

    جزء در مانگو دی‌بیمعادل در RDBMSتوضیحات
    دیتابیس (Database)دیتابیس (Database)بالاترین سطح ساختار که مجموعه‌ای از کالکشن‌ها رو در خودش نگه میداره.
    کالکشن (Collection)جدول (Table)گروهی از اسناد مرتبط. مثلا کالکشن «کاربران» یا کالکشن «محصولات».
    سند (Document)سطر (Row)واحد اصلی ذخیره‌سازی داده که یک شی BSON با زوج‌های کلید-مقدار هست.
    فیلد (Field)ستون (Column)یک ویژگی یا صفت خاص درون یک سند که داده‌ها رو نگه میداره.

    همونطور که می‌بینید، مفاهیم خیلی شبیه به هم هستن، اما فلسفه پشتشون کاملا متفاوته. توی مانگو دی‌بی، یک کالکشن میتونه اسنادی با ساختارهای کاملا متفاوت رو در خودش جا بده. این یعنی شما یک «شمای پویا» یا Schema-less دارید. لازم نیست از قبل تعریف کنید که هر سند چه فیلدهایی باید داشته باشه.

    برای مثال، فرض کنید یک دیتابیس به اسم «GeeksforGeeks» داریم. داخل این دیتابیس دو تا کالکشن داریم و داخل هر کالکشن هم دو تا سند. داده‌های ما داخل این سندها و در قالب فیلدها ذخیره میشن.

    ویژگی‌های کلیدی که مانگو دی‌بی رو خاص می‌کنن

    حالا که با کلیات مانگو دی‌بی آشنا شدیم، بیایید ببینیم چه ویژگی‌هایی باعث شده این دیتابیس اینقدر محبوب بشه.

    ۱. انعطاف‌پذیری و مدل سند-گرا

    این مهم‌ترین ویژگی مانگو دی‌بی هست که قبلا هم بهش اشاره کردیم. مدل سند-گرا مستقیما به اشیا (objects) در کد شما نگاشت میشه. این یعنی لازم نیست کلی کد بنویسید تا داده‌ها رو از فرمت جدولی به فرمت شی‌گرا تبدیل کنید. این انعطاف‌پذیری به شما اجازه میده داده‌های مرتبط رو توی یک سند واحد جاسازی کنید (embed کنید) که این کار باعث افزایش سرعت و کاهش هزینه‌های محاسباتی میشه.

    ۲. مقیاس‌پذیری افقی (Horizontal Scaling) با شاردینگ (Sharding)

    یکی از بزرگترین چالش‌ها در دنیای داده‌های بزرگ (Big Data) اینه که وقتی حجم داده‌ها خیلی زیاد میشه، چطور سیستم رو مدیریت کنیم. دو راه کلی وجود داره: مقیاس‌پذیری عمودی (Vertical Scaling) و مقیای‌پذیری افقی (Horizontal Scaling).

    • مقیاس‌پذیری عمودی: یعنی همون سرور فعلی رو قوی‌تر کنیم. مثلا رم و سی‌پی‌یو بیشتری بهش اضافه کنیم. این کار مثل اینه که ماشینتون رو با یه مدل قوی‌تر عوض کنید. اما این روش محدودیت داره و خیلی گرونه.
    • مقیاس‌پذیری افقی: یعنی به جای قوی‌تر کردن یک سرور، تعداد سرورها رو زیاد کنیم و داده‌ها رو بین اونها تقسیم کنیم. این روش خیلی به‌صرفه‌تر و انعطاف‌پذیرتره.

    مانگو دی‌بی از پایه برای مقیاس‌پذیری افقی طراحی شده. این کار رو با استفاده از تکنیکی به اسم شاردینگ (Sharding) انجام میده. در شاردینگ، داده‌های یک کالکشن بزرگ بر اساس یک کلید مشخص (shard key) به تکه‌های کوچکتری به اسم «چانک» (chunk) تقسیم میشن و هر تکه روی یک سرور مجزا (که بهش میگن shard) ذخیره میشه. این کار باعث میشه فشار کاری بین چندین ماشین پخش بشه و سیستم بتونه حجم عظیمی از داده و درخواست رو مدیریت کنه. این ویژگی، مانگو دی‌بی رو برای اپلیکیشن‌های بزرگ و با رشد سریع، ایده‌ال می‌کنه.

    ۳. دسترسی بالا (High Availability) با تکثیر (Replication)

    هیچ‌کس دوست نداره سیستمش از کار بیفته. مانگو دی‌بی برای اطمینان از اینکه دیتابیس شما همیشه در دسترسه، از مکانیزمی به اسم تکثیر یا Replication استفاده می‌کنه. این کار از طریق چیزی به اسم مجموعه تکثیر (Replica Set) انجام میشه.

    یک Replica Set شامل چند کپی از داده‌های شما روی سرورهای مختلفه. این مجموعه یک سرور اصلی (Primary) و چند سرور ثانویه (Secondary) داره. تمام عملیات نوشتن (write) به صورت پیش‌فرض روی سرور اصلی انجام میشه. سرورهای ثانویه به طور مداوم داده‌ها رو از سرور اصلی کپی می‌کنن و یک نسخه به‌روز از داده‌ها رو نگه می‌دارن.

    حالا اگه سرور اصلی به هر دلیلی از کار بیفته (مثلا به خاطر مشکل سخت‌افزاری)، مجموعه تکثیر به طور خودکار یک «انتخابات» برگزار می‌کنه و یکی از سرورهای ثانویه رو به عنوان سرور اصلی جدید انتخاب می‌کنه. این فرآیند که بهش Failover میگن، باعث میشه سیستم شما با کمترین وقفه به کارش ادامه بده. جالبه بدونید که برای جلوگیری از دوپاره شدن مغز (split-brain) در انتخابات، اگه فقط یک سرور ثانویه داشته باشید، باید یک عضو سوم به اسم داور (Arbiter) هم به مجموعه اضافه بشه که فقط در انتخابات رای میده و داده‌ای ذخیره نمی‌کنه.

    ۴. کوئری‌های قدرتمند و ایندکس‌گذاری

    مانگو دی‌بی فقط برای ذخیره داده نیست، بلکه ابزارهای خیلی قدرتمندی برای دسترسی و تحلیل داده‌ها هم فراهم می‌کنه. شما می‌تونید کوئری‌های موردی (Ad hoc queries) بزنید، یعنی بدون نیاز به تعریف قبلی، هر نوع جستجویی رو روی داده‌ها انجام بدید. این کوئری‌ها می‌تونن بر اساس فیلدهای خاص، محدوده‌های مشخص (range query) و حتی عبارت‌های باقاعده (regular-expression) باشن.

    برای اینکه این کوئری‌ها سریع اجرا بشن، مانگو دی‌بی از ایندکس‌گذاری (Indexing) پشتیبانی می‌کنه. درست مثل فهرست آخر یک کتاب که به شما کمک می‌کنه سریع‌تر به یک مطلب برسید، ایندکس‌ها هم به دیتابیس کمک می‌کنن تا اسناد مورد نظر شما رو بدون جستجوی کامل در کل کالکشن پیدا کنه. شما می‌تونید روی هر فیلدی در سند، ایندکس اولیه (primary) یا ثانویه (secondary) بسازید.

    ۵. تجمیع داده‌ها (Aggregation)

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

    • پایپ‌لاین تجمیع (Aggregation Pipeline): این روش اصلی و پرکاربردترین روشه. مثل یک خط مونتاژ کار می‌کنه که داده‌ها از مراحل مختلفی عبور می‌کنن و در هر مرحله یک عملیات خاص روشون انجام میشه (مثلا گروه‌بندی، فیلتر کردن، محاسبه).
    • تابع Map-Reduce: این یک روش قدیمی‌تر برای پردازش دسته‌ای داده‌هاست، اما پایپ‌لاین تجمیع معمولا کارایی بهتری داره.
    • متدهای تجمیع تک‌منظوره: برای کارهای ساده‌تر مثل شمارش یا پیدا کردن مقادیر متمایز.

    ۶. ذخیره‌سازی فایل با GridFS

    مانگو دی‌بی یک محدودیت داره: هر سند نمی‌تونه بزرگتر از ۱۶ مگابایت باشه. پس اگه بخوایم فایل‌های بزرگ مثل ویدیو یا عکس‌های باکیفیت رو ذخیره کنیم چی؟ برای این کار، مانگو دی‌بی یک راه‌حل داخلی به اسم GridFS داره. GridFS فایل‌های بزرگ رو به تکه‌های کوچکتر (chunks) تقسیم می‌کنه و هر تکه رو به عنوان یک سند مجزا در کالکشن‌های مخصوص ذخیره می‌کنه. اینطوری شما می‌تونید از تمام ویژگی‌های مانگو دی‌بی مثل تکثیر و شاردینگ برای فایل‌های بزرگ هم استفاده کنید.

    ابزارهای اصلی برای کار با مانگو دی‌بی

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

    • mongod: این کلمه مخفف MongoDB Daemon هست و در واقع سرور اصلی دیتابیس شماست. مثل موتور ماشین می‌مونه. تا وقتی این سرور رو اجرا نکنید، هیچ دیتابیسی وجود نداره که بهش وصل بشید. این سرور به صورت پیش‌فرض روی پورت 27017 منتظر اتصال کلاینت‌ها می‌مونه.
    • mongo و mongosh: اینها شل (Shell) یا کلاینت شما هستن. یعنی ابزاری که باهاش به سرور (mongod) وصل میشید و دستوراتتون رو اجرا می‌کنید؛ مثل کوئری زدن، اضافه کردن داده یا کارهای مدیریتی. mongo نسخه قدیمی‌تر این شل بود که از نسخه ۵.۰ به بعد مانگو دی‌بی، منسوخ شده. نسخه جدید و بهبودیافته اون mongosh نام داره که ویژگی‌هایی مثل هایلایت کردن دستورات، تاریخچه دستورات و لاگین بهتر رو ارائه میده. پس اگه می‌خواید با دیتابیس تعامل داشته باشید، باید از mongosh استفاده کنید.
    • mongos: این یکی کمی پیشرفته‌تره و وقتی کاربرد داره که شما از شاردینگ استفاده می‌کنید. mongos مخفف MongoDB Shard هست و مثل یک پراکسی یا روتر عمل می‌کنه. وقتی شما داده‌هاتون رو روی چندین سرور (shard) پخش کردید، کلاینت شما (مثلا mongosh) نمی‌دونه که داده مورد نظرش روی کدوم سرور قرار داره. mongos اینجا وارد عمل میشه. کلاینت شما به mongos وصل میشه و mongos وظیفه داره کوئری‌ها و درخواست‌های نوشتن رو به شارد یا شاردهای درست هدایت کنه.

    پس به طور خلاصه: شما mongod رو اجرا می‌کنید تا سرور دیتابیس راه بیفته. بعد با mongosh بهش وصل میشید تا با داده‌هاتون کار کنید. و اگه دیتابیس شما خیلی بزرگ و شارد شده باشه، mongos هم به عنوان یک واسط بین شما و شاردها عمل می‌کنه.

    مانگو دی‌بی اطلس (MongoDB Atlas): دیتابیس در ابرها

    راه انداختن و مدیریت یک دیتابیس، مخصوصا اگه بزرگ و توزیع‌شده باشه، کار ساده‌ای نیست. باید نگران نصب، پیکربندی، پشتیبان‌گیری، امنیت و خیلی چیزهای دیگه باشید. شرکت مانگو دی‌بی برای حل این مشکل، یک سرویس ابری به اسم MongoDB Atlas رو ارائه کرده.

    اطلس یک سرویس «دیتابیس به عنوان سرویس» (DBaaS) کاملا مدیریت شده است. یعنی شما دیگه لازم نیست خودتون سرور راه بندازید یا نگران نگهداری اون باشید. فقط با چند کلیک یک کلاستر (مجموعه‌ای از سرورها) مانگو دی‌بی روی پلتفرم‌های ابری معروفی مثل Amazon Web Services (AWS)، Google Cloud Platform و Microsoft Azure ایجاد می‌کنید و شرکت مانگو دی‌بی تمام کارهای مدیریتی رو براتون انجام میده. این سرویس امکاناتی مثل پشتیبان‌گیری خودکار، مانیتورینگ، امنیت پیشرفته و مقیاس‌پذیری راحت رو فراهم می‌کنه و به شما اجازه میده روی توسعه اپلیکیشن خودتون تمرکز کنید. جالبه بدونید که تا سال ۲۰۲۴، ۷۰ درصد درآمد شرکت مانگو دی‌بی از همین سرویس اطلس بوده.

    موارد استفاده مانگو دی‌بی: کجا به کار میاد؟

    با توجه به ویژگی‌هایی که گفتیم، مانگو دی‌بی برای طیف وسیعی از اپلیکیشن‌های مدرن مناسبه. بیایید چند تا از کاربردهای رایجش رو با هم مرور کنیم:

    • سیستم‌های مدیریت محتوا (CMS): به خاطر انعطاف‌پذیری بالا، مانگو دی‌بی برای ذخیره انواع محتوا مثل مقالات، وبلاگ‌ها و سایت‌های خبری که ساختارهای متنوعی دارن، عالیه.
    • اپلیکیشن‌های موبایل: مانگو دی‌بی به راحتی میتونه داده‌های سمت بک‌اند اپلیکیشن‌های iOS و اندروید رو ذخیره کنه و به توسعه‌دهنده‌ها اجازه میده اپلیکیشن‌هاشون رو به صورت یکپارچه مقیاس‌پذیر کنن.
    • تجارت الکترونیک (E-commerce): فروشگاه‌های آنلاین میتونن از مانگو دی‌بی برای مدیریت کاتالوگ محصولات، پروفایل کاربران، سبدهای خرید و تاریخچه تراکنش‌ها استفاده کنن.
    • اینترنت اشیا (IoT): دستگاه‌های IoT حجم عظیمی از داده‌های سنسورها رو تولید می‌کنن. مقیاس‌پذیری و انعطاف‌پذیری مانگو دی‌بی اون رو برای ذخیره و پردازش این داده‌ها ایده‌ال می‌کنه.
    • بازی‌های آنلاین: ذخیره پروفایل بازیکنان، امتیازات، دستاوردها و وضعیت بازی که ساختارهای پیچیده‌ای دارن، با مدل سند-گرای مانگو دی‌بی خیلی راحت‌تره.
    • تحلیل داده‌های آنی (Real-Time Analytics): توانایی مانگو دی‌بی در پردازش سریع داده‌ها، اون رو برای سیستم‌های مانیتورینگ، تشخیص تقلب و ارائه پیشنهادهای شخصی‌سازی شده مناسب می‌کنه.
    • شبکه‌های اجتماعی: مدیریت روابط پیچیده بین کاربران، محتوای تولید شده توسط کاربر و تعاملات زنده، با مانگو دی‌بی به خوبی امکان‌پذیره.
    • کاربردهای داده‌های بزرگ (Big Data): مانگو دی‌بی به خوبی با ابزارهای اکوسیستم داده‌های بزرگ مثل Apache Hadoop و Spark ادغام میشه و برای کارهایی مثل مدل‌سازی ریسک و تحلیل‌های پیش‌بینی‌کننده استفاده میشه.

    مقایسه مانگو دی‌بی با رقبای سنتی: MySQL

    برای اینکه جایگاه مانگو دی‌بی رو بهتر درک کنیم، خوبه که اون رو با MySQL به عنوان نماینده دیتابیس‌های رابطه‌ای مقایسه کنیم.

    ویژگیمانگو دی‌بی (MongoDB)مای‌اس‌کیو‌ال (MySQL)
    مدل دادهسند-گرا (Document-Oriented)، بدون شما (Schema-less)رابطه‌ای (Relational)، با شمای از پیش تعریف شده
    زبان کوئریMQL (زبانی شبیه JSON)SQL (زبان کوئری ساختاریافته)
    مقیاس‌پذیریافقی (Horizontal) با شاردینگ داخلیعمدتا عمودی (Vertical)، مقیاس‌پذیری افقی پیچیده‌تره
    موارد استفادهداده‌های بزرگ، اپلیکیشن‌های مدرن، داده‌های نیمه‌ساختاریافتهسیستم‌های تراکنشی، داده‌های با ساختار مشخص، جاهایی که یکپارچگی داده حیاتیه
    انعطاف‌پذیریبسیار بالا، تغییر ساختار داده آسان استکم، تغییر شما نیازمند فرآیندهای پیچیده است

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

    چه زمانی مانگو دی‌بی بهتره؟ وقتی سرعت، دسترسی بالا و توانایی کار با داده‌های متنوع و در حال تغییر اولویت داره، انعطاف‌پذیری و عملکرد بالای مانگو دی‌بی اون رو به گزینه بهتری تبدیل می‌کنه.

    تاریخچه و لایسنس: یک مسیر پر فراز و نشیب

    مانگو دی‌بی توسط شرکتی به اسم 10gen در سال ۲۰۰۷ شروع به توسعه پیدا کرد. این شرکت که بعدها در سال ۲۰۱۳ اسم خودش رو به MongoDB Inc. تغییر داد، در ابتدا قصد داشت یک محصول پلتفرم به عنوان سرویس (PaaS) بسازه که مانگو دی‌بی یکی از اجزای اون بود. اما در سال ۲۰۰۹، اونها مدل توسعه رو به سمت متن‌باز تغییر دادن. مانگو دی‌بی در تاریخ ۲۰ اکتبر ۲۰۱۷ با نماد MDB در بورس NASDAQ عرضه عمومی شد.

    یکی از بحث‌برانگیزترین اتفاقات در تاریخ مانگو دی‌بی، تغییر لایسنس اون بود. نسخه‌هایی که قبل از ۱۶ اکتبر ۲۰۱۸ منتشر شدن، تحت لایسنس AGPL بودن که یک لایسنس متن‌باز شناخته شده است. اما بعد از این تاریخ، شرکت مانگو دی‌بی لایسنس نرم‌افزار سرور خودش رو به Server Side Public License (SSPL) تغییر داد.

    این لایسنس جدید که توسط خود مانگو دی‌بی نوشته شده، شبیه به لایسنس‌های متن‌باز هست اما یک شرط مهم داره: اگه شما نرم‌افزار مانگو دی‌بی رو به عنوان یک «سرویس» عمومی ارائه بدید، باید کل سورس کد سرویس خودتون رو هم تحت همین لایسنس SSPL منتشر کنید. این تغییر برای جلوگیری از این بود که شرکت‌های بزرگ ارائه‌دهنده خدمات ابری، از مانگو دی‌بی به صورت تجاری استفاده کنن بدون اینکه به جامعه اون کمک کنن.

    این تغییر باعث شد که بنیاد نرم‌افزار متن‌باز (OSI) اعلام کنه که SSPL یک لایسنس متن‌باز نیست. در نتیجه، توزیع‌های لینوکسی معروفی مثل Debian، Fedora و Red Hat Enterprise Linux، مانگو دی‌بی رو از مخازن رسمی خودشون حذف کردن.

    انتقادات و چالش‌ها: نگاهی بی‌طرفانه

    هیچ تکنولوژی‌ای بدون نقطه ضعف نیست و مانگو دی‌بی هم از این قاعده مستثنی نیست. مهمه که با نگاهی بی‌طرفانه، برخی از انتقادات و چالش‌های مطرح شده در مورد اون رو هم بررسی کنیم.

    • امنیت: در نسخه‌های قدیمی‌تر، تنظیمات پیش‌فرض امنیتی مانگو دی‌بی ضعیف بود و به هر کسی اجازه دسترسی کامل به دیتابیس رو می‌داد. این موضوع باعث شد که هکرها به ده‌ها هزار دیتابیس حمله کنن، اطلاعات رو سرقت کنن یا برای پس دادن اونها باج بخوان. البته از نسخه ۲.۶ به بعد، این مشکل حل شد و به صورت پیش‌فرض، دیتابیس فقط به اتصالات از خود ماشین (localhost) اجازه دسترسی میده.
    • عدم وجود JOINهای پیچیده: در دیتابیس‌های رابطه‌ای، شما می‌تونید با دستور JOIN داده‌ها رو از جدول‌های مختلف به هم وصل کنید. مانگو دی‌بی به صورت ذاتی از JOIN به اون شکل پشتیبانی نمی‌کنه. به جای اون، شما باید از طریق جاسازی اسناد (embedding) یا ارجاع (referencing) روابط رو مدیریت کنید. این موضوع گاهی برای کسانی که از دنیای SQL میان، چالش‌برانگیزه و باعث میشه در اپلیکیشن‌های خیلی پیچیده که روابط زیادی دارن، برخی به سمت SQL برگردن.
    • مصرف بالای حافظه: مانگو دی‌بی برای افزایش کارایی، از حافظه رم به مقدار زیادی استفاده می‌کنه که میتونه هزینه‌های سخت‌افزاری رو بالا ببره.
    • انتقادات فنی و یکپارچگی داده: در گذشته، گزارش‌هایی مثل گزارش معروف Jepsen (یک شرکت تحقیقاتی در زمینه ایمنی سیستم‌های توزیع‌شده) مشکلاتی رو در مورد یکپارچگی داده‌ها در سناریوهای خاصی از خرابی شبکه در مانگو دی‌بی پیدا کرده بود. این گزارش‌ها نشون می‌داد که در شرایط خاص، ممکنه دیتابیس داده‌های قدیمی (stale reads) برگردونه یا حتی داده‌هایی که تایید شدن رو به عقب برگردونه (rollback). شرکت مانگو دی‌بی در نسخه‌های بعدی (مثل نسخه ۳.۴ و بالاتر) بسیاری از این مشکلات رو برطرف کرد و ادعا کرد که تست‌های Jepsen رو با موفقیت پشت سر گذاشته. اما گزارش‌های جدیدتر Jepsen در مورد نسخه‌های جدیدتر مثل ۴.۲.۶، همچنان به برخی مشکلات و پیچیدگی‌ها در تضمین کامل یکپارچگی داده‌ها در تراکنش‌ها اشاره داشت. البته این مشکلات هم در پچ‌های بعدی مورد توجه قرار گرفتن و در نسخه ۵.۰، پیش‌فرض‌های مربوط به تایید نوشتن داده (write concern) برای افزایش ایمنی، تقویت شدن.

    این انتقادات به این معنی نیستن که مانگو دی‌بی ابزار بدیه، بلکه نشون میدن که مثل هر ابزار قدرتمند دیگه‌ای، باید با آگاهی کامل از نقاط قوت و ضعفش از اون استفاده کرد.

    پرسش و پاسخ‌های متداول (FAQ)

    حالا که یک دید کلی و جامع از مانگو دی‌بی پیدا کردیم، بیایید به چند تا سوال رایج که ممکنه تو ذهن شما شکل گرفته باشه جواب بدیم.

    • سوال ۱: پس مانگو دی‌بی فقط برای داده‌های «بدون ساختار» خوبه؟

      نه لزوما. اصطلاح بهتر «داده‌های نیمه‌ساختاریافته» یا داده‌هایی هست که ساختار ثابتی ندارن. مانگو دی‌بی برای هر اپلیکیشنی که داده‌هاش به راحتی در قالب جدول‌های سفت و سخت جا نمیگیرن یا ساختارشون در طول زمان زیاد تغییر می‌کنه، عالیه. حتی برای داده‌های ساختاریافته هم میشه ازش استفاده کرد، اما انعطاف‌پذیریش در کار با داده‌های متنوع نقطه قوت اصلیشه.

    • سوال ۲: فرق بین mongo و mongosh دقیقا چی بود؟

      هر دو ابزارهایی برای اتصال به سرور مانگو دی‌بی و اجرای دستورات هستن. mongo نسخه قدیمی‌تره که دیگه توسعه داده نمیشه. mongosh نسخه جدید، مدرن و پیشنهادی هست که امکانات بهتری مثل رنگی بودن دستورات و تاریخچه بهتر رو ارائه میده. همیشه سعی کنید از mongosh استفاده کنید.

    • سوال ۳: این «کرسر» (Cursor) که گاهی در موردش صحبت میشه چیه؟

      وقتی شما یک کوئری find در مانگو دی‌بی اجرا می‌کنید، دیتابیس تمام نتایج رو یک‌جا برای شما ارسال نمی‌کنه، چون ممکنه نتایج خیلی زیاد باشن و حافظه زیادی مصرف کنن. به جای اون، یک کرسر (Cursor) برمی‌گردونه. کرسر مثل یک «اشاره‌گر» به مجموعه‌ی نتایج روی سرور عمل می‌کنه. شما با استفاده از این کرسر می‌تونید نتایج رو یکی یکی یا به صورت دسته‌ای (batch) از سرور بگیرید. متدهایی مثل hasNext() (که چک می‌کنه آیا نتیجه دیگه‌ای وجود داره) و next() (که نتیجه بعدی رو برمی‌گردونه) روی همین کرسر کار می‌کنن.

    • سوال ۴: اگه اینقدر انعطاف‌پذیر و خوبه، چه زمانی نباید از مانگو دی‌بی استفاده کنم؟

      مانگو دی‌بی برای همه کارها بهترین راه‌حل نیست. اگه اپلیکیشن شما داده‌های بسیار رابطه‌ای داره و نیاز به JOINهای پیچیده بین چندین جدول دارید (مثلا یک سیستم بانکی پیچیده)، و یکپارچگی و ثبات داده‌ها (ACID properties) در سطح تراکنش‌های چند جدولی برای شما حیاتی‌تر از هر چیز دیگه‌ای هست، احتمالا یک دیتابیس رابطه‌ای مثل MySQL یا PostgreSQL انتخاب بهتری باشه.

    • سوال ۵: جریان این لایسنس SSPL چیه؟ یعنی مانگو دی‌بی دیگه متن‌باز نیست؟

      از نظر فنی، سورس کد مانگو دی‌بی همچنان در دسترسه (source-available)، اما لایسنس SSPL توسط بنیاد متن‌باز به عنوان یک لایسنس «متن‌باز» واقعی تایید نشده. دلیلش هم محدودیتی هست که برای ارائه‌دهندگان خدمات ابری ایجاد می‌کنه. برای یک توسعه‌دهنده معمولی که از مانگو دی‌بی در اپلیکیشن خودش استفاده می‌کنه، این موضوع معمولا تفاوت خاصی ایجاد نمی‌کنه. اما اگه قصد دارید خود مانگو دی‌بی رو به عنوان یک سرویس تجاری به دیگران بفروشید، باید شرایط این لایسنس رو به دقت بررسی کنید. نسخه Community مانگو دی‌بی همچنان برای استفاده رایگانه.

    منابع

    • [2] mongod, mongo, mongosh, mongos, what now? – Helen Scott
    • [4] MongoDB – Wikipedia
    • [6] What is a Cursor in MongoDB? – Stack Overflow
    • [8] MongoDB – Working and Features – GeeksforGeeks
    • [10] What is MongoDB? Features and how it works – TechTarget Definition
    • [1] MongoDB: The World’s Leading Modern Database | MongoDB
    • [3] ELI5: What is MongoDB and what is used for? : r/mongodb
    • [5] What Is MongoDB? | MongoDB
    • [7] When should I actually use MongoDB? : r/webdev
    • [9] What Is MongoDB? | IBM
  • هوش مصنوعی (AI) چیست، یک تعریف ساده و عمیق شدن بیشتر

    بیاین از یه زاویه جالب بهش نگاه کنیم. ما انسان‌ها از همون اول با ابزارها و ماشین‌ها رفیق بودیم. از چرخ که کشاورزی رو زیر و رو کرد گرفته تا پیچ که ساختمون‌های پیچیده رو ممکن کرد و خط‌های تولید رباتیک امروزی، ماشین‌ها همیشه کمک دست ما بودن. ولی یه ترسی هم همیشه ته دلمون بوده: چی میشه اگه یه روزی این ماشین‌ها مثل ما هوشمند بشن و بخوان برای خودشون تصمیم بگیرن؟ البته این کنجکاوی و ترس با هم قاطی شده و باعث شده علمی‌تخیلی‌ها کم کم رنگ واقعیت بگیرن.

    حالا بیایم سر تعریف اصلی. هوش مصنوعی (Artificial Intelligence یا AI) یعنی توانایی یه ماشین برای انجام دادن کارهای شناختی که ما معمولا به ذهن انسان نسبتش میدیم. کارهایی مثل درک کردن، استدلال کردن، یاد گرفتن، تعامل با محیط، حل مسئله و حتی خلاقیت. شاید خودتونم ندونین ولی احتمالا تا حالا کلی با AI سر و کار داشتین؛ دستیارهای صوتی مثل سیری و الکسا یا اون ربات‌های چت که تو بعضی سایت‌ها بهتون کمک میکنن، همشون بر پایه تکنولوژی AI کار میکنن.

    این ماشین‌های هوشمند روز به روز دارن سریع‌تر و پیچیده‌تر میشن. مثلا بعضی کامپیوترها به مرحله‌ای به اسم «اگزااسکیل» رسیدن. یعنی میتونن توی یک ثانیه، به اندازه‌ای محاسبه انجام بدن که یه نفر آدم باید ۳۱ میلیارد و ۶۸۸ میلیون و ۷۶۵ هزار سال وقت بذاره تا انجامش بده. دیگه فقط بحث محاسبه نیست، کامپیوترها دارن مهارت‌ها و قدرت درکی پیدا میکنن که یه زمانی فقط مخصوص ما انسان‌ها و چندتا گونه دیگه بود.

    اما ارزش واقعی AI به خود سیستم‌هاش نیست، بلکه به اینه که شرکت‌ها چطور از این سیستم‌ها برای کمک به انسان‌ها استفاده میکنن و چقدر میتونن عملکردشون رو شفاف توضیح بدن تا اعتماد بقیه رو جلب کنن.

    از کجا شروع کنیم؟ بیایم با یادگیری ماشین آشنا بشیم

    خب، وقتی میگیم AI، در واقع داریم در مورد یه خانواده بزرگ از تکنولوژی‌ها حرف میزنیم. یکی از مهم‌ترین اعضای این خانواده یادگیری ماشین (Machine Learning یا ML) هست.

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

    این روزها حجم داده‌هایی که تولید میشه اونقدر زیاد و پیچیده است که ما انسان‌ها از پس پردازشش برنمیایم. همین موضوع، هم پتانسیل یادگیری ماشین رو بیشتر کرده و هم نیازمون بهش رو. از دهه ۱۹۷۰ که استفاده از یادگیری ماشین گسترده شد، تاثیرات بزرگی تو صنایع مختلف داشته، مثلا تو تحلیل تصاویر پزشکی یا پیش‌بینی خیلی دقیق وضعیت آب و هوا.

    به طور کلی، سه مدل اصلی برای یادگیری ماشین وجود داره:

    • یادگیری نظارت شده (Supervised learning): تو این مدل، الگوریتم رو با داده‌های برچسب‌دار آموزش میدیم. یعنی چی؟ یعنی مثلا بهش کلی عکس گربه نشون میدیم و بهش میگیم «اینا گربه هستن». هدف اینه که مدل یاد بگیره بین ورودی (عکس) و خروجی (برچسب گربه) یه نقشه پیدا کنه تا بعدا بتونه عکس‌های جدیدی که تا حالا ندیده رو هم درست تشخیص بده.
    • یادگیری نظارت نشده (Unsupervised learning): اینجا دیگه از داده‌های برچسب‌دار خبری نیست. الگوریتم باید خودش الگوها رو تو داده‌های بدون ساختار پیدا کنه. نتیجه نهایی از قبل مشخص نیست. الگوریتم خودش داده‌ها رو بر اساس ویژگی‌هاشون دسته‌بندی میکنه. این مدل برای پیدا کردن الگوها و مدل‌سازی توصیفی خیلی خوبه.
    • یادگیری تقویتی (Reinforcement learning): این مدل رو میشه به «یادگیری با آزمون و خطا» توصیف کرد. یه «عامل» (Agent) یاد میگیره که یه کار مشخص رو با سعی و خطا انجام بده. اینقدر این کار رو تکرار میکنه تا عملکردش به یه سطح قابل قبول برسه. وقتی کار رو خوب انجام میده تشویق (تقویت مثبت) میشه و وقتی بد انجام میده تنبیه (تقویت منفی). مثلا آموزش دادن به یه دست رباتیک برای برداشتن یه توپ، یه نمونه از این نوع یادگیریه.

    یه روش ترکیبی هم به اسم یادگیری نیمه نظارت شده (Semi-supervised learning) وجود داره که توش فقط بخشی از داده‌ها برچسب دارن.

    یک پله عمیق‌تر: یادگیری عمیق و شبکه‌های عصبی

    حالا که با یادگیری ماشین آشنا شدیم، وقتشه بریم سراغ یه نسخه پیشرفته‌تر از اون به اسم یادگیری عمیق (Deep Learning).

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

    ایده اصلی یادگیری عمیق استفاده از شبکه‌های عصبی (Neural Networks) هست. این شبکه‌ها از نحوه تعامل نورون‌ها تو مغز انسان الهام گرفته شدن. یه شبکه عصبی از لایه‌های به هم پیوسته از گره‌ها (که شبیه نورون هستن) تشکیل شده. داده‌ها وارد این شبکه میشن و از چندین لایه عبور میکنن. هر لایه ویژگی‌های پیچیده‌تری از داده رو تشخیص میده. مثلا لایه اول ممکنه یه چیزی رو به عنوان یه شکل خاص تشخیص بده و لایه بعدی، بر اساس این اطلاعات، بفهمه که اون شکل یه تابلوی ایست هست. یادگیری عمیق هم مثل یادگیری ماشین، از تکرار برای اصلاح خودش و بهتر کردن قدرت پیش‌بینی‌اش استفاده میکنه.

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

    چند نوع شبکه عصبی معروف هم داریم که خوبه اسمشون رو بدونین:

    • شبکه‌های عصبی پیشخور (Feedforward Neural Networks – FF): یکی از قدیمی‌ترین مدل‌ها که داده‌ها فقط در یک جهت، از لایه‌ها عبور میکنن تا به خروجی برسن.
    • شبکه‌های عصبی بازگشتی (Recurrent Neural Networks – RNN): این مدل‌ها بر خلاف مدل قبلی، از داده‌های سری زمانی یا دنباله‌ای استفاده میکنن و یه جورایی «حافظه» دارن از اتفاقی که تو لایه قبلی افتاده. برای همین تو تشخیص گفتار و ترجمه خیلی به کار میان.
    • حافظه طولانی/کوتاه مدت (Long/Short Term Memory – LSTM): اینم یه مدل پیشرفته از RNN هست که میتونه چیزهایی که چندین لایه قبل اتفاق افتاده رو با استفاده از «سلول‌های حافظه» به خاطر بسپره.
    • شبکه‌های عصبی کانولوشنی (Convolutional Neural Networks – CNN): این‌ها جزو معروف‌ترین شبکه‌های عصبی هستن و بیشتر تو تشخیص تصویر استفاده میشن. لایه‌های مختلفش بخش‌های متفاوتی از یه عکس (مثل رنگ‌ها و لبه‌ها) رو فیلتر میکنن تا در نهایت تصویر رو تشخیص بدن.
    • شبکه‌های مولد تخاصمی (Generative Adversarial Networks – GAN): تو این سیستم، دو تا شبکه عصبی با هم رقابت میکنن. یکی (مولد) سعی میکنه مثال‌های جدید بسازه و اون یکی (تفکیک‌کننده) سعی میکنه تشخیص بده که این مثال‌ها واقعی هستن یا ساختگی. این رقابت در نهایت باعث بهتر شدن خروجی میشه. از این مدل برای ساختن عکس‌های واقعی و حتی آثار هنری استفاده شده.

    جدیدترین پدیده: هوش مصنوعی مولد (Generative AI)

    و اما میرسیم به بحث داغ این روزها: هوش مصنوعی مولد (Generative AI یا Gen AI).

    هوش مصنوعی مولد به مدل‌های یادگیری عمیقی گفته میشه که میتونن در جواب به یه درخواست یا «پرامپت» (Prompt) از طرف کاربر، محتوای جدید و اورجینال مثل متن‌های طولانی، عکس‌های باکیفیت، ویدیوهای واقعی یا صدا تولید کنن. ابزارهایی مثل ChatGPT و DALL-E (که عکس تولید میکنه) نشون دادن که این تکنولوژی پتانسیل تغییر دادن خیلی از شغل‌ها رو داره.

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

    فرایند کار هوش مصنوعی مولد معمولا سه مرحله داره:

    • شروع با یک مدل پایه (Foundation Model): همه چیز با یه مدل پایه شروع میشه. این مدل یه مدل یادگیری عمیق خیلی بزرگه که روی حجم عظیمی از داده‌های خام و بدون برچسب (مثلا ترابایت‌ها متن و عکس از اینترنت) آموزش دیده. این آموزش خیلی سنگین، زمان‌بر و گرونه و به هزاران پردازنده گرافیکی (GPU) و میلیون‌ها دلار هزینه نیاز داره. این مدل‌ها که معروف‌ترینشون مدل‌های زبان بزرگ (Large Language Models یا LLM) هستن، میتونن به صورت خودکار به پرامپت‌ها جواب بدن.
    • تنظیم دقیق (Fine-tuning): بعد از ساخت مدل پایه، باید اون رو برای یه کار مشخص (مثلا تولید یه نوع محتوای خاص) تنظیم کرد. این کار با روش‌های مختلفی مثل آموزش بیشتر با داده‌های مرتبط انجام میشه.
    • ارزیابی و بهبود مداوم: توسعه‌دهنده‌ها و کاربرها به طور مرتب خروجی‌های این ابزارها رو ارزیابی میکنن و مدل رو حتی هفته‌ای یک بار برای دقت و مرتبط بودن بیشتر، دوباره تنظیم میکنن.

    سفری به گذشته: تاریخچه هوش مصنوعی

    برای اینکه بفهمیم الان کجا هستیم، باید بدونیم از کجا شروع کردیم. ایده «ماشینی که فکر میکنه» به یونان باستان برمیگرده، اما اگه بخوایم تاریخ مدرنش رو بررسی کنیم، باید از اینجا شروع کنیم:

    • دهه ۱۹۴۰ و ۱۹۵۰:
      • ۱۹۴۳: وارن مک‌کالک و والتر پیتس یه مدل از نورون‌های مصنوعی رو پیشنهاد دادن که پایه و اساس شبکه‌های عصبی شد.
      • ۱۹۵۰: آلن تورینگ، که بهش «پدر علم کامپیوتر» هم میگن، یه مقاله به اسم «ماشین‌های محاسباتی و هوش» منتشر کرد و این سوال رو پرسید: «آیا ماشین‌ها میتونن فکر کنن؟». اون یه آزمایشی به اسم «بازی تقلید» رو هم معرفی کرد که امروز به «آزمون تورینگ» معروفه. این آزمون توانایی یه ماشین برای نشون دادن رفتار هوشمندانه رو میسنجه.
      • ۱۹۵۶: این سال یه نقطه عطف بود. جان مک‌کارتی، دانشمند کامپیوتر، برای اولین بار از عبارت «هوش مصنوعی» تو یه کارگاه تو کالج دارتموث استفاده کرد. همون سال، آلن نیوول، جی. سی. شاو و هربرت سایمون اولین برنامه کامپیوتری هوش مصنوعی به اسم «Logic Theorist» رو ساختن.
    • چهار مرحله تکامل AI (به روایت رادنی بروکس، فیزیکدان MIT):
      • هوش مصنوعی نمادین (Symbolic AI – از ۱۹۵۶): به این روش، هوش مصنوعی کلاسیک یا حتی GOFAI (مخفف هوش مصنوعی خوب و قدیمی) هم میگن. ایده اصلی اینجا استفاده از نمادها و استدلال منطقی برای حل مسئله بود. مثلا: ژرمن شپرد یه سگه، سگ یه پستانداره، همه پستانداران خونگرم هستن؛ پس ژرمن شپرد باید خونگرم باشه. مشکل اصلی این روش این بود که انسان‌ها باید دانش خودشون از دنیا رو به صورت دستی وارد سیستم میکردن. برای همین این سیستم‌ها با پیچیدگی‌های دنیای واقعی مشکل داشتن و نمیتونستن از داده‌های زیاد یاد بگیرن. این روش تا اواخر دهه ۱۹۸۰ روش غالب بود.
      • شبکه‌های عصبی (با پیشرفت‌هایی در سال‌های ۱۹۵۴، ۱۹۶۹، ۱۹۸۶ و ۲۰۱۲): همونطور که گفتیم، این تکنولوژی پشت رشد انفجاری هوش مصنوعی مولد امروزیه. با اینکه ایده‌اش از دهه ۴۰ مطرح بود، فراز و نشیب‌های زیادی داشت. در سال ۱۹۶۹ دو تا محقق MIT نشون دادن که شبکه‌های عصبی فقط میتونن کارهای خیلی ساده انجام بدن. اما در سال ۱۹۸۶، جفری هینتون و همکارانش این مشکل رو حل کردن. در نهایت در سال ۲۰۱۲، هینتون و دو تا از دانشجوهاش قدرت یادگیری عمیق رو با استفاده از شبکه‌های عصبی با لایه‌های خیلی بیشتر نشون دادن و تمرکز دنیا رو به این سمت بردن.
      • رباتیک سنتی (Traditional Robotics – از ۱۹۶۸): تو دهه‌های اول هوش مصنوعی، محقق‌ها برای پیشبرد تحقیقاتشون ربات میساختن. این ربات‌ها معمولا تو محیط‌های خیلی کنترل شده کار میکردن و رفتارهای کاملا برنامه‌ریزی شده رو تکرار میکردن. با اینکه این ربات‌ها به پیشرفت خود AI کمک زیادی نکردن، اما تو یه زمینه به اسم «مکان‌یابی و نقشه‌برداری همزمان» (SLAM) خیلی تاثیرگذار بودن که به ساخت ماشین‌های خودران و حتی ربات‌های جاروبرقی امروزی کمک کرد.
      • رباتیک مبتنی بر رفتار (Behavior-based Robotics – از ۱۹۸۵): محقق‌ها دیدن که حشرات با تعداد کمی نورون، خیلی خوب تو دنیای واقعی مسیریابی میکنن. پس سعی کردن ربات‌هایی بسازن که بتونن با دانش ناقص و دستورالعمل‌های متناقض، مشکلات رو حل کنن. این ربات‌ها هم تو دلشون شبکه‌های عصبی دارن.
    • دهه ۱۹۸۰ تا امروز:
      • دهه ۱۹۸۰: شبکه‌های عصبی که از الگوریتم «پس‌انتشار» (backpropagation) برای آموزش خودشون استفاده میکردن، به طور گسترده تو کاربردهای AI استفاده شدن. اما بعدش به خاطر محدودیت‌ها، یه دوره رکود دیگه به اسم «زمستان دوم AI» به وجود اومد.
      • ۱۹۹۷: کامپیوتر «دیپ بلو» شرکت IBM، گری کاسپاروف، قهرمان شطرنج جهان رو شکست داد. این یه اتفاق خیلی مهم بود.
      • ۲۰۱۶: برنامه «آلفاگو» شرکت دیپ‌مایند، که با یه شبکه عصبی عمیق کار میکرد، لی سدول، قهرمان جهان تو بازی «گو» رو شکست داد. این پیروزی خیلی مهم بود چون تعداد حرکات ممکن تو بازی گو فوق‌العاده زیاده.
      • ۲۰۲۲: ظهور مدل‌های زبان بزرگ یا LLMها، مثل ChatGPT، یه تغییر عظیم تو عملکرد هوش مصنوعی و پتانسیلش ایجاد کرد.

    انواع هوش مصنوعی: از ضعیف تا فوق هوشمند

    خب، حالا که با تاریخچه و اجزای اصلی AI آشنا شدیم، بیایم ببینیم چه انواعی داره. هوش مصنوعی رو میشه از چند دیدگاه مختلف دسته‌بندی کرد.

    دسته‌بندی بر اساس قابلیت:

    • هوش مصنوعی ضعیف یا محدود (Weak AI یا Narrow AI): این‌ها سیستم‌های هوش مصنوعی هستن که برای انجام یه کار مشخص یا مجموعه‌ای از کارهای محدود طراحی و آموزش دیدن. تقریبا تمام هوش مصنوعی که ما امروز میبینیم و استفاده میکنیم از این نوعه. دستیار صوتی الکسا، الگوریتم‌های تشخیص تقلب کارت اعتباری یا موتور جستجوی گوگل همشون نمونه‌هایی از هوش مصنوعی محدود هستن.
    • هوش مصنوعی قوی یا عمومی (Strong AI یا Artificial General Intelligence – AGI): این نوع هوش مصنوعی، توانایی درک، یادگیری و به کار بردن دانش در طیف وسیعی از کارها رو در سطحی برابر یا حتی فراتر از هوش انسان داره. این سطح از AI در حال حاضر فقط در حد تئوری وجود داره و هنوز هیچ سیستمی بهش نرسیده. بعضی محقق‌ها معتقدن رسیدن به AGI به افزایش خیلی زیادی تو قدرت محاسباتی نیاز داره. رادنی بروکس، رباتیک‌دان MIT و یکی از بنیان‌گذاران iRobot، معتقده که AGI تا سال ۲۳۰۰ از راه نمیرسه.
    • هوش مصنوعی فوق هوشمند (Artificial Superintelligence – ASI): این دیگه سطح بعدیه که توش ماشین میتونه تو همه زمینه‌ها از انسان برتر عمل کنه. این هم مثل AGI فعلا در قلمرو علمی-تخیلی قرار داره.

    دسته‌بندی بر اساس عملکرد:

    1. نوع ۱: ماشین‌های واکنشی (Reactive Machines): این سیستم‌ها حافظه ندارن و فقط برای یه کار خاص طراحی شدن. مثل کامپیوتر شطرنج‌باز دیپ بلو که کاسپاروف رو شکست داد. اون میتونست مهره‌ها رو تشخیص بده و حرکت بعدی رو پیش‌بینی کنه، ولی از تجربه‌های قبلی برای بازی‌های آینده‌اش استفاده نمیکرد.
    2. نوع ۲: حافظه محدود (Limited Memory): این سیستم‌ها حافظه دارن و میتونن از تجربیات گذشته برای تصمیم‌گیری‌های آینده استفاده کنن. بعضی از عملکردهای تصمیم‌گیری تو ماشین‌های خودران اینجوری طراحی شدن.
    3. نوع ۳: نظریه ذهن (Theory of Mind): این یه اصطلاح روانشناسیه. وقتی در مورد AI به کار میره، یعنی سیستمی که میتونه احساسات رو بفهمه، نیت انسان‌ها رو درک کنه و رفتارشون رو پیش‌بینی کنه. این نوع AI هنوز به طور کامل وجود نداره.
    4. نوع ۴: خودآگاهی (Self-awareness): تو این دسته، سیستم‌های AI یه حسی از «خود» دارن که بهشون آگاهی میده. ماشین‌هایی که خودآگاهی دارن، وضعیت فعلی خودشون رو درک میکنن. این نوع AI هم هنوز وجود نداره.

    AI در دنیای واقعی: کاربردها و مزایا

    خب، این همه در مورد تئوری و تاریخ حرف زدیم. حالا بیایم ببینیم این هوش مصنوعی تو دنیای واقعی به چه دردی میخوره.

    مزایای کلی هوش مصنوعی:

    • اتوماسیون (Automation): هوش مصنوعی میتونه کارهای تکراری و خسته‌کننده رو خودکار کنه، چه کارهای دیجیتال مثل جمع‌آوری و وارد کردن داده، چه کارهای فیزیکی مثل جابجا کردن بسته‌ها تو انبار. این کار باعث میشه ما انسان‌ها وقتمون برای کارهای خلاقانه‌تر و باارزش‌تر آزاد بشه.
    • کاهش خطای انسانی: AI میتونه خطاهای دستی تو پردازش داده، تحلیل یا مونتاژ رو از بین ببره چون الگوریتم‌ها هر بار یه فرایند رو به همون شکل دقیق تکرار میکنن.
    • تصمیم‌گیری سریع و دقیق: هوش مصنوعی میتونه سریع‌تر و دقیق‌تر از انسان‌ها پیش‌بینی کنه و تصمیم‌های مبتنی بر داده بگیره.
    • در دسترس بودن همیشگی: AI خسته نمیشه و به استراحت نیاز نداره. ربات‌های چت میتونن ۲۴ ساعته جواب مشتری‌ها رو بدن.
    • افزایش ایمنی: با خودکار کردن کارهای خطرناک مثل کار با مواد منفجره یا کار در اعماق اقیانوس، دیگه نیازی نیست انسان‌ها رو در معرض خطر قرار بدیم.

    کاربردها در صنایع مختلف:

    • خدمات مشتری: شرکت‌ها از ربات‌های چت و دستیارهای مجازی برای جواب دادن به سوالات مشتری‌ها، پیگیری سفارش‌ها و حل مشکلات استفاده میکنن. این ابزارها با استفاده از پردازش زبان طبیعی (Natural Language Processing – NLP) زبان ما رو میفهمن و جواب میدن.
    • کشف تقلب: الگوریتم‌های یادگیری ماشین میتونن الگوهای تراکنش‌ها رو تحلیل کنن و موارد مشکوک مثل خریدهای غیرعادی رو به سرعت تشخیص بدن.
    • تجربه مشتری شخصی‌سازی شده: فروشگاه‌ها و بانک‌ها از AI برای پیشنهاد دادن محصولات و خدماتی که احتمالا دوست دارین، استفاده میکنن.
    • استخدام و منابع انسانی: پلتفرم‌های استخدامی مبتنی بر AI میتونن رزومه‌ها رو بررسی کنن، کاندیداها رو با شرح شغل تطبیق بدن و حتی مصاحبه‌های اولیه رو انجام بدن.
    • توسعه نرم‌افزار: ابزارهای تولید کد با هوش مصنوعی مولد میتونن کارهای کدنویسی تکراری رو ساده کنن و سرعت توسعه برنامه‌ها رو بالا ببرن.
    • تعمیر و نگهداری پیش‌بینی‌کننده: مدل‌های یادگیری ماشین میتونن داده‌های سنسورها رو تحلیل کنن و پیش‌بینی کنن که یه دستگاه کی به تعمیر نیاز داره تا از کار افتادن ناگهانیش جلوگیری بشه.
    • بهداشت و درمان: AI تو تحلیل تصاویر پزشکی برای تشخیص زودهنگام بیماری‌ها، طراحی برنامه‌های درمانی شخصی‌سازی شده و حتی کشف داروهای جدید به کار میره.
    • حمل و نقل: ماشین‌های خودران یه مثال بارز هستن. علاوه بر این، AI برای مدیریت ترافیک، پیش‌بینی تاخیر پروازها و بهینه‌سازی مسیرهای کشتی‌رانی هم استفاده میشه.

    بر اساس یه نظرسنجی در سال ۲۰۲۲، پذیرش مدل‌های هوش مصنوعی از سال ۲۰۱۷ بیش از دو برابر شده و سرمایه‌گذاری تو این حوزه هم به همین نسبت افزایش پیدا کرده. حوزه‌هایی که شرکت‌ها بیشترین ارزش رو از AI میبینن شامل بازاریابی و فروش، توسعه محصول و خدمات، و استراتژی و امور مالی شرکتی هست.

    چالش‌ها، خطرات و بحث‌های اخلاقی

    با همه این خوبی‌ها، هوش مصنوعی بدون چالش و خطر هم نیست. مهمه که این جنبه‌ها رو هم بشناسیم.

    محدودیت‌ها و خطرات مدل‌های AI:

    • خروجی‌های اشتباه: خروجی‌های مدل‌های هوش مصنوعی مولد ممکنه خیلی متقاعدکننده به نظر برسن، ولی گاهی اوقات اطلاعاتی که تولید میکنن کاملا اشتباهه.
    • سوگیری (Bias): این مدل‌ها بر اساس داده‌هایی که باهاشون آموزش دیدن کار میکنن. اگه اون داده‌ها (که معمولا از اینترنت گرفته میشن) شامل سوگیری‌های جنسیتی، نژادی و … باشن، خروجی مدل هم این سوگیری‌ها رو منعکس و حتی تقویت میکنه. مثلا آمازون یه ابزار استخدام مبتنی بر AI ساخته بود که ناخواسته به نفع کاندیداهای مرد عمل میکرد چون داده‌های آموزشی‌اش این سوگیری رو داشتن.
    • امکان سواستفاده: میشه از این مدل‌ها برای فعالیت‌های غیراخلاقی یا مجرمانه استفاده کرد. بعضی کاربرها سعی میکنن مدل‌ها رو «جیل‌بریک» (Jailbreak) کنن، یعنی کاری کنن که قوانین خودشون رو بشکنن و محتوای مضر یا غیرقانونی تولید کنن.
    • هزینه‌های بالا: توسعه و آموزش مدل‌های AI، به خصوص مدل‌های بزرگ، خیلی گرونه. مثلا مدیرعامل OpenAI گفته که آموزش مدل GPT-4 بیشتر از ۱۰۰ میلیون دلار هزینه داشته.
    • پیچیدگی فنی و کمبود متخصص: ساختن و نگهداری سیستم‌های AI به دانش فنی خیلی بالایی نیاز داره و تعداد متخصص‌های این حوزه نسبت به تقاضا کمه.
    • جابجایی شغلی: با خودکار شدن کارها، این نگرانی وجود داره که بعضی شغل‌ها از بین برن و این موضوع باعث نابرابری اقتصادی بشه.
    • تاثیرات زیست‌محیطی: مراکز داده‌ای که این مدل‌ها رو اجرا میکنن، مقدار زیادی انرژی و آب مصرف میکنن که روی محیط زیست تاثیر منفی داره.

    چطور میشه با این خطرات مقابله کرد؟

    • انتخاب دقیق داده‌های آموزشی: باید خیلی مراقب بود که داده‌های اولیه شامل محتوای سمی یا سوگیرانه نباشن.
    • استفاده از مدل‌های تخصصی: به جای استفاده از یه مدل عمومی، شرکت‌ها میتونن از مدل‌های کوچیک‌تر و تخصصی‌تر استفاده کنن یا یه مدل عمومی رو با داده‌های خودشون سفارشی‌سازی کنن.
    • حفظ عامل انسانی (Human in the loop): خیلی مهمه که یه انسان واقعی خروجی مدل AI رو قبل از انتشار یا استفاده نهایی، چک کنه.
    • شفافیت و حاکمیت: باید مشخص باشه که یه سیستم خودکار داره استفاده میشه و نحوه کارش توضیح داده بشه. همچنین باید ساختارهای نظارتی برای مسئولیت‌پذیری وجود داشته باشه.

    قوانین و مقررات برای هوش مصنوعی

    با فراگیر شدن AI، نگرانی‌ها در مورد شفافیت، حریم خصوصی، حق مالکیت معنوی و … هم بیشتر شده. برای همین، دولت‌ها و سازمان‌ها دارن سعی میکنن چارچوب‌هایی برای استفاده مسئولانه از AI ایجاد کنن.

    • منشور حقوق هوش مصنوعی (AI Bill of Rights): دولت آمریکا در سال ۲۰۲۲ یه سندی به اسم «طرح اولیه برای منشور حقوق هوش مصنوعی» آماده کرد. این سند پنج تا اصل اساسی داره:
      1. حق داشتن سیستم‌های ایمن و موثر.
      2. محافظت در برابر تبعیض توسط الگوریتم‌ها.
      3. محافظت در برابر سواستفاده از داده‌ها.
      4. حق دانستن اینکه یک سیستم خودکار در حال استفاده است.
      5. حق انصراف و دسترسی به یک انسان برای حل مشکلات.
    • قانون هوش مصنوعی اتحادیه اروپا (EU’s AI Act): این قانون که قراره در سال ۲۰۲۴ اجرایی بشه، یه مقررات جامع برای AI هست که با قوانین حفاظت از داده و امنیت سایبری فعلی هم هماهنگه.

    در حال حاضر بیشتر از ۶۰ کشور یا اتحادیه، استراتژی‌های ملی برای استفاده مسئولانه از AI دارن، از جمله برزیل، چین، سنگاپور، کره جنوبی و آمریکا.

    یک نگاه هنری: فیلم «A.I. Artificial Intelligence»

    حالا که با جنبه‌های علمی و فنی هوش مصنوعی آشنا شدیم، جالبه ببینیم دنیای هنر و سینما چطور به این موضوع نگاه کرده. یکی از معروف‌ترین فیلم‌ها در این زمینه، فیلم «A.I. Artificial Intelligence» ساخته استیون اسپیلبرگ در سال ۲۰۰۱ هست.

    A.I. Artificial Intelligence
    کارگرداناستیون اسپیلبرگ
    فیلمنامهاستیون اسپیلبرگ
    داستانایان واتسون
    بر اساسداستان کوتاه «اسباب‌بازی‌های فوق‌العاده تمام تابستان دوام می‌آورند» نوشته برایان آلدیس
    بازیگران اصلیهیلی جوئل آزمنت، جود لا، فرانسیس اوکانر
    بودجه۹۰ تا ۱۰۰ میلیون دلار
    فروش۲۳۵.۹ میلیون دلار

    داستان فیلم در یک نگاه:

    فیلم در قرن ۲۲ میگذره. گرمایش جهانی باعث بالا اومدن سطح دریاها شده و ربات‌های انسان‌نما به اسم «مکا» (Mecha) نقش‌های مختلفی تو جامعه دارن. دیوید (با بازی هیلی جوئل آزمنت) یه نمونه اولیه از بچه‌های مکا هست که به طور منحصر به فردی با قابلیت عشق ورزیدن برنامه‌ریزی شده. اون به خانواده‌ای داده میشه که پسرشون در کماست. وقتی پسر واقعی خانواده به طور غیرمنتظره‌ای خوب میشه و به خونه برمیگرده، رقابت و حسادت به وجود میاد و در نهایت دیوید از خونه طرد میشه. دیوید با الهام از داستان پینوکیو، سفری رو شروع میکنه تا «پری آبی» رو پیدا کنه و به یه پسر واقعی تبدیل بشه تا بتونه دوباره عشق مادرش رو به دست بیاره.

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

    پرسش و پاسخ کلاسی

    خب بچه‌ها، تا اینجا سعی کردیم یه دید کلی و جامع از هوش مصنوعی به دست بیاریم. حالا بریم سراغ چندتا سوال که ممکنه تو ذهنتون باشه.

    سوال ۱: فرق دقیق بین هوش مصنوعی، یادگیری ماشین و یادگیری عمیق چیه؟

    جواب: این سه تا مثل عروسک‌های تودرتوی روسی هستن. هوش مصنوعی (AI) وسیع‌ترین مفهومه و به طور کلی به هر تکنولوژی‌ای گفته میشه که رفتار هوشمندانه انسان رو شبیه‌سازی میکنه. یادگیری ماشین (ML) یه زیرمجموعه از AI هست که به سیستم‌ها اجازه میده به جای برنامه‌ریزی مستقیم، از روی داده‌ها یاد بگیرن. و یادگیری عمیق (Deep Learning) هم یه زیرمجموعه تخصصی‌تر از یادگیری ماشینه که از شبکه‌های عصبی با لایه‌های خیلی زیاد برای حل مسائل پیچیده‌تر استفاده میکنه.

    سوال ۲: آیا ChatGPT همون هوش مصنوعی قوی یا AGI هست که در موردش صحبت کردیم؟

    جواب: نه. با اینکه ChatGPT و مدل‌های مشابه خیلی پیشرفته هستن، اما هنوز در دسته هوش مصنوعی ضعیف یا محدود (Narrow AI) قرار میگیرن. اونها برای یه کار مشخص، یعنی پردازش و تولید زبان، آموزش دیدن و نمیتونن مثل انسان در طیف وسیعی از کارهای مختلف فکر و استدلال کنن. اونها آگاهی یا درک واقعی ندارن و فقط در تشخیص الگوهای زبانی خیلی خوب عمل میکنن.

    سوال ۳: چرا میگن «داده» برای هوش مصنوعی اینقدر مهمه؟

    جواب: چون مدل‌های یادگیری ماشین و یادگیری عمیق، اساسا با تحلیل حجم عظیمی از داده‌ها «یاد میگیرن». کیفیت و کمیت داده‌های آموزشی مستقیما روی عملکرد، دقت و حتی «بی‌طرف» بودن مدل AI تاثیر میذاره. اگه داده‌های ورودی کم، اشتباه یا سوگیرانه باشن، خروجی هوش مصنوعی هم همین مشکلات رو خواهد داشت. در واقع داده مثل کتاب درسی برای یه دانش‌آموز میمونه.

    سوال ۴: آیا الان قانونی برای کنترل هوش مصنوعی وجود داره؟

    جواب: بله، ولی هنوز در مراحل اولیه هست. در حال حاضر قوانین جامع و جهانی وجود نداره و کشورها و مناطق مختلف دارن رویکردهای متفاوتی رو در پیش میگیرن. اتحادیه اروپا با «قانون هوش مصنوعی» خودش پیشرو هست و سعی داره یه چارچوب قانونی کامل ایجاد کنه. آمریکا هم با «منشور حقوق هوش مصنوعی» قدم‌هایی برداشته. اما به طور کلی، دنیای قانون‌گذاری هنوز داره سعی میکنه خودش رو به سرعت پیشرفت تکنولوژی برسونه.

    منابع

    • [2] What is AI (Artificial Intelligence)? Definition, Types, Examples & Use Cases
    • [4] Artificial intelligence (AI) | Definition, Examples, Types, Applications, Companies, & Facts | Britannica
    • [6] What is Artificial Intelligence? – NASA
    • [8] What is AI? – Artificial Intelligence Explained – AWS
    • [10] A.I. Artificial Intelligence (2001) – IMDb
    • [1] What Is Artificial Intelligence (AI)? | IBM
    • [3] A.I. Artificial Intelligence – Wikipedia
    • [5] What is (AI) Artificial Intelligence? | Online Master of Engineering | University of Illinois Chicago
    • [7] What Is Artificial Intelligence (AI)? | Google Cloud
    • [9] What is AI (artificial intelligence)? | McKinsey
  • DNS چیست؟ راهنمای کامل سیستم نام دامنه در اینترنت

    میخوایم در مورد DNS حرف بزنیم. فکر کن اینترنت یه شهر خیلی بزرگه و تو میخوای بری خونه دوستت. آدرس خونه دوستت رو بلدی، مثلا «خیابون آزادی، کوچه شماره ۵، پلاک ۱۰». این میشه اسم دامنه، مثل www.example.com. ولی پستچی برای رسوندن نامه به این آدرس نوشتاری یه چیزی کم داره، اون به یه کد پستی دقیق احتیاج داره، یه سری عدد مثل 192.168.1.1. این عددها همون آدرس‌های IP هستن.

    حالا DNS دقیقا کار همون اداره پستی رو میکنه که آدرس‌های نوشتاری رو به کد پستی‌های عددی تبدیل میکنه. DNS مخفف Domain Name System یا سیستم نام دامنه است. به زبان ساده، دفترچه تلفن کل اینترنته. ما آدم‌ها با اسم‌ها راحت‌تریم، مثل nytimes.com یا espn.com، ولی کامپیوترها و مرورگرها با عددها، یعنی آدرس‌های IP، کار میکنن. DNS میاد این وسط و اسم‌ها رو به عددها ترجمه میکنه تا مرورگر بتونه بفهمه باید به کجا وصل بشه و صفحه مورد نظر ما رو بیاره بالا.

    هر دستگاهی که به اینترنت وصل میشه، از گوشی هوشمندت گرفته تا لپ‌تاپ و سرورهای غول‌پیکر سایت‌های فروشگاهی، یه آدرس IP منحصر به فرد داره. این آدرس برای پیدا کردن اون دستگاه تو شبکه جهانی لازمه. بدون DNS، ما مجبور بودیم یه عالمه عدد مثل 192.168.1.1 (که مربوط به پروتکل IPv4 هست) یا حتی رشته‌های پیچیده‌تر جدید مثل 2400:cb00:2048:1::c629:d7a2 (مربوط به IPv6) رو حفظ کنیم. واقعا کار سختی میشد، نه؟ پس DNS این زحمت رو از دوش ما برداشته.

    وقتی تو آدرس یه سایت رو توی مرورگرت تایپ میکنی، یه فرایندی به اسم «تفکیک DNS» یا DNS resolution اتفاق میفته. این فرایند، اسم میزبان (hostname) مثل www.example.com رو به یه آدرس IP قابل فهم برای کامپیوتر، مثل 192.168.1.1، تبدیل میکنه. کل این ماجرا پشت صحنه اتفاق میفته و تو به عنوان کاربر، به جز وارد کردن آدرس سایت، کار دیگه‌ای انجام نمیدی.

    سفر یک درخواست DNS: از کامپیوتر تو تا قلب اینترنت

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

    1. شروع ماجرا از مرورگر تو: تو آدرس example.com رو توی مرورگرت میزنی و اینتر رو فشار میدی. این درخواست اول از همه به سمت یه سرور خاص به اسم DNS Recursive Resolver میره. این ریزالور معمولا توسط شرکت خدمات اینترنتی تو (ISP) فراهم میشه.
    2. صحبت ریزالور با سرور ریشه (Root Server): ریزالور مثل یه کارآگاه عمل میکنه. اول از همه میره سراغ سرور ریشه یا Root Nameserver. این سرورهای ریشه، پدر بزرگ‌های کل سیستم DNS هستن و بالای هرم قرار دارن. سرور ریشه آدرس کامل example.com رو نمیدونه، ولی میتونه کارآگاه ما رو راهنمایی کنه. بهش میگه: «من نمیدونم example.com کجاست، ولی میدونم سرورهایی که دامنه‌های .com رو مدیریت میکنن کجان. برو از اونا بپرس». و آدرس سرور TLD مربوط به .com رو بهش میده.
    3. مراجعه به سرور دامنه سطح بالا (TLD Server): حالا ریزالور میره سراغ سرور دامنه سطح بالا یا Top-Level Domain (TLD) Nameserver. این سرورها مسئول دامنه‌هایی مثل .com، .org، .net و غیره هستن. ریزالور از سرور .com میپرسه: «آدرس example.com رو داری؟» سرور TLD هم جواب میده: «نه دقیقا، ولی میدونم کدوم سرور مسئول اصلی دامنه‌های example.com هست. این آدرسش، برو از خودش بپرس». این سرور مسئول، همون سرور نام معتبر یا Authoritative Nameserver هست.
    4. رسیدن به منبع اصلی؛ سرور نام معتبر (Authoritative Nameserver): بالاخره ریزالور به آخرین ایستگاه میرسه. سرور نام معتبر، سروریه که تمام اطلاعات و رکوردهای مربوط به دامنه example.com رو توی خودش ذخیره کرده. این سرور دیگه کسی رو پاس نمیده و جواب نهایی رو داره. ریزالور ازش آدرس IP دامنه example.com رو میپرسه و این سرور، آدرس IP دقیق، مثلا 93.184.216.34، رو به ریزالور میده.
    5. بازگشت پاسخ به ریزالور: حالا که ریزالور جواب رو پیدا کرده، یعنی آدرس IP رو به دست آورده، اون رو به کامپیوتر تو برمیگردونه.
    6. تحویل آدرس IP به مرورگر: کامپیوتر تو (به طور دقیق‌تر، سیستم عاملت) این آدرس IP رو از ریزالور میگیره و به مرورگری که درخواست رو شروع کرده بود، تحویل میده.
    7. ارسال درخواست HTTP به سرور سایت: حالا مرورگر دیگه اسم دامنه رو بیخیال شده و آدرس IP رو داره. یه درخواست HTTP مستقیم به اون آدرس IP میفرسته و میگه: «سلام، لطفا محتوای صفحه example.com رو برای من بفرست».
    8. دریافت محتوای سایت: سروری که سایت example.com روی اون قرار داره (و حالا ما با آدرس IP بهش وصلیم)، محتوای صفحه وب رو برای مرورگر تو میفرسته و تو میتونی سایت رو ببینی.

    این هشت مرحله در کسری از ثانیه اتفاق میفته. البته اگه اطلاعات کش شده باشن، خیلی از این مراحل حذف میشن و سرعت کار بالاتر میره که در ادامه در موردش حرف میزنیم.

    بازیگران اصلی صحنه DNS چه کسانی هستن؟

    توی سفر بالا با چند تا اسم آشنا شدیم. بیا یه بار دیگه دقیق‌تر ببینیم هر کدوم چیکار میکنن. چهار نوع سرور اصلی توی این فرایند دخیل هستن:

    • DNS Recursive Resolver (تفکیک کننده بازگشتی): این اولین ایستگاه درخواست توئه. کارش اینه که درخواست رو از کلاینت (کامپیوتر تو) بگیره و مثل یه کارآگاه سمج، اینقدر بگرده تا جواب نهایی (آدرس IP) رو پیدا کنه. این سرور خودش جواب رو نمیدونه، ولی بلده از کی بپرسه. معمولا ISP تو این سرور رو در اختیارت میذاره.
    • Root Nameserver (سرور نام ریشه): این سرورها در راس هرم DNS قرار دارن. کارشون اینه که درخواست‌ها رو به سمت سرور TLD درست هدایت کنن. در کل دنیا ۱۳ گروه سرور ریشه وجود داره که برای پایداری اینترنت حیاتی هستن.
    • TLD Nameserver (سرور نام دامنه سطح بالا): این سرورها مسئول یه بخش خاص از دامنه‌ها هستن. مثلا یه سرور TLD برای همه دامنه‌های .com وجود داره، یکی برای همه دامنه‌های .org و همینطور الی آخر. کار این سرورها اینه که درخواست رو به سمت سرور نام معتبر (Authoritative) دامنه مورد نظر هدایت کنن.
    • Authoritative Nameserver (سرور نام معتبر): این آخرین حلقه زنجیره است. این سرور اطلاعات کامل و نهایی رکوردهای DNS یه دامنه خاص رو داره. وقتی درخواست به اینجا میرسه، جواب قطعی پیدا میشه. این سرور دیگه نیاز نداره از کس دیگه‌ای سوال بپرسه و خودش «منبع حقیقت» برای اون دامنه است.

    یه نکته مهم: گاهی اوقات ما دنبال آدرس یه زیر دامنه هستیم، مثلا blog.cloudflare.com. در این حالت، یه سرور نام دیگه هم به این زنجیره اضافه میشه که بعد از سرور نام معتبر اصلی قرار میگیره و مسئول ذخیره رکوردهای اون زیر دامنه خاص (مثلا رکورد CNAME) هست.

    تفاوت بین سرویس‌های DNS

    شاید اسم‌هایی مثل Google DNS یا OpenDNS به گوشت خورده باشه. این‌ها سرویس‌های DNS Recursive Resolver عمومی هستن. یعنی شرکت‌هایی مثل گوگل یا سیسکو (صاحب OpenDNS) یه سری سرور ریزالور قدرتمند و سریع در سراسر دنیا راه انداختن که هر کسی میتونه ازشون استفاده کنه. مثلا آدرس DNS گوگل 8.8.8.8 هست. تو میتونی تنظیمات شبکه کامپیوترت رو طوری تغییر بدی که به جای استفاده از ریزالور ISP، از این سرویس‌ها استفاده کنی.

    اما این سرویس‌ها با کاری که شرکتی مثل Cloudflare انجام میده، یه فرق اساسی دارن. کلادفلر علاوه بر ارائه ریزالور عمومی، خودش میزبان بخشی از زیرساخت‌های اصلی اینترنت هم هست. مثلا کلادفلر در میزبانی شبکه F-root که یکی از همون سرورهای ریشه اصلی اینترنه، نقش داره. این سرورهای ریشه روزانه میلیاردها درخواست اینترنتی رو مدیریت میکنن.

    انواع درخواست‌ها (Query) در دنیای DNS

    توی فرایند پیدا کردن آدرس IP، سه نوع درخواست مختلف ممکنه رد و بدل بشه:

    1. Recursive Query (درخواست بازگشتی): این همون درخواستیه که کامپیوتر تو به ریزالور میفرسته. معنیش اینه: «لطفا این آدرس رو برام پیدا کن و جواب کامل رو بهم بده. یا بگو همچین آدرسی وجود نداره. خودت همه کارها رو بکن و من منتظر جواب نهایی میمونم».
    2. Iterative Query (درخواست تکراری): این نوع درخواست بین سرورهای DNS رد و بدل میشه. مثلا وقتی ریزالور از سرور ریشه سوال میپرسه، یه درخواست تکراری میفرسته. سرور ریشه با بهترین جوابی که داره (آدرس سرور TLD) پاسخ میده و میگه: «من جواب کامل رو ندارم، ولی برو از این یکی بپرس». ریزالور این فرایند رو اینقدر تکرار میکنه تا به جواب برسه.
    3. Non-Recursive Query (درخواست غیر بازگشتی): این درخواست زمانی اتفاق میفته که سرور DNS جواب رو از قبل توی حافظه خودش (کش) داشته باشه. در این حالت دیگه نیازی به پرس و جو از بقیه سرورها نیست و مستقیم جواب رو میده.

    کش کردن (Caching): راز سرعت بالای DNS

    همونطور که گفتیم، اگه قرار بود برای هر بار باز کردن یه سایت، تمام اون ۸ مرحله طی بشه، سرعت اینترنت خیلی پایین میومد. اینجا مفهومی به اسم کش کردن وارد بازی میشه. کش کردن یعنی ذخیره موقت داده‌ها در یه جای نزدیک‌تر به کاربر تا دفعه بعدی که به اون داده‌ها نیاز بود، سریع‌تر بهشون دسترسی پیدا کنیم. اطلاعات DNS در چند جا میتونن کش بشن:

    • کش مرورگر (Browser Caching): مرورگرهای مدرن، خودشون یه حافظه پنهان برای رکوردهای DNS دارن. وقتی یه آدرس رو وارد میکنی، مرورگر اول کش خودش رو نگاه میکنه. اگه آدرس IP اونجا بود، دیگه هیچ درخواستی به بیرون نمیفرسته و مستقیم به همون IP وصل میشه. این سریع‌ترین حالت ممکنه. مثلا در مرورگر کروم میتونی با رفتن به آدرس chrome://net-internals/#dns وضعیت کش DNS مرورگرت رو ببینی.
    • کش سیستم عامل (Operating System Caching): اگه جواب توی کش مرورگر نبود، درخواست به سیستم عامل (مثلا ویندوز یا مک) میرسه. سیستم عامل هم برای خودش یه کش DNS داره که بهش میگن Stub Resolver یا DNS Client. اونجا رو هم چک میکنه. اگه جواب بود، به مرورگر برمیگردونه.
    • کش ریزالور (Recursive Resolver Caching): اگه توی کامپیوتر تو هم جوابی پیدا نشد، درخواست به سرور Recursive Resolver (همونی که معمولا مال ISP هست) فرستاده میشه. این سرور هم یه کش خیلی بزرگ و قدرتمند داره. وقتی یه بار آدرس example.com رو پیدا میکنه، اون رو توی کش خودش ذخیره میکنه. دفعه بعدی که تو یا هر کس دیگه‌ای که از همون ISP سرویس میگیره، این آدرس رو درخواست کنه، ریزالور جواب رو از کش خودش میده و دیگه نیازی به پرس و جو از سرورهای ریشه و TLD نیست.

    مدت زمان اعتبار کش چقدره؟

    هر رکورد DNS یه مقداری به اسم TTL یا Time-to-Live داره. این مقدار که به ثانیه است، مشخص میکنه که اطلاعات اون رکورد تا چه مدت میتونه توی کش بمونه. مثلا اگه TTL یه رکورد ۳۶۰۰ ثانیه باشه، یعنی بعد از یک ساعت، کش منقضی میشه و دفعه بعدی که اون آدرس درخواست بشه، سرورها باید دوباره کل فرایند پرس و جو رو از اول انجام بدن تا اطلاعات به‌روز رو بگیرن. این TTL توسط مدیر اون دامنه تنظیم میشه.

    نگاهی عمیق‌تر به تاریخچه و ساختار DNS

    ایده استفاده از یه اسم ساده به جای آدرس عددی، به دوران آرپانت (ARPANET)، یعنی جد بزرگ اینترنت امروزی، برمیگرده. اون موقع موسسه تحقیقاتی استنفورد (SRI) یه فایل متنی به اسم HOSTS.TXT داشت که اسم‌ها رو به آدرس‌های عددی کامپیوترهای شبکه نگاشت میکرد. این کار به صورت دستی انجام میشد. یعنی هر وقت یه کامپیوتر جدید به شبکه اضافه میشد، باید با مرکز اطلاعات شبکه (NIC) که توسط الیزابت فینلر مدیریت میشد، تماس میگرفتن تا اسم و آدرسش رو به صورت دستی به این فایل اضافه کنن.

    با بزرگ شدن شبکه در اوایل دهه ۱۹۸۰، مدیریت این فایل متمرکز خیلی کند و سخت شد. اینجا بود که نیاز به یه سیستم خودکار احساس شد. پل موکاپتریس (Paul Mockapetris) در سال ۱۹۸۳ در دانشگاه کالیفرниای جنوبی، سیستم نام دامنه یا DNS رو ابداع کرد. مشخصات اولیه این سیستم در نوامبر ۱۹۸۳ در مستندهایی به اسم RFC 882 و RFC 883 منتشر شد و بعدا در نوامبر ۱۹۸۷ با RFC 1034 و RFC 1035 جایگزین و تکمیل شد. این سیستم از همون ابتدا یعنی سال ۱۹۸۵، یکی از اجزای حیاتی اینترنت بوده.

    اولین پیاده‌سازی سرور نام روی سیستم عامل یونیکس هم توسط چهار تا دانشجو از دانشگاه برکلی در سال ۱۹۸۴ نوشته شد که به BIND (Berkeley Internet Name Domain) معروف شد. BIND هنوز هم یکی از پراستفاده‌ترین نرم‌افزارهای سرور DNS در دنیاست.

    ساختار درختی و سلسله مراتبی DNS

    فضای نام دامنه یه ساختار درختی داره. هر گره یا برگ توی این درخت یه «برچسب» (Label) و صفر یا چند «رکورد منبع» (Resource Record) داره. اسم کامل دامنه از به هم چسبیدن این برچسب‌ها با نقطه به دست میاد.

    • ریشه (Root): بالای این درخت یه ریشه نامرئی وجود داره که با یه نقطه خالی «.» نشون داده میشه.
    • دامنه‌های سطح بالا (TLDs): اولین سطح زیر ریشه، TLD ها هستن مثل com، org، ir و… .
    • دامنه‌های سطح دوم: این‌ها دامنه‌هایی هستن که ما ثبت میکنیم، مثل example در example.com.
    • زیردامنه‌ها (Subdomains): هر چیزی که سمت چپ دامنه سطح دوم بیاد، زیردامنه حساب میشه. مثلا www در www.example.com یه زیردامنه از example.com هست. این ساختار درختی میتونه تا ۱۲۷ سطح عمق داشته باشه.

    قوانین نامگذاری دامنه‌ها:

    • هر برچسب (قسمت بین دو نقطه) میتونه بین ۰ تا ۶۳ کاراکتر داشته باشه.
    • اسم کامل دامنه نباید از ۲۵۳ کاراکتر بیشتر بشه.
    • کاراکترهای مجاز در اسم دامنه‌ها زیرمجموعه‌ای از کاراکترهای ASCII هستن: حروف a تا z (کوچک و بزرگ)، اعداد ۰ تا ۹ و خط تیره (-). به این قانون LDH (Letters, Digits, Hyphen) هم میگن.
    • اسم دامنه‌ها به حروف کوچک و بزرگ حساس نیستن (case-insensitive).
    • برچسب‌ها نمیتونن با خط تیره شروع یا تموم بشن.
    • برای پشتیبانی از زبان‌های دیگه مثل فارسی، سیستمی به اسم IDNA (Internationalizing Domain Names in Applications) به وجود اومد که رشته‌های یونیکد رو با استفاده از الگوریتمی به اسم Punycode به کاراکترهای مجاز DNS تبدیل میکنه.

    انواع رکوردهای DNS

    پایگاه داده DNS انواع مختلفی از رکوردها رو ذخیره میکنه که هر کدوم کاربرد خاص خودشون رو دارن. مهم‌ترین‌هاشون این‌ها هستن:

    نوع رکوردنام کاملکاربرد
    AAddress Recordیه اسم دامنه رو به یه آدرس IPv4 وصل میکنه.
    AAAAIPv6 Address Recordیه اسم دامنه رو به یه آدرس IPv6 وصل میکنه.
    CNAMECanonical Name Recordیه اسم دامنه رو به یه اسم دامنه دیگه ارجاع میده (مثل یه اسم مستعار).
    MXMail Exchange Recordمشخص میکنه کدوم سرور ایمیل مسئول دریافت ایمیل‌های یه دامنه است.
    NSName Server Recordسرورهای نام معتبر (Authoritative) یه دامنه رو مشخص میکنه.
    TXTText Recordاجازه میده یه متن دلخواه رو به دامنه مرتبط کنی. برای کارهای تاییدی و امنیتی زیاد استفاده میشه.
    SOAStart of Authority Recordاطلاعات مهم مدیریتی در مورد یه ناحیه (Zone) DNS رو نگهداری میکنه.
    SRVService Recordاطلاعات مربوط به یه سرویس خاص (مثل پروتکل‌های چت) رو در یه دامنه مشخص میکنه.
    PTRPointer Recordبرعکس رکورد A کار میکنه. یه آدرس IP رو به یه اسم دامنه وصل میکنه. برای Reverse DNS Lookup استفاده میشه.
    CAACertification Authority Authorizationمشخص میکنه کدوم مرکز صدور گواهی (CA) مجازه برای یه دامنه گواهی SSL صادر کنه.

    وقتی توی یه فایل تنظیمات DNS (که بهش Zone File میگن) علامتی مثل @ میبینی، معمولا به معنی خود دامنه اصلی (Origin) هست. مثلا اگه فایل برای mydomain.com باشه، @ همون mydomain.com رو نمایندگی میکنه.

    DNS Propagation یا انتشار DNS چیست؟

    این اصطلاحیه که وقتی تغییراتی توی رکوردهای DNS دامنه خودت میدی، زیاد میشنوی. DNS Propagation به زمانی گفته میشه که طول میکشه تا تغییرات جدیدی که اعمال کردی، در تمام سرورهای DNS در سراسر جهان منتشر و به‌روز بشه.

    در واقع از نظر فنی، DNS «منتشر» نمیشه. چیزی که اتفاق میفته اینه که سرورهای DNS در سراسر دنیا، اطلاعات قدیمی رو تا زمانی که TTL اون‌ها تموم نشده، توی کش خودشون نگه میدارن. پس وقتی تو یه تغییری میدی، باید صبر کنی تا کش سرورهای مختلف در سراسر دنیا منقضی بشه و اطلاعات جدید رو از سرور معتبر تو دریافت کنن. این فرایند میتونه از چند دقیقه تا ۴۸ یا حتی ۷۲ ساعت طول بکشه.

    چرا انتشار DNS اینقدر طول میکشه؟

    • تنظیمات TTL: اگه TTL رکوردهات رو بالا تنظیم کرده باشی (مثلا ۲۴ ساعت)، سرورها تا ۲۴ ساعت اطلاعات قدیمی رو نگه میدارن و تغییراتت دیرتر دیده میشه. یه راه برای سریع‌تر کردن این فرایند اینه که چند روز قبل از اعمال تغییرات مهم، TTL رو به یه مقدار خیلی کم (مثلا ۵ دقیقه) کاهش بدی.
    • کش کردن ISP ها: شرکت‌های اینترنتی (ISP) هم برای افزایش سرعت، نتایج DNS رو به شدت کش میکنن. گاهی اوقات بعضی از ISP ها حتی به TTL تعیین شده توسط تو هم احترام نمیذارن و اطلاعات رو بیشتر از زمان مشخص شده نگه میدارن.
    • ثبت‌کننده دامنه (Registrar): اگه بخوای سرورهای نام (NS) دامنه خودت رو عوض کنی (مثلا وقتی هاستت رو عوض میکنی)، این تغییر باید در سطح سرور TLD (مثلا سرور .com) هم اعمال بشه که این خودش میتونه باعث تاخیر بشه.

    برای چک کردن وضعیت انتشار DNS دامنه خودت، میتونی از ابزارهای آنلاینی مثل whatsmydns.net استفاده کنی. این سایت‌ها از سرورهای مختلفی در سراسر دنیا به دامنه تو درخواست میفرستن و نشون میدن که هر منطقه جغرافیایی، کدوم آدرس IP رو برای دامنه تو میبینه.

    امنیت و حریم خصوصی در DNS

    سیستم DNS در ابتدا بدون در نظر گرفتن مسائل امنیتی طراحی شده بود. چون اینترنت اولیه یه شبکه کوچیک و قابل اعتماد بود. اما با عمومی شدن اینترنت، مشکلات امنیتی هم خودشون رو نشون دادن.

    حملات رایج در DNS

    • DNS Cache Poisoning (مسموم کردن کش DNS): در این حمله، هکر داده‌های جعلی رو به کش یه سرور Recursive Resolver تزریق میکنه. مثلا آدرس IP سایت بانک رو با آدرس IP سرور خودش عوض میکنه. در نتیجه، کاربرانی که از اون ریزالور استفاده میکنن، وقتی آدرس سایت بانک رو وارد میکنن، به یه سایت جعلی هدایت میشن.
    • DNS Hijacking (ربودن DNS): در این حمله، هکر تنظیمات DNS کاربر رو تغییر میده تا درخواست‌های DNS به جای سرورهای معتبر، به سرورهای مخرب تحت کنترل هکر ارسال بشن.
    • DNS Tunneling (تونل‌زنی DNS): این یه تکنیک پیشرفته است که در اون، هکرها از پروتکل DNS برای انتقال داده‌های دیگه (که ربطی به DNS ندارن) استفاده میکنن. چون ترافیک DNS معمولا توسط فایروال‌ها و سیستم‌های امنیتی به عنوان ترافیک مجاز شناخته میشه، هکرها میتونن از این کانال برای فرمان دادن به بدافزارها در یه شبکه داخلی یا خارج کردن اطلاعات حساس (Data Exfiltration) استفاده کنن.


    راهکارهای افزایش امنیت و حریم خصوصی

    برای مقابله با این تهدیدات، راهکارهای مختلفی توسعه داده شده:

    • DNSSEC (Domain Name System Security Extensions): این یه افزونه برای DNS هست که با استفاده از امضای دیجیتال، از صحت و تمامیت داده‌های DNS محافظت میکنه. DNSSEC مطمئن میشه که جوابی که از سرور DNS میگیری، در مسیر دستکاری نشده و واقعا از طرف منبع معتبر ارسال شده.
    • DNS over TLS (DoT): در این روش، ارتباط بین کامپیوتر تو و سرور DNS با استفاده از پروتکل TLS (همون پروتکلی که برای HTTPS استفاده میشه) رمزنگاری میشه. این کار جلوی شنود و دستکاری درخواست‌ها و پاسخ‌های DNS رو میگیره. سرورهای DoT معمولا روی پورت ۸۵۳ کار میکنن.
    • DNS over HTTPS (DoH): این روش هم مثل DoT، ترافیک DNS رو رمزنگاری میکنه، با این تفاوت که درخواست‌های DNS رو در قالب ترافیک HTTPS قرار میده و از پورت ۴۴۳ استفاده میکنه. چون ترافیک HTTPS خیلی رایجه، تشخیص و مسدود کردن ترافیک DoH برای مدیران شبکه سخت‌تره.
    • DNSCrypt: این هم یه پروتکل دیگه برای رمزنگاری ترافیک DNS هست که قبل از DoT و DoH وجود داشت.

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

    یه نکته جالب: وقتی DNS معنی دیگه‌ای میده!

    حواست باشه که مخفف DNS فقط برای سیستم نام دامنه استفاده نمیشه. در دنیای پزشکی و توانبخشی، DNS مخفف Dynamic Neuromuscular Stabilization یا تثبیت دینامیک عصبی-عضلانی هم هست. این یه رویکرد درمانی و توانبخشیه که بر اساس حرکت‌شناسی تکاملی، یعنی جنبه‌های عصبی و فیزیولوژیکی رشد کودک، بنا شده. هدفش اینه که الگوهای حرکتی بهینه و تکاملی رو در بدن بازسازی کنه تا فشار روی بافت‌ها کم و عملکرد به حداکثر برسه. پس اگه جایی این مخفف رو دیدی، حواست باشه که ممکنه منظورشون اینترنت و دامنه نباشه!

    پرسش و پاسخ‌های متداول

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

    سوال: DNS دقیقا چیه و چیکار میکنه؟ اگه DNS من روی ISP تنظیم شده باشه، یعنی ISP میتونه ببینه من به چه سایت‌هایی میرم؟

    جواب: همونطور که گفتیم، DNS مثل دفترچه تلفن اینترنته و اسم سایت‌ها رو به آدرس عددی (IP) تبدیل میکنه. بله، وقتی از سرور DNS پیش‌فرض ISP خودت استفاده میکنی، اون‌ها میتونن تمام درخواست‌های DNS تو رو ببینن. این یعنی میدونن که تو تلاش کردی به چه دامنه‌هایی دسترسی پیدا کنی.

    سوال: اگه DNS رو به چیزی غیر از ISP تغییر بدم، آیا ISP دیگه نمیتونه فعالیت‌های من رو ببینه؟

    جواب: اگه DNS خودت رو مثلا به Google DNS (8.8.8.8) یا Cloudflare DNS (1.1.1.1) تغییر بدی، ISP تو دیگه نمیتونه لیست درخواست‌های DNS تو رو ببینه. به جای ISP، حالا اون شرکت ارائه‌دهنده DNS (مثلا گوگل یا کلادفلر) میتونه این درخواست‌ها رو ببینه. البته این کار باعث نمیشه کل فعالیت اینترنتی تو از دید ISP مخفی بشه. اون‌ها هنوز هم میتونن ببینن که تو به کدوم آدرس‌های IP متصل میشی، حتی اگه ندونن اون IP ها مال چه دامنه‌ای هستن (البته فهمیدنش کار سختی نیست). برای رمزنگاری کامل ترافیک، باید از سرویس‌هایی مثل VPN استفاده کنی.

    سوال: بهترین DNS برای حفظ حریم خصوصی و ناشناس بودن کدومه؟

    جواب: این سوال جواب قطعی نداره و به تعریف تو از «بهترین» بستگی داره. سرویس‌هایی وجود دارن که تمرکزشون روی حریم خصوصیه و ادعا میکنن که هیچ لاگی از درخواست‌های تو ذخیره نمیکنن. خیلی از این سرویس‌ها از پروتکل‌های رمزنگاری شده مثل DoH و DoT هم پشتیبانی میکنن. موقع انتخاب، باید به سیاست‌های حفظ حریم خصوصی (Privacy Policy) اون سرویس دقت کنی. سرویس‌هایی مثل کلادفلر (1.1.1.1) و Quad9 (9.9.9.9) به عنوان گزینه‌های متمرکز بر حریم خصوصی شناخته میشن.

    سوال: آیا تغییر دادن DNS خطرناکه؟

    جواب: نه، تغییر دادن DNS به خودی خود هیچ خطر ذاتی نداره. فقط باید مطمئن بشی که از یه ارائه‌دهنده DNS معتبر و قابل اعتماد استفاده میکنی. استفاده از یه سرور DNS نامعتبر میتونه تو رو در معرض حملاتی مثل هدایت شدن به سایت‌های مخرب قرار بده.

    سوال: DNS خصوصی (Private DNS) امنیت بیشتری داره؟

    جواب: بله، DNS خصوصی میتونه امنیت بیشتری نسبت به گزینه‌های دیگه ارائه بده. گزینه‌هایی مثل DNS over TLS یا DNS over HTTPS که در تنظیمات گوشی‌های اندرویدی جدید به اسم «Private DNS» وجود دارن، با رمزنگاری کردن درخواست‌های تو، امنیت و حریم خصوصی رو افزایش میدن.

    سوال: سرویس DNS روی گوشی من (مثلا آیفون) حجم زیادی از اینترنت مصرف کرده، چرا؟

    جواب: مصرف بالای داده توسط DNS Services میتونه دلایل مختلفی داشته باشه. ممکنه یکی از اپلیکیشن‌های روی گوشیت در پس‌زمینه به طور مداوم در حال ارسال تعداد زیادی درخواست DNS باشه. این میتونه نشانه فعالیت یه برنامه مخرب، یه برنامه با تنظیمات اشتباه یا حتی یه باگ باشه. بررسی برنامه‌هایی که اخیرا نصب کردی و کنترل دسترسی اون‌ها به اینترنت در پس‌زمینه میتونه کمک‌کننده باشه.

    سوال: چطوری میتونم DNS کامپیوتر خودم رو پیدا کنم؟

    جواب: روی ویندوز، میتونی Command Prompt رو باز کنی، دستور ipconfig /all رو تایپ کنی و اینتر بزنی. در خروجی، جلوی عبارت DNS Servers میتونی آدرس سرور یا سرورهایی که کامپیوترت ازشون استفاده میکنه رو ببینی.

    منابع

    • [2] DNS Propagation Checker – Global DNS Testing Tool
    • [4] domain name system – What’s the meaning of ‘@’ in a DNS zone file? – Server Fault
    • [6] What is DNS Services and why does it use … – Apple Community
    • [8] What Is DNS Tunneling? [+ Examples & Protection Tips] – Palo Alto Networks
    • [10] What is DNS? – Columbus Chiropractor & Rehabilitation Center
    • [1] What is DNS? | How DNS works | Cloudflare
    • [3] Understanding what is DNS : r/dns
    • [5] What is DNS? – Introduction to DNS – AWS
    • [7] Domain Name System – Wikipedia
    • [9] What Is Domain Name System (DNS)? | Fortinet