شبکه‌های خصوصی مجازی در زیرساخت‌های متصل به خطوط ارتباطی ۱۰ و ۱۰۰ گیگابیت بر ثانیه با یک مانع فیزیکی پایه‌ای روبه‌رو هستند: سقف فرکانس کاری پردازنده‌های تک‌هسته‌ای. اگرچه کارت‌های شبکه امروزی با تکیه بر صف‌های سخت‌افزاری متعدد می‌توانند میلیون‌ها بسته داده را در هر ثانیه دریافت کنند، اما فرایند رمزنگاری و احراز اصالت بایت به بایت داده‌ها نیازمند محاسبات سنگین ریاضی است. در سرورهای متداول، یک هسته پردازشی هنگام اجرای الگوریتم ChaCha20-Poly1305 یا AES-GCM در پهنای باند بین ۱.۵ تا ۲.۵ گیگابیت بر ثانیه به مرز اشباع کامل می‌رسد.

معماری‌های سنتی فعال در فضای کاربری (مانند OpenVPN مبتنی بر دستگاه مجازی TUN) به دلیل جابه‌جایی مداوم بافت پردازشی میان هسته سیستم‌عامل و فضای کاربر، کپی مکرر بافرهای حافظه و قفل‌های متوالی در حلقه‌های تک‌رشته‌ای، این افت کارایی را تشدید می‌کنند.

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

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

هنگامی که برنامه‌ای داده‌های خود را از طریق رابط شبکه مجازی ارسال می‌کند، بسته وارد تابع ارسال داده هسته سیستم‌عامل (ndo_start_xmit) می‌شود. چنانچه وظایف بدون سازوکار کنترلی میان چند هسته توزیع گردند، اختلال ناگواری در شبکه به نام جابه‌جایی توالی بسته‌ها (Packet Reordering) رخ می‌دهد:

آسیب پردازش موازی نامنظم:
هسته ۰: رمزنگاری بسته ۱ (۱۴۲۰ بایت) ======> پایان در t = ۱۲μs -> خروج به عنوان دومین بسته (اشتباه!)
هسته ۱: رمزنگاری بسته ۲ (۶۴ بایت)   ===> پایان در t = ۳μs  -> خروج به عنوان اولین بسته (اشتباه!)

نامنظم شدن ترتیب بسته‌ها پیامدهای فنی منفی به دنبال دارد:

  • افت عملکرد پروتکل TCP: دریافت بسته‌های نامنظم موجب تولید پیام‌های تایید تکراری (Duplicate ACK) می‌شود و کنترل تراکم TCP با فرض مفقود شدن بسته‌ها، پنجره تبادل داده را نصف می‌کند.
  • اختلال در زمان‌سنج‌های QUIC: پروتکل QUIC جابه‌جایی شدید ترتیب را نشانه‌ای از تراکم بحرانی تلقی کرده و الگوریتم‌های بازیابی داده را مختل می‌سازد.
  • حذف بسته توسط پنجره ضدبازپخش: پنجره ضدبازپخش ۲۰۴۸ تایی در پروتکل، بسته‌هایی را که با تاخیر غیرعادی خارج از بازه دریافت شوند دور می‌اندازد.

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

معماری padata لینوکس و مرتب‌سازی داده‌ها در هسته

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

جریان رمزنگاری چند‌هسته‌ای در WireGuard:

[ورود بسته از رابط مجازی TUN]
         |
         v
+-------------------------------------------------------+
| هماهنگ‌کننده: تخصیص شناسه ترتیبی فزاینده (Seq ID)       |
+-------------------------------------------------------+
         |
         +-------------------+-------------------+
         |                   |                   |
         v                   v                   v
   [هسته پردازشی ۰]     [هسته پردازشی ۱]    [هسته پردازشی N]
  ChaCha20-Poly1305   ChaCha20-Poly1305   ChaCha20-Poly1305
   رمزنگاری موازی      رمزنگاری موازی      رمزنگاری موازی
         |                   |                   |
         +-------------------+-------------------+
         |
         v
+-------------------------------------------------------+
| بافر حلقه‌ای padata: مرتب‌سازی دقیق داده‌ها بر اساس Seq ID|
+-------------------------------------------------------+
         |
         v
[ارسال مرتب به سوکت خروجی شبکه (NAPI / qdisc)]

این فرایند در چهار گام هماهنگ اجرا می‌شود:

۱. تخصیص شناسه توالی: به محض ورود بسته به تونل، یک شناسه ترتیبی ۶۴ بیتی فزاینده به آن داده می‌شود. ۲. توزیع کار روی هسته‌ها: بافر بسته به صف‌های کاری هسته‌های غیرمشغول تحویل داده می‌شود تا پردازش ChaCha20 و محاسبه Poly1305 انجام شود. ۳. بافر مرتب‌سازی مجدد: پس از پایان محاسبه هر هسته، بسته وارد صف padata می‌شود. حتی اگر هسته ۱ (بسته کوچک ۶۴ بایتی) زودتر از هسته ۰ (بسته کامل ۱۴۲۰ بایتی) کار را تمام کند، بسته ۲ تا رسیدن بسته ۱ نگه داشته می‌شود. ۴. ارسال ترتیبی: بسته‌ها به همان ترتیبی که وارد شده بودند از بافر خارج شده و به کارت شبکه هدایت می‌گردند.

این شیوه اجازه می‌دهد سرورهای ۶۴ هسته‌ای ظرفیت پردازش را به صورت متناسب گسترش دهند و به پهنای باندی بین ۴۰ تا ۸۰ گیگابیت بر ثانیه بدون بی‌نظمی در داده‌ها دست یابند.

بافرهای حلقه‌ای بدون قفل و بهینه‌سازی خطوط کش

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

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

  • صف‌های مجزا برای هر اتصال و پردازنده: هر هسته با بخش‌های حافظه اختصاصی خود کار می‌کند و تداخلی با سایر هسته‌ها ندارد.
  • انتقال نشانی حافظه به جای کپی فیزیکی: به جای جابه‌جایی بایت‌های داده، تنها نشانی نشانگرها در بافرهای حلقه‌ای بدون قفل دست‌به‌دست می‌شود.
  • ترازسازی با خطوط حافظه کش: ساختارهای کلیدی در مرزهای ۶۴ بایتی کش L1 مرتب می‌شوند (____cacheline_aligned) تا از اتلاف منابع ناشی از اشتراک کاذب جلوگیری شود.
مولفه معماری OpenVPN (فضای کاربری) IPsec (چارچوب xfrm هسته) WireGuard (هسته لینوکس + padata)
بستر اجرا برنامه فضای کاربر زیرسیستم شبکه هسته ماژول سبک هسته
دفعات کپی بسته ۲ تا ۴ بار کپی حافظه ۱ تا ۲ بار جابه‌جایی نشانی بدون کپی
مقیاس‌پذیری چند‌هسته‌ای محدود به تک‌رشته وابسته به لایه‌های کریپتو موازی‌سازی خودکار با padata
حفظ ترتیب بسته‌ها طبیعی (تک‌رشته‌ای) صف‌های پیچیده tasklet مرتب‌سازی دقیق و قطعی
مصرف منابع سخت‌افزاری بالا (تخصیص مداوم حافظه) متوسط بسیار کم (بافرهای ثابت)

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

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

هدایت بسته‌های ورودی (RSS و RPS)

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

# بررسی صف‌های سخت‌افزاری در دسترس
ethtool -l eth0

# اختصاص وقفه‌های سخت‌افزاری به هسته‌های فیزیکی مشخص
systemctl stop irqbalance
set_irq_affinity -x 0-7 eth0

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

# توزیع پردازش صف rx-0 میان ۸ هسته اول (ماسک 0xff)
echo "ff" > /sys/class/net/eth0/queues/rx-0/rps_cpus

هدایت بسته‌های خروجی (XPS)

ویژگی XPS صف‌های ارسال را به هسته‌های خاص نگاشت می‌کند تا تداخل قفل سوکت‌ها کاهش یابد:

# نگاشت صف tx-0 به هسته‌های ۰ تا ۳ (ماسک 0x0f)
echo "0f" > /sys/class/net/eth0/queues/tx-0/xps_cpus

تنظیم بافرهای سیستم

برای پیشگیری از افت بسته در اوج مصرف مقطعی:

# افزایش ظرفیت صف دریافت تجهیزات شبکه
sysctl -w net.core.netdev_max_backlog=10000

# ارتقای حجم بافرهای سوکت UDP
sysctl -w net.core.rmem_max=67108864
sysctl -w net.core.wmem_max=67108864

مدیریت هوشمند پردازش چند‌هسته‌ای در بستر RiceGuard

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

مجموعه VPNRice اصول موازی‌سازی هسته را در لایه اختصاصی RiceGuard به کار بسته است:

  • تخصیص مبتنی بر معماری NUMA: سامانه ساختار پردازنده‌ها و حافظه را در بدو اجرا پایش می‌کند. رشته‌های پردازشی به پردازنده محلی اختصاص می‌یابند تا اتلاف زمان ناشی از تبادل میان سوکت‌ها حذف شود.
  • دسته‌بندی هوشمند بسته‌ها: در بار ترافیکی عادی، بسته‌ها فورا ارسال می‌شوند تا تاخیر به حداقل برسد؛ هنگام افزایش حجم ترافیک، پردازش برداری با بهره‌گیری از دستورات AVX-512 فعال می‌شود.
  • تنظیم پویای بافر خروجی: عمق صف‌های حلقه‌ای متناسب با تغییرات زمان پردازش رشته‌ها تنظیم می‌شود تا از اتلاف بسته‌ها جلوگیری گردد.

با تکیه بر سازوکارهای موازی در سطح سیستم‌عامل، RiceGuard اتصالی باثبات و پرظرفیت را برای محیط‌های ارتباطی حساس فراهم می‌آورد.

دریافت VPNRice.\n