Bosh sahifa Wiki Socket

Socket

Socket — dastur bilan operatsion tizim tarmoq stack’i orasidagi aloqa nuqtasi. Ilova socket orqali ma’lumot yuboradi, qabul qiladi, portga ulanadi yoki kiruvchi ulanishlarni kutadi.

Socket faqat internet tarmog‘i uchun emas. Lokal processlar orasidagi aloqa uchun Unix domain socket ham mavjud.

Socket tushunchasi endpointni ifodalaydi, lekin uning aniq identifikatori protokol va socket turiga bog‘liq.

IP socket

TCP yoki UDP socket quyidagi ma’lumotlar bilan bog‘lanishi mumkin:

TCP connection ko‘pincha 5-tuple bilan aniqlanadi:

Source IP
Source port
Destination IP
Destination port
Protocol

Socket yaratish

Dastur operatsion tizimga socket yaratish uchun syscall yuboradi.

Umumiy parametrlar:

  • address family;
  • socket type;
  • protocol.

Masalan:

  • AF_INETIPv4;
  • AF_INET6IPv6;
  • AF_UNIX — lokal Unix socket;
  • SOCK_STREAM — oqim;
  • SOCK_DGRAM — datagram.

TCP server

TCP server odatda quyidagi bosqichlardan o‘tadi:

  1. socket() — socket yaratish.
  2. bind() — lokal IP va portga bog‘lash.
  3. listen() — kiruvchi ulanishlarni kutish.
  4. accept() — yangi connection qabul qilish.
  5. read() yoki recv() — ma’lumot olish.
  6. write() yoki send() — ma’lumot yuborish.
  7. close() — socketni yopish.

Listening socket va har client uchun yaratilgan connected socket alohida bo‘ladi.

TCP client

Client:

  1. socket yaratadi;
  2. connect() orqali server IP va portga ulanadi;
  3. ma’lumot almashadi;
  4. connectionni yopadi.

connect() TCP handshake tugaguncha bloklanishi yoki non-blocking rejimda keyin yakunlanishi mumkin.

UDP socket

UDP connection o‘rnatishni talab qilmaydi.

Server:

  • socket yaratadi;
  • portga bind qiladi;
  • recvfrom() bilan datagram oladi;
  • sendto() bilan javob yuboradi.

UDP socketda connect() ishlatilishi ham mumkin. Bu TCP handshake yaratmaydi, faqat default peer tanlaydi va ayrim xatolarni qulay boshqaradi.

Bind

bind() socketni lokal manzil va portga bog‘laydi.

Misollar:

127.0.0.1:8000
0.0.0.0:8000
192.168.10.20:8000
[::]:8000

0.0.0.0 barcha lokal IPv4 interfeyslarni bildiradi.

Bir portga bir nechta process bind qilishi operatsion tizim optionlari va protokolga bog‘liq.

Port

Port 16 bitli qiymat:

0–65535

Keng toifalar:

  • well-known;
  • registered;
  • dynamic yoki ephemeral.

Client odatda ephemeral port oladi. Server ma’lum service portda tinglaydi.

Ephemeral port

Client tashqi serverga ulanishda OS vaqtinchalik source port tanlaydi.

Ko‘p parallel connectionda ephemeral portlar va NAT portlari tugashi mumkin.

Connection yopilgach, TCP socket bir muddat TIME_WAIT holatida qolishi mumkin.

Listen backlog

listen() backlog kiruvchi, hali application tomonidan qabul qilinmagan connectionlar uchun navbat chegarasini belgilaydi.

Yuklama yuqori bo‘lsa:

muhim.

Backlog juda kichik bo‘lsa, yangi clientlar timeout yoki reset ko‘rishi mumkin.

Blocking socket

Blocking rejimda read() ma’lumot kelguncha kutadi.

Sodda dastur uchun qulay, lekin bitta thread ko‘p connectionni samarali boshqara olmaydi.

Non-blocking socket

Non-blocking rejimda amal darhol qaytadi.

Ma’lumot tayyor bo‘lmasa, maxsus xato qaytariladi. Dastur event loop orqali keyin qayta urinadi.

Mexanizmlar:

  • select;
  • poll;
  • epoll;
  • kqueue;
  • IO completion port.

Timeout

Socket amallari cheksiz kutmasligi uchun timeout belgilanadi.

Turlar:

  • connect timeout;
  • read timeout;
  • write timeout;
  • idle timeout;
  • keepalive.

Timeout ilova darajasidagi retry siyosati bilan mos bo‘lishi kerak.

Socket buffer

Kernel har socket uchun send va receive buffer saqlaydi.

Katta bandwidth-delay productli tarmoqda kichik buffer throughputni cheklashi mumkin.

Juda katta buffer:

keltirib chiqarishi mumkin.

TCP window scaling katta bufferlardan foydalanishga yordam beradi.

Socket option

setsockopt() orqali xatti-harakat boshqariladi.

Misollar:

Har optionning ma’nosi OSga bog‘liq bo‘lishi mumkin.

TCP_NODELAY

TCP kichik yozuvlarni birlashtirish uchun Nagle algoritmidan foydalanishi mumkin.

TCP_NODELAY kichik packetni darhol yuborishga yordam beradi.

Interaktiv yoki real vaqt ilovada foydali, lekin packet sonini oshirishi mumkin.

Half-close

TCP connection ikki mustaqil yo‘nalishga ega.

Process shutdown() orqali faqat yozish yo‘nalishini yopib, o‘qishni davom ettirishi mumkin.

Bu protocolga request tugaganini bildirib, javobni kutish uchun ishlatiladi.

Unix domain socket

Unix domain socket bir host ichidagi processlar orasida ishlaydi.

Manzil:

bo‘lishi mumkin.

Afzalliklari:

  • IP routing talab qilmaydi;
  • lokal ruxsatlar;
  • kamroq overhead;
  • credential uzatish imkoniyati;
  • database va daemonlar uchun qulay.

Misol:

/run/postgresql/.s.PGSQL.5432

File descriptor

Unix tizimlarda socket file descriptor sifatida ko‘rinadi.

Process limitlari:

ko‘p connectionli server uchun muhim.

“Too many open files” xatosi socket leak yoki past limitni bildirishi mumkin.

Socket state

TCP socketlar quyidagi holatlarda bo‘lishi mumkin:

  • LISTEN;
  • SYN_SENT;
  • SYN_RECV;
  • ESTABLISHED;
  • FIN_WAIT;
  • CLOSE_WAIT;
  • LAST_ACK;
  • TIME_WAIT;
  • CLOSED.

Ko‘p CLOSE_WAIT application peer yopgan socketni o‘zi yopmayotganini ko‘rsatishi mumkin.

Xavfsizlik

Socketga bind bo‘lgan service tarmoqdan kirish nuqtasi yaratadi.

Himoya:

0.0.0.0ga bind qilish serviceni barcha interfeysda ochadi.

Diagnostika

Socket muammosida:

tekshiriladi.

Port ochiq bo‘lsa ham, application requestni to‘g‘ri qayta ishlayotgani alohida tekshiriladi.

Bog‘liq tushunchalar

TCP, UDP, Port, File descriptor, Bind, Listen, Accept, Connect, Non-blocking I/O, Unix domain socket, Ephemeral port