سوکتها روشی برای برقراری ارتباط میان فرایندها (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 نمونه و بررسی آن
- اجرای دو سوکت TCP بر روی پورت 8080 (برای IPv4 و IPv6) با دستورات زیر:
socat TCP4-LISTEN:8080,reuseaddr,fork EXEC:/bin/cat & socat TCP6-LISTEN:8080,reuseaddr,fork EXEC:/bin/cat & - اکنون بررسی سوکتها با ss و nc:
- برای مشاهده سوکتهای TCP-IPv4 درحال listen:
ss -4 -tln - برای مشاهده سوکتهای TCP-IPv6:
ss -6 -tln
- برای مشاهده سوکتهای TCP-IPv4 درحال listen:
- جهت اتصال آزمایشی به سوکت IPv4:
nc 127.0.0.1 8080 - اتصال آزمایشی به سوکت IPv6:
nc ::1 8080 - برای پاکسازی سوکتها، از دستور
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 نمونه و بررسی آن
- اجرای دو سوکت UDP روی پورت 123 (برای IPv4 و IPv6):
socat UDP4-RECVFROM:123,fork EXEC:/bin/cat & socat UDP6-RECVFROM:123,fork EXEC:/bin/cat & - مشاهده سوکتهای UDP با ss:
- برای IPv4:
ss -4 -uln - برای IPv6:
ss -6 -uln
- برای IPv4:
- تست اتصال به سوکت UDP با netcat:
nc -u -z 127.0.0.1 123nc -u -z ::1 123عدم وجود ارور به معنای فعال بودن سوکت است.
- پاکسازی سوکتها با دستور
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
- ساخت دو سوکت (یکی 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 & - مشاهده سوکتهای یونیکس در حال listen:
ss -xlnنوع u_str نشانه stream و u_dgr نشانه datagram بودن سوکت است.
- مشاهده اطلاعات روی فایلسیستم:
stat /tmp/stream/sock stat /tmp/datagram/sockراه دیگر:
ls -l /tmp/stream/sock /tmp/datagram/sock - تست اتصال به سوکت با netcat:
- برای stream-based:
nc -U -z /tmp/stream/sock - برای datagram-based:
nc -u -U -z /tmp/datagram/sock
اگر سوکتی یافته نشود، ارور مشاهده میشود.
- برای stream-based:
- پاکسازی سوکتها با
fgو CTRL+C
جمعبندی
در این آموزش یاد گرفتید که چگونه سوکتهای مختلف (stream-based مبتنی بر TCP، datagram-based مبتنی بر UDP و Unix Domain Sockets) را در لینوکس بسازید، بررسی و تست کنید. ابزار ss جهت جمعآوری اطلاعات انواع سوکتها مفید است و با netcat و socat ساخت و اتصال به انواع سوکت را تمرین کردید.
توانایی کار با سوکتها یکی از مهارتهای کلیدی مدیریت سیستم است و این ابزارها به شما کمک میکنند تا عیبیابی ارتباط برنامهها و سرورهای خود را سادهتر انجام دهید.
از همراهی شما با پارمین کلود سپاسگزاریم.
نظرات کاربران