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_INET— IPv4;AF_INET6— IPv6;AF_UNIX— lokal Unix socket;SOCK_STREAM— oqim;SOCK_DGRAM— datagram.
TCP server
TCP server odatda quyidagi bosqichlardan o‘tadi:
socket()— socket yaratish.bind()— lokal IP va portga bog‘lash.listen()— kiruvchi ulanishlarni kutish.accept()— yangi connection qabul qilish.read()yokirecv()— ma’lumot olish.write()yokisend()— ma’lumot yuborish.close()— socketni yopish.
Listening socket va har client uchun yaratilgan connected socket alohida bo‘ladi.
TCP client
- socket yaratadi;
connect()orqali server IP va portga ulanadi;- ma’lumot almashadi;
- connectionni yopadi.
connect() TCP handshake tugaguncha bloklanishi yoki non-blocking rejimda keyin yakunlanishi mumkin.
UDP socket
UDP connection o‘rnatishni talab qilmaydi.
- 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:
SO_REUSEADDR;SO_REUSEPORT;SO_KEEPALIVE;TCP_NODELAY;- send va receive buffer;
- broadcast ruxsati;
- interface binding;
- TTL;
- multicast membership.
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:
- faqat kerakli interfeysga bind;
- firewall;
- TLS;
- authentication;
- input validation;
- rate limit;
- connection limit;
- privilege separation;
- Unix socket ruxsatlari.
0.0.0.0ga bind qilish serviceni barcha interfeysda ochadi.
Diagnostika
Socket muammosida:
- listening address;
- port;
- process;
- socket state;
- firewall;
- backlog;
- file descriptor;
- ephemeral port;
- TIME_WAIT;
- DNS;
- route;
- timeout;
- buffer;
- application log
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