Barcha maqolalar
Node.jsWebSocketNetworkingFrom scratch

Men uni haqiqatan tushunish uchun xom TCP-dan WebSocket serverni qurdim

Nashr etilgan 5-avgust, 2025 · 7 daqiqa o'qish

Nima uchun allaqachon mavjud narsani qurish kerak?

Halol javob: chunki men yillar davomida WebSocket-lardan foydalanardim va hali ham "frame nima?" yoki "masking nima uchun mavjud?" ga javob bera olmardim.

Shuning uchun men noServer-ni qurdim: xom TCP-da noldan Node.js HTTP va WebSocket serveri. Express yo'q, ws kutubxonasi yo'q — faqat Node-ning net moduli va RFC.

Xom TCP — boshlash joyi

Node-ning net.createServer() har bir ulanish uchun soket beradi. Bu soket kiruvchi baytlar, chiquvchi baytlar. Protokol yo'q, freymlash yo'q.

Birinchi vazifa: bu oddiy so'rovmi yoki yangilash so'rovimi aniqlash uchun kiruvchi baytlarni HTTP sifatida tahlil qilish.

Handshake

RFC 6455 sehrli GUID-ni belgilaydi: 258EAFA5-E914-47DA-95CA-C5AB0DC85B11. Uning yagona maqsadi: oddiy HTTP serverlar tasodifan yangilash so'rovlarini qabul qilmasligi uchun.

101 javobidan keyin ulanish yangilangan. Endi HTTP yo'q. Bu yerdan WebSocket freymlash protokoli.

Freymlar: haqiqiy protokol

WebSocket xabari freymlariga bo'linadi. Har bir freymda ikkilik sarlavha, keyin yuk bor.

Masking va nima uchun mavjud

Mijoz freymlariga masking LOZIM. Server freymlariga masking KERAK EMAS. Bu ixtiyoriy emas.

Masking 4 baytli kalit bilan XOR:

Bu shifrlash emas. Bu xavfsizlik emas. Uning yagona maqsadi: WebSocket freymlarining HTTP kabi ko'rinishining oldini olish, proksi-serverlar ularni keshlash yoki o'zgartirmasligi uchun.

Endi bilgan narsalarim

ws kutubxonasi taxminan 2000 qator. noServer qurganidan keyin, bu qatorlarning ko'pchiligi nima qilayotganini tushunaman. Nima uchun ping/pong mavjud (aloqani tirik saqlash va o'lik ulanishlarni aniqlash), nima uchun FIN biti mavjud (katta xabar parchalanishi) va nima uchun masking faqat mijozga tegishliligini tushunaman.

Men production-da hali ham ws ishlataman. Bu kutubxonalarni almashtirish haqida emas edi — ularni tushunish haqida edi.