TCP aloqa qanday o'rnatiladi? Client, server va OS kernel

Assalamu Alaykum bugun client o'z so'rovlarini uzatishdan oldin server bilan qanday qilib aloqa o'rnatishini ko'rib o'tamiz.

Aloqa qanday o'rnatiladi ?

Hozir biz client tomondan aloqa o'rnatish qanday boshlanishini , OS(operation sistema) aloqalarni qanday boshqarishini va server o'rnatilgan aloqani qanday qilib qabul qilishini qadam ba qadam ko'rib chiqamiz.

Client bu faqat browser bo'lishi shart emas bu 2-sini chaqirayotgan boshqa server ham bo'lishi mumkin

Client tomon : Aloqa o'rnatishni boshlash

Client tomonda , dastur aloqa o'rnatishni serverning ip address va portga so'rov yuborish orqali ochadi (socket APIdan foydalanagan holda connect )

Bu OS darajasida kernelda TCP aloqa o'rnatish triggerini ishga tushuradi. Kernel agarda client biror portga bog'lanmagan bo'lsa , clientga ephemeral port (vaqtinchalik source port , ma'lumotni qabul qilib olish uchun) belgilaydi . Clientning OSsi TCP handshake ning birinchi qadami bo'lgan TCP SYN packetni serverga uzatadi . SYN packet boshlang'ich sequence raqamni o'z ichiga olgan bo'ladi va serverning portiga yo'naltirilgan bo'ladi. Sequence number bu packetlarni tartibini bilish uchun kerak bo'ladi va server va client bunga oldindan kelishib olishadi , ular random tanlanadi.

TCP 3-way handshake ikki qurilma o'rtasida aloqa o'rnatishda agar TCP protokoli bilan bo'lsa har doim amalga oshiriladi. Ko'proq bilish uchun ushbu maqolani o'qing . TCP handshake

OS Kernel: TCP 3-way handshake

Aloqa o'rnatishning asosiy qismi kernelda TCP 3-way handshake orqali amalga oshadi.

  1. Client SYN packet yuboradi: clientning kerneli SYN packet yuboradi sequence raqam bilan birga.

  2. Server SYN-ACK packet bilan javob qaytaradi: Serverning kerneli , target (server portida) portda aloqa uchun eshitib turgan bo'ladi , va SYN packetni qabul qiladi. U yangi aloqani yozib qo'yib (yarim ochiq holatda) SYN-ACK packetni uzatadi . SYN-ACK packet serverning sequence raqami va clientnikiga 1 qo'shilgan raqamini o'z ichiga oladi.

  3. Client ACK packetini yuboradi : SYN-ACK packetini qabul qilishi bilan clientni kerneli ACK packetni serverni sequnce raqamiga 1 qo'shgan holda yuboradi.

Bu 3 qadamdan keyin TCP aloqasi o'rnatilinadi (ikkala tomonda ham) . Muhimi bu 3 qadam Operatsion sistema tomonidan amalga oshiriladi , dastur kodi orqali emas . Shu paytda clientningconnect()funksiyasi aloqa o'rnatilganin bildiradi.

Kernel aloqa o'rnatilgandan unique identifikator (socket) yaratadi va accept bo'lganda buni dasturga(server) beradi .

Bundan tashqari kernel har bir port uchun alohida 2 ta queue yaratadi SYN va ACCEPT . Hali jarayonda bo'lgan aloqa o'rnatishlar SYN queueda bo'ladi handshake tugagandan keyin esa u ACCEPT queuega o'tkaziladi.

Kernel agar dastur eshitmayotgan bo'lsa aloqa o'rnatmaydi !!

Sizda dastur turgan server bilan aloqa o'rnatildi ammo hali dasturning o'zi bilan aloqa mavjud emas.

Server Tomon: Aloqani qabul qilish

Server tomonda , dastur maxsus portda va ip addressda aloqani qabul qilish uchun kutib turgan bo'lishi kerak , biz buni odatda muhit o'zgaruvchi (environment variablelarga qo'yamiz) . Agarda ip address bermasak u shu qurilmadagi hamma ip addresslarni eshitib turadi . Serverning kernel clientda SYN qabul qilganda , unda socket shu portga LISTEN qilib(ya’ni eshitib) turgan bo'lishi kerak. Tepada aytganimizdek serverning kerneli SYN-ACK packet yuboradi va clientdan ACK packet kelgandan so'ng . Yangi aloqa kernel darajasida to'liq o'rnatiladi. Keyin server OS bu aloqani ESTABLISHEDdeb belgilaydi va syn queuedan ackga to'g'ri keladigan aloqani ACCEPT queue(ko'pincha backlog deyiladi) dastur qabul qilishi uchun qo'yadi. Qachonki serverdagi dastur socketdagi accept funksiyasini chaqirganda ,OS aloqani queuedan olib tashlaydi va shu paytda socket va shunga yo'naltirigan file descriptor yaratiladi va bu dastur processiga beriladi. Keyinchalik dastur aloqadan nimadir o'qimoqchi bo'lsa shu file descriptordan foydalanadi . Xuddi shu paytda biz yozgan dastur bu aloqa bilan bemalol ishlay oladi .

Eng muhimi , eshitayotgan(listen) socket qoladi va boshqa clientlarni bog'lanishini kutib turadi , yangi socket esa clientlar bilan muloqot uchun ishlatilinadi.

Aloqani qabul qilish bilan muammolar :

Shuning uchun ham TCP statefull prtokol hisoblanadi

Ma'lumot o'qish va uzatish

Kernel 2 ta queue yaratganda shu bilan birga 2 ta buffer yaratadi bittasi ma'lumotlarni uzatish uchun bittasi qabul qilish uchun.

Client ma'lumotni aloqa kanali orqali yuboradi , ma'lumot signallar bo'lib yetib kealdi NIC decoder bularni bitlarga aylantirib kernelga beradi ma'lumot kerneldagi bufferga kelgan paytda OS u layer 3 va 4lardagi ma'lumotlarni ochib bu xabar qaysi portga va qaysi protocoldan foydalanilganini bilib shu socketning receive bufferiga qo'yadi va ACK xabarini clientga yuboradi. Agarda xabar birorta socketga tegishli bo'lmasa kernel uni bekor qiladi. Receive bufferdan keyin backend kod buni kerneldan processga o'tkazishni so'raydi va shu yerda app u ma'lumotni olib decrypt qilish kerak bo'lsa qilib onRequest yoki shu kabi funksiyalarga parametr sifatida beradi va bu Layer 7 hisoblanadi.

Bu yerda ma'lumotni jo'natish Nagle algoritmi ham mavjud u sizdan yuborgan xabarlarni to'plab turib birdaniga yuboradi.

O'qish va yozish bilan muammo:_agar backend bufferdan ma'lumotni tez o'qimasa client bundan aziyat checkadi yani so'rov sekinlashadi._

Queuelar haqida ?

Har bir eshitilayotgan port(socket) o'zini alohida queuelar bo'ladi , hamma portlar uchun bitta umumiy queue emas. Ya’ni server ishga tushayotganda berilgan IP address va port uchun alohida queuelar (SYN and ACCEPT) ochadi , agarda server bir nechta portga listen qilsa har biri uchun alohida ochiladi .

Bu dizayn izolyatsiyani taminlaydi va socket bo'yicha aloqani boshqarishni osonlashtiradi . Biz bergan backlog size har bir listen socket uchun alohida bo'ladi . Bu hammasi bir queuedan bo'lgandan ko'ra xavsizroq.

Socket nima?

Tarmoqda socket bu 2ta qurilma yoki process muloqot qilishi uchun muhim qism hisoblanadi. Bu software abstraction (mavhumlashtirish) bo'lib IP address va port raqami (protocol ham bor) birlashtirib ma'lumot qayerga uzatilishini yoki kelishini aniqlaydi . Oddiy qilib aytganda socket aloqaning oxiri hisoblanadi , bitta socket client tomonda bittasi esa server tomonda . Dasturlar socketni OS APIlari orqali ishlatishadi . Masalan, server qaysidir portga listen qilganda kelayotgan ulanishlarni qabul qilish uchun socket yaratiladi. Oddiy til bilan aytganda socket clientga olib boruvchi yo'l bolsa file descriptor shu eshik kaliti hisoblanadi aloqa esa shu bog'lab turuvchi yo'l.

Aloqa nima?

Aloqa bu — 2 socket o'rtasida aktiv ma'lumot almashishni bog'lab turuvchi yo'l yoki keling shuni quvur deylik oson tushunilishi uchun . Client va serverning socketlar muvafaqiyatli 3-way handshakedan keyin bir birlariga shunaqa yo'l orqali bog'lanishadi. TCP aloqasi unique bo'lib client IP va port hamda server IP va porti kombinatsiyasi orqali bilib olinadi. Aloqa o'rnatilgandan keyin , ikkala tarafda ham bu yo'lni bildiradigan socket ochiladi va shu orqali shu yo'lga ulanish mumkin bo'ladi , ma'lumotlarni yuborish va o'qish o'sha socketla orqali amalga oshadi.

Bizda Unique aloqa identifikatori bo'lganligi uchun agar server bir portda ishlab tursa ham har bir client uchun alohida socket ochiladi (va bu client IP va port o'zgargani boshqacha bo'lgani bilan farqlanadi) .

aloqa o'rnatish
aloqa o'rnatish

Xulosa

Xulosa qilib aytadigan bo'lsak biz oddiygina bir so'rov hali serverga yetib bormasdan shuncha ish amalga oshadi va bular OS yoki protokollar orqali mavhumlashtirilgan va biz kod yozayotganda buni payqamaymiz. Lekin bularni yaxshiroq bilish biz yozayotgan dasturimizni yanada yaxshi tushunishga yordam beradi.