آشنایی با سوکت‌ها (Sockets) و نحوه استفاده در لینوکس

سوکت‌ها روشی برای برقراری ارتباط میان فرایندها (inter-process communication) روی یک سرور یا بین برنامه‌هایی هستند که روی سرورهای جداگانه اجرا می‌شوند. ارتباط بین سرورها به سوکت‌های شبکه وابسته است که از پروتکل اینترنت (IP) جهت بسته‌بندی و مدیریت ارسال و دریافت داده استفاده می‌کنند.

سوکت‌های شبکه در کلاینت و سرور با آدرس سوکت شناخته می‌شوند. یک آدرس سوکت ترکیبی یکتاست از پروتکل انتقال (مثل TCP یا UDP)، آدرس IP و شماره پورت.

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

  • Stream Sockets (سوکت‌های جریان)
  • Datagram Sockets (سوکت‌های دیتاگرامی)
  • Unix Domain Sockets (سوکت‌های دامنه یونیکس)

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

مثال‌ها روی یک سرور Ubuntu 20.04 تست شده‌اند. با داشتن نسخه معادل ابزارهای موردنیاز، می‌توانید این آموزش را روی سایر توزیع‌های مدرن لینوکس (محلی یا سرور راه دور) دنبال کنید.

پیش‌نیازها

  • یک سرور با راه‌اندازی اولیه برای Ubuntu 20.04
  • آپدیت بودن کش بسته‌ها با دستور:
    sudo apt update
  • نصب بسته‌های مورد نیاز با دستور:
    sudo apt install iproute2 netcat-openbsd socat

بسته iproute2 شامل ابزار ss است که برای بررسی سوکت‌ها استفاده می‌شود. بسته netcat-openbsd جهت نصب netcat به کار می‌رود (در خط فرمان با nc شناخته می‌شود). نهایتا socat برای ساخت سوکت‌های نمونه استفاده می‌شود.

سوکت‌های stream (جریان) – مبتنی بر TCP

سوکت‌های stream ارتباط‌گرا (connection-oriented) بوده و بسته‌های ارسال یا دریافتی از آنها توسط سیستم‌عامل به ترتیب برای پردازش برنامه‌ها تحویل می‌شود. این سوکت‌ها معمولا از TCP برای انتقال داده روی اینترفیس شبکه استفاده می‌کنند.

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

نمونه کاربرد: سرورهای وب مثل Apache یا Nginx که درخواست‌های HTTP روی پورت 80 یا HTTPS روی پورت 443 را مدیریت می‌کنند. مثال آدرس سوکت HTTP: 203.0.113.1:80 ، مثال برای HTTPS: 203.0.113.1:443

ایجاد سوکت TCP نمونه و بررسی آن

  1. اجرای دو سوکت TCP بر روی پورت 8080 (برای IPv4 و IPv6) با دستورات زیر:
    
    socat TCP4-LISTEN:8080,reuseaddr,fork EXEC:/bin/cat &
    socat TCP6-LISTEN:8080,reuseaddr,fork EXEC:/bin/cat &
        
  2. اکنون بررسی سوکت‌ها با ss و nc:
    • برای مشاهده سوکت‌های TCP-IPv4 درحال listen:
      ss -4 -tln
    • برای مشاهده سوکت‌های TCP-IPv6:
      ss -6 -tln
  3. جهت اتصال آزمایشی به سوکت IPv4:
    nc 127.0.0.1 8080
  4. اتصال آزمایشی به سوکت IPv6:
    nc ::1 8080
  5. برای پاکسازی سوکت‌ها، از دستور fg (برای آوردن هر socat در پیش‌زمینه) و سپس CTRL+C استفاده نمایید.

سوکت‌های datagram (دیتاگرامی) – مبتنی بر UDP

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

نمونه کاربرد: DNS به صورت پیش‌فرض از پورت 53/UDP استفاده می‌کند (203.0.113.1:53). همچنین پروتکل NTP از پورت 123/UDP (203.0.113.1:123).

تذکر: آدرس‌خوانی انسان شامل پروتکل نیست، مانند 203.0.113.1:53 که می‌تواند هم روی TCP باشد هم UDP. ابزارهایی مثل ss و netstat نوع پروتکل را نشان می‌دهند.

ایجاد سوکت UDP نمونه و بررسی آن

  1. اجرای دو سوکت UDP روی پورت 123 (برای IPv4 و IPv6):
    
    socat UDP4-RECVFROM:123,fork EXEC:/bin/cat &
    socat UDP6-RECVFROM:123,fork EXEC:/bin/cat &
        
  2. مشاهده سوکت‌های UDP با ss:
    • برای IPv4:
      ss -4 -uln
    • برای IPv6:
      ss -6 -uln
  3. تست اتصال به سوکت UDP با netcat:
    nc -u -z 127.0.0.1 123
    nc -u -z ::1 123

    عدم وجود ارور به معنای فعال بودن سوکت است.

  4. پاکسازی سوکت‌ها با دستور fg و CTRL+C

سوکت دامنه Unix (Unix Domain Sockets)

برنامه‌هایی که روی همان سرور اجرا می‌شوند، می‌توانند از طریق Unix Domain Sockets با هم ارتباط برقرار کنند؛ چه جریان (stream) چه دیتاگرامی (datagram). داده مستقیما روی کرنل لینوکس رد و بدل می‌شود و از شبکه عبور نمی‌کند، فایل سوکت روی فایل‌سیستم ایجاد می‌شود.

پایگاه‌های داده مانند MySQL (فایل: /var/run/mysqld/mysql.sock) یا PostgreSQL (/run/postgresql/.s.PGSQL.5432) به صورت لوکال از این روش استفاده می‌کنند.

ساخت و بررسی Unix Domain Socket

  1. ساخت دو سوکت (یکی stream-based و یکی datagram-based):
    
    mkdir -p /tmp/stream /tmp/datagram
    socat UNIX-LISTEN:/tmp/stream/sock,reuseaddr,fork EXEC:/bin/cat &
    socat UNIX-DGRAM:/tmp/datagram/sock EXEC:/bin/cat &
        
  2. مشاهده سوکت‌های یونیکس در حال listen:
    ss -xln

    نوع u_str نشانه stream و u_dgr نشانه datagram بودن سوکت است.

  3. مشاهده اطلاعات روی فایل‌سیستم:
    stat /tmp/stream/sock
    stat /tmp/datagram/sock

    راه دیگر:

    ls -l /tmp/stream/sock /tmp/datagram/sock
  4. تست اتصال به سوکت با netcat:
    • برای stream-based:
      nc -U -z /tmp/stream/sock
    • برای datagram-based:
      nc -u -U -z /tmp/datagram/sock

    اگر سوکتی یافته نشود، ارور مشاهده می‌شود.

  5. پاکسازی سوکت‌ها با fg و CTRL+C

جمع‌بندی

در این آموزش یاد گرفتید که چگونه سوکت‌های مختلف (stream-based مبتنی بر TCP، datagram-based مبتنی بر UDP و Unix Domain Sockets) را در لینوکس بسازید، بررسی و تست کنید. ابزار ss جهت جمع‌آوری اطلاعات انواع سوکت‌ها مفید است و با netcat و socat ساخت و اتصال به انواع سوکت را تمرین کردید.

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

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

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *