سوکت چیست و چه کاری انجام میدهد؟
سوکت چیست؟سوکت (Socket) در شبکه یک «نقطه پایانی» نرمافزاری برای ارسال و دریافت داده است. برنامهها بهجای درگیر شدن با جزئیات لایههای شبکه، از طریق Socket API با سیستمعامل صحبت میکنند و سیستمعامل مسئول مدیریت اتصال، بافرها و تحویل بستهها به برنامه درست است.
Socket دقیقاً یعنی چه؟
در سادهترین تعریف، سوکت یک ساختار نرمافزاری داخل یک گره شبکه (Node) است که داده را بین برنامه و شبکه جابهجا میکند. این ساختار معمولاً فقط تا زمانی معتبر است که فرایند (Process) ایجادکنندهی آن در حال اجرا باشد.
برای شناسایی یک سوکت شبکه، معمولاً این سه مؤلفه را در نظر میگیرند:
- نوع ارتباط (Protocol) مثل TCP یا UDP
- آدرس میزبان (Host / IP)
- شماره پورت (Port)
نامگذاری «Socket» هم از یک تشبیه ساده میآید: همانطور که در برق، سوکت مادگی نقطه اتصال است، در شبکه هم سوکت نقطه اتصال نرمافزاری برای تبادل داده محسوب میشود.
فرایند کار با Socket در برنامهها
وقتی برنامهنویس یک سوکت میسازد، عملاً از سیستمعامل میخواهد منابع لازم برای یک ارتباط شبکهای را آماده کند. بعد از آن، برنامه فقط با توابع ارسال/دریافت کار میکند و جزئیات لایه انتقال (TCP/UDP) را به سیستمعامل میسپارد.
- برنامه سوکت را ایجاد میکند (create).
- در سمت سرور معمولاً سوکت به یک IP/Port متصل میشود (bind) و سپس در حالت انتظار قرار میگیرد (listen/accept).
- در سمت کلاینت معمولاً اتصال برقرار میشود (connect).
- در نهایت داده ارسال و دریافت میشود (send/recv) و ارتباط بسته میشود (close).
Socket API و استاندارد برکلی
اغلب سیستمعاملها از خانوادهی «سوکتهای برکلی» (Berkeley Sockets) پیروی میکنند. در این مدل، سوکتها تا حد زیادی شبیه «توصیفکننده فایل» هستند (خواندن، نوشتن، باز و بسته کردن). البته سوکت علاوه بر خواندن/نوشتن، مفاهیمی مثل آدرسدهی، اتصال و دریافت/ارسال دوطرفه را هم دارد.
آدرس سوکت (Socket Address) در TCP و UDP
در TCP و UDP، آدرس سوکت ترکیبی از IP و Port است. تفاوت مهم اینجاست که TCP و UDP با اینکه ممکن است پورت یکسانی داشته باشند، سوکتهای مجزا محسوب میشوند (مثلاً TCP/53 با UDP/53 یکی نیست).
یک مثال ساده از Socket در پایتون (TCP)
در نمونهی زیر یک کلاینت TCP به سرور محلی وصل میشود، پیام میفرستد و پاسخ را دریافت میکند:
#!/usr/bin/env python3
import socket
HOST = '127.0.0.1' # Server hostname or IP
PORT = 65432 # Server port
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
s.sendall(b'Hello, world')
data = s.recv(1024)
print('Received', repr(data))
انواع Socket
بهصورت رایج، سه نوع سوکت زیر بیشتر از همه استفاده میشوند:
- Stream Socket (اتصالگرا)
- Datagram Socket (بدون اتصال)
- Raw Socket (سوکت خام)
1) Stream Socket (اتصالگرا)
سوکتهای Stream معمولاً بر پایه TCP هستند. در این روش، قبل از تبادل داده یک اتصال معتبر برقرار میشود (Three‑Way Handshake) و دادهها با حفظ ترتیب و با قابلیت اطمینان بالا منتقل میشوند.
نمونه کاربردهای رایج:
- HTTP/HTTPS
- FTP
- SMTP
2) Datagram Socket (بدون اتصال)
سوکتهای Datagram معمولاً بر پایه UDP هستند. در UDP تضمینی برای رسیدن بسته، حفظ ترتیب یا تصدیق دریافت وجود ندارد؛ در عوض سربار کمتر و سرعت بالاتر است.
UDP معمولاً زمانی انتخاب میشود که تأخیر کم از «دقت کامل» مهمتر باشد؛ مثل صدا/ویدئو و استریمینگ.
چند مثال کاربردی:
- DNS
- NTP
- Streaming Media (مثل IPTV)
- DHCP (برای راهاندازی خودکار)
مقایسه TCP و UDP
جدول زیر یک مقایسه سریع بین TCP و UDP ارائه میدهد:
| ویژگی | TCP | UDP |
| نوع ارتباط | اتصالگرا (Connection‑Oriented) | بدون اتصال (Connectionless) |
| قابلیت اطمینان | بالا (تضمین تحویل) | پایین (بدون تضمین تحویل) |
| حفظ ترتیب بستهها | بله | خیر |
| نوع داده | جریان بایت (Byte Stream) | دیتاگرامهای مستقل |
| کنترل خطا | تشخیص و اصلاح | تشخیص ساده |
| تصدیق دریافت (ACK) | دارد | ندارد |
| کاربرد معمول | وب، ایمیل، انتقال فایل | استریمینگ، DNS، NTP |

تصویر 2 — نمونه جدول مقایسه TCP و UDP (نمای صفحه)
3) Raw Socket (سوکت خام)
سوکت خام (Raw) مستقیماً با بستههای لایه شبکه/انتقال کار میکند و معمولاً برای کاربردهای سطح پایین شبکه بهکار میرود. در بسیاری از سیستمها دسترسی به Raw Socket محدود یا نیازمند سطح دسترسی بالا است، چون میتواند برای حملات یا شنود هم سوءاستفاده شود.
نمونه کاربردها:
- ICMP (مثل ابزار ping)
- پروتکلهای مسیریابی مثل OSPF و IGMP (در تجهیزات شبکه)
WebSocket چه ارتباطی با Socket دارد؟
وبسوکت (WebSocket) یک پروتکل در سطح کاربرد است که روی TCP اجرا میشود و بعد از یک «Handshake» مبتنی بر HTTP، ارتباط را به یک کانال دوطرفه و پایدار ارتقا میدهد. این روش برای ارتباط بلادرنگ (Real‑Time) بین کلاینت و سرور کاربرد دارد.

تصویر 3 — نمای ساده از Handshake و ارتقای HTTP به WebSocket (Status 101)
تاریخچه کوتاه سوکتها
ایده سوکتها به روزهای اولیه ARPANET برمیگردد و بعدها با «Berkeley Sockets» در BSD (دهه ۸۰ میلادی) شکل استانداردتری پیدا کرد. در ویندوز نیز Winsock بهعنوان پیادهسازی رایج API سوکت ارائه شد.