Foydalanuvchi Datagram Protokoli (UDP)(User Datagram Protocol) RFC 768, "User Datagram Protocol (UDP)" da belgilangan TCP/IP standarti protokoli. TCP/IP xostlari o'rtasida ma'lumotlarni tez va ishonchsiz ravishda tashish uchun TCP o'rniga UDP ishlatiladi.

UDP protokoli ulanishsiz xizmat ko'rsatadi, shuning uchun UDP har qanday datagram uchun yetkazib berish yoki ketma-ketlikni tekshirishni kafolatlamaydi. Ishonchli aloqaga muhtoj bo'lgan xost TCP protokolidan yoki o'zi datagrammalar ketma-ketligini kuzatib boradigan va har bir paketning qabul qilinganligini tasdiqlaydigan dasturdan foydalanishi kerak.

Vaqtga sezgir ilovalar ko'pincha UDP (video ma'lumotlar) dan foydalanadi, chunki kechiktirilgan paketlarni kutishdan ko'ra paketlarni tashlab yuborish afzalroqdir, bu real vaqt tizimlarida amalga oshirilmasligi mumkin. Bundan tashqari, UDP orqali video ma'lumotlarni uzatishda bir yoki bir nechta kadrlarni yo'qotish ikkilik fayllarni uzatishdan farqli o'laroq, unchalik muhim emas, bu erda bitta paketning yo'qolishi butun faylning buzilishiga olib kelishi mumkin. UDP protokolining yana bir afzalligi shundaki, UDP sarlavhasi uzunligi 4 bayt, TCP protokoli esa 20 baytga ega.

UDP xabarlari IP-datagrammalarida inkapsullanadi va uzatiladi.

UDP sarlavhasi

Rasmda UDP sarlavhasida mavjud maydonlar ko'rsatilgan.

  • Yuboruvchi porti - Bu maydon jo'natuvchi port raqamini belgilaydi. Bu qiymat, agar kerak bo'lsa, javob yuboriladigan portni ko'rsatishi kerak. Aks holda, qiymat 0 bo'lishi kerak. Agar manba xost mijoz bo'lsa, port raqami katta ehtimollik bilan vaqtinchalik bo'ladi. Agar manba server bo'lsa, u holda uning porti "ma'lum"lardan biri bo'ladi.
  • Qabul qiluvchi porti - bu maydon talab qilinadi va qabul qiluvchi portini o'z ichiga oladi. Manba portiga o'xshab, agar mijoz qabul qiluvchi xost bo'lsa, u holda port raqami vaqtinchalik, aks holda (server qabul qiluvchi) "taniqli port" hisoblanadi.
  • Datagram uzunligi - butun datagram uzunligini (sarlavha va ma'lumotlar) baytlarda ko'rsatadigan maydon. Minimal uzunlik sarlavha uzunligiga teng - 8 bayt. Nazariy jihatdan, maksimal maydon hajmi UDP datagrami uchun 65535 bayt (sarlavha uchun 8 bayt va ma'lumotlar uchun 65527 bayt). IPv4 dan foydalanganda ma'lumotlar uzunligining haqiqiy chegarasi 65507 ni tashkil qiladi (har bir UDP sarlavhasiga 8 baytdan tashqari, har bir IP sarlavhasiga yana 20 bayt kerak bo'ladi).
  • Tekshirish summasi - nazorat summasi maydoni sarlavha va ma'lumotlarni xatolar uchun tekshirish uchun ishlatiladi. Agar miqdor transmitter tomonidan yaratilmagan bo'lsa, unda maydon nol bilan to'ldiriladi.

Keling, sarlavha tuzilishini ko'rib chiqaylik UDP Wireshark tarmoq analizatoridan foydalanish:

UDP portlari

Bitta kompyuterda bir nechta dastur ishlashi mumkinligi sababli, ma'lum bir dasturga UDP paketini etkazib berish uchun har bir dasturning noyob identifikatori yoki port raqami ishlatiladi.

Port raqami 1 dan 65535 gacha bo'lgan shartli 16 bitli raqam bo'lib, paket qaysi dastur uchun mo'ljallanganligini ko'rsatadi.

UDP portlari UDP xabarlarini yuborish va qabul qilish imkoniyatini beradi. UDP porti protokol port raqami bilan belgilangan dastur uchun mo'ljallangan barcha datagrammalarni qabul qilish uchun yagona xabar navbati vazifasini bajaradi. Bu shuni anglatadiki, UDP dasturlari bir vaqtning o'zida bir nechta xabarlarni qabul qilishi mumkin.

1024 dan kam bo'lgan barcha UDP port raqamlari saqlangan va Internet Assigned Numbers Authority (IANA) da ro'yxatdan o'tgan.
UDP va TCP port raqamlari bir-biriga mos kelmaydi.

Har bir UDP porti zahiralangan yoki ma'lum port raqami bilan aniqlanadi. Quyidagi jadval standart UDP dasturlari tomonidan ishlatiladigan ma'lum UDP port raqamlarining qisman ro'yxatini ko'rsatadi.

Internet uchun tarmoq protokollari to'plami. UDP yordamida kompyuter ilovalari maxsus uzatish kanallari yoki ma'lumotlar yo'llarini o'rnatish uchun oldindan aloqa o'rnatmasdan IP tarmog'i orqali boshqa xostlarga xabarlarni (bu holda datagramlar deb ataladi) yuborishi mumkin. Protokol Devid P. Rid tomonidan 1980 yilda ishlab chiqilgan va rasmiy ravishda RFC 768 da belgilangan.

UDP ma'lumotlar ishonchliligi, tartibliligi yoki yaxlitligini ta'minlash uchun qo'l siqishlarsiz oddiy uzatish modelidan foydalanadi. Shunday qilib, UDP ishonchsiz xizmatni taqdim etadi va datagramlar ishlamay qolishi, takrorlanishi yoki izsiz yo'qolishi mumkin. UDP xatolarni tekshirish va tuzatish kerak emasligini yoki dastur ichida bajarilishi kerakligini anglatadi. Vaqtga sezgir ilovalar ko'pincha UDP dan foydalanadilar, chunki kechiktirilgan paketlarni kutishdan ko'ra paketlarni tashlab yuborish afzalroqdir, bu real vaqtda tizimlarda mumkin bo'lmasligi mumkin. Agar tarmoq interfeysi qatlamidagi xatolarni tuzatish zarur bo'lsa, dastur ushbu maqsad uchun mo'ljallangan TCP yoki SCTP dan foydalanishi mumkin.

UDP ning fuqaroligi bo'lmagan protokol sifatidagi xususiyati DNS va IPTV, IP orqali ovoz, IP tunnel protokollari va ko'plab onlayn o'yinlar kabi oqimli media ilovalari kabi juda ko'p mijozlarning kichik so'rovlariga javob beradigan serverlar uchun ham foydalidir.

Entsiklopedik YouTube

    1 / 5

    ✪ Portlar va qayta yo'naltirish/portlarni ochish. Ko'rsatmalar va tushuntirishlar sizning qo'lingizda!

  • Subtitrlar

Xizmat portlari

UDP yuqori protokolga hech qanday xabar yetkazib berish kafolatlarini bermaydi va yuborilgan xabarlar holatini saqlamaydi. Shu sababli, UDP ba'zan Ishonchsiz Datagram Protocol deb ataladi.

Tekshirish summasi

Tekshirish summasi maydoni sarlavha va ma'lumotlarni xatolar uchun tekshirish uchun ishlatiladi. Agar miqdor transmitter tomonidan yaratilmagan bo'lsa, unda maydon nol bilan to'ldiriladi. Bu maydon IPv4 uchun ixtiyoriy.

Tekshirish summasini hisoblash

Tekshirish summasini hisoblash usuli RFC 1071da belgilangan.

Tekshirish summasini hisoblashdan oldin, agar baytlardagi UDP xabarining uzunligi toq bo'lsa, u holda UDP xabari oxirida null bayt bilan to'ldiriladi (pseudo-sarlavha va to'ldiruvchi null bayt xabar bilan birga yuborilmaydi, ular faqat ishlatiladi. nazorat summasini hisoblashda). UDP sarlavhasidagi nazorat summasi maydoni nazorat summasini hisoblashda nolga teng deb qabul qilinadi.

Tekshirish summasini hisoblash uchun psevdo-sarlavha va UDP xabari ikki baytli so'zlarga bo'linadi. Keyin barcha so'zlarning yig'indisi teskari kodning arifmetikasida hisoblanadi (ya'ni raqamning barcha raqamlarini teskari aylantirish orqali ijobiy raqamdan salbiy raqam olinadigan kod va ikkita nol mavjud: 0x0000 (belgilangan +). 0) va 0xffff (−0) bilan belgilanadi). Natija UDP sarlavhasidagi tegishli maydonga yoziladi.

0x0000 (teskari kodda +0) ga teng nazorat summasi zaxiralangan va nazorat summasi xabar uchun hisoblanmaganligini bildiradi. Agar nazorat summasi hisoblangan va 0x0000 ga teng bo'lsa, nazorat summasi maydoniga 0xffff (teskari kodda -0) qiymati kiritiladi.

Xabar qabul qilinganda, qabul qiluvchi nazorat summasini yana hisoblab chiqadi (nazorat summasi maydonini hisobga olgan holda) va agar natija -0 (ya'ni 0xffff) bo'lsa, nazorat summasi birlashtirilgan deb hisoblanadi. Agar summa bir-biriga yaqinlashmasa (ma'lumotlar uzatish paytida buzilgan yoki jo'natuvchi tomonda nazorat summasi noto'g'ri hisoblangan bo'lsa), keyingi harakatlar to'g'risida qaror qabul qiluvchi tomon tomonidan qabul qilinadi. Qoidaga ko'ra, UDP/IP paketlar bilan ishlaydigan zamonaviy qurilmalarning aksariyatida nazorat summasining noto'g'riligidan qat'i nazar, bunday paketlarni e'tiborsiz qoldirish yoki keyingi ishlov berish uchun ularni o'tkazib yuborish imkonini beruvchi sozlamalar mavjud.

Tekshirish summasini hisoblash misoli

Misol uchun, bir nechta 16 bitli so'zlarning nazorat summasini hisoblaylik: 0x398a, 0xf802, 0x14b2, 0xc281.

Buni amalga oshirish uchun siz avval raqamlarni juft-juft qilib qo'shishingiz mumkin, ularni 16 bitli imzosiz raqamlar sifatida ko'rib chiqing, so'ngra qo'shilish paytida eng yuqori (17-chi) raqamga o'tkazilgan bo'lsa, natijaga bitta qo'shish orqali ikkita to'ldiruvchi kodga qisqartirishingiz mumkin. (ya'ni, de-fakto, bu operatsiya biz salbiy sonni uning to'ldiruvchisidan o'zaro kodiga aylantiramiz). Yoki, bu ekvivalent bo'lsa, biz ko'chirish raqamning past tartibli raqamiga qo'shilgan deb hisoblashimiz mumkin.

0x398a + 0xf802 = 0x1318c → 0x318d (yuqori tartibga o‘tkazish) 0x318d + 0x14b2 = 0x0463f → 0x463f (ijobiy raqam) 0x463f + 0xc281 → 0x10c = 0x8

Oxirida olingan sonning barcha bitlari teskari bo'ladi

0x08c1 = 0000 1000 1100 0001 → 1111 0111 0011 1110 = 0xf73e yoki, aks holda - 0xffff - 0x08c1 = 0xf73e . Bu kerakli nazorat summasi.

Tekshirish summasini hisoblashda haqiqiy IPv6 sarlavhasini taqlid qiluvchi psevdo-sarlavha yana ishlatiladi:

Bitlar 0 - 7 8 - 15 16 - 23 24 - 31
0 Manba manzili
32
64
96
128 Qabul qiluvchining manzili
160
192
224
256 UDP uzunligi
288 Nollar Keyingi sarlavha
320 Manba porti Belgilangan port
352 Uzunlik Tekshirish summasi
384+
Ma'lumotlar

Manba manzili IPv6 sarlavhasi bilan bir xil. Qabul qiluvchining manzili - oxirgi oluvchi; agar IPv6 paketida Marshrutlash sarlavhasi bo'lmasa, bu IPv6 sarlavhasidan maqsad manzil bo'ladi, aks holda boshlang'ich tugunda marshrutlash sarlavhasining oxirgi elementining manzili va qabul qiluvchi tugunda, IPv6 sarlavhasidan maqsad manzil. Keyingi sarlavha qiymati protokol qiymatiga teng - UDP uchun 17. UDP uzunligi - UDP sarlavhasi va ma'lumotlarining uzunligi.

Ishonchlilik va ortiqcha yuk muammolarini hal qilish

Ishonchliligi yo'qligi sababli, UDP ilovalari ba'zi yo'qotishlar, xatoliklar va takrorlanishlarga tayyorlanishi kerak. Ulardan ba'zilari (masalan, TFTP) ixtiyoriy ravishda dastur darajasida elementar ishonchlilik mexanizmlarini qo'shishi mumkin.

Ammo ko'pincha bunday mexanizmlar UDP ilovalari tomonidan ishlatilmaydi va hatto ularga aralashadi. Streaming media, real-time multiplayer oʻyinlari va VoIP koʻpincha UDP protokolidan foydalanadigan ilovalarga misol boʻla oladi. Ushbu maxsus ilovalarda paketlarni yo'qotish odatda katta muammo emas. Agar dastur yuqori darajadagi ishonchlilikni talab qilsa, siz boshqa protokoldan (TCP) foydalanishingiz yoki xatoga chidamli kodlash usullaridan foydalanishingiz mumkin (O'chirish kodi). ru uz).

Yana jiddiy potentsial muammo shundaki, TCP dan farqli o'laroq, UDP-ga asoslangan ilovalar tiqilib qolishni nazorat qilish va oldini olish mexanizmlariga ega emas. Mavjud tarmoqli kengligining muhim qismini iste'mol qiladigan tiqilinchga sezgir UDP ilovalari Internet barqarorligini buzishi mumkin.

Tarmoq mexanizmlari nazoratsiz, yuqori tezlikdagi yuklar paytida tirbandlikning mumkin bo'lgan ta'sirini kamaytirish uchun ishlab chiqilgan. Paket navbatlari va tushirish texnikasidan foydalanadigan marshrutizatorlar kabi tarmoq elementlari ko'pincha haddan tashqari UDP trafigini sekinlashtiradigan yagona vositadir. DCCP (Datagram Congestion Control Protocol) ushbu potentsial muammoni qisman hal qilish uchun oxirgi xostga oqimli media kabi yuqori tezlikdagi UDP oqimlari uchun tiqilib qolishni nazorat qilish mexanizmlarini qo'shish orqali ishlab chiqilgan.

Ilovalar

Ko'pgina asosiy Internet ilovalari UDP dan foydalanadi, jumladan DNS (bu erda so'rovlar tez bo'lishi kerak va faqat bitta so'rovdan keyin bitta javob paketidan iborat bo'lishi kerak), Simple Network Management Protocol (SNMP), Routing Information Protocol (RIP), Dynamic Host Configuration (DHCP) .

Ovozli va video trafik odatda UDP yordamida amalga oshiriladi. Jonli video va audio oqim protokollari tasodifiy paket yo'qotishlarini bartaraf etish uchun mo'ljallangan, shuning uchun yo'qolgan paketlar qayta uzatilganda katta kechikishlar o'rniga sifat biroz yomonlashadi. TCP va UDP ikkalasi ham bir tarmoqda ishlaganligi sababli, ko'pgina kompaniyalar ushbu real vaqtda ilovalardan UDP trafigining yaqinda o'sishi ma'lumotlar bazasi yoki buxgalteriya tizimlari kabi TCP ilovalarining ishlashiga to'sqinlik qilayotganini payqashdi. Ishbilarmonlik va real vaqtda ilovalar kompaniyalar uchun muhim bo'lganligi sababli, muammolarga sifatli yechimlarni ishlab chiqish ba'zilar tomonidan ustuvor vazifa sifatida ko'riladi.

UDP va TCP ni solishtirish

TCP ulanishga yo'naltirilgan protokol bo'lib, ikkita xost o'rtasida aloqa o'rnatish uchun "qo'l siqish" talab qilinadi. Ulanish o'rnatilgandan so'ng, foydalanuvchilar har ikki yo'nalishda ham ma'lumotlarni yuborishlari mumkin.

  • Ishonchlilik- TCP xabarni tasdiqlash, qayta uzatish va kutish vaqtini boshqaradi. Xabarni etkazish uchun ko'p urinishlar qilingan. Agar u yo'lda yo'qolib qolsa, server yo'qolgan qismni yana so'raydi. TCP-da etishmayotgan ma'lumotlar yoki (bir nechta vaqt tugashi holatlarida) uzilgan ulanishlar yo'q.
  • Tartiblilik- agar ikkita xabar ketma-ket yuborilsa, birinchi xabar birinchi bo'lib qabul qiluvchi ilovaga etib boradi. Agar ma'lumotlar bo'laklari noto'g'ri tartibda kelsa, TCP barcha ma'lumotlar buyurtma qilinmaguncha va dasturga yuborilgunga qadar tartibsiz ma'lumotlarni buferga yuboradi.
  • Og'irlik- TCP ma'lumotlarni yuborishdan oldin rozetkaga ulanishni o'rnatish uchun uchta paketni talab qiladi. TCP ishonchlilik va tirbandlikni nazorat qiladi.
  • Ip o'tkazish- ma'lumotlar baytlar oqimi sifatida o'qiladi, xabar chegaralari yoki segmentlari uchun maxsus belgilar uzatilmaydi.

UDP oddiyroq, xabarga asoslangan, ulanishsiz protokoldir. Ushbu turdagi protokollar ikkita xost o'rtasida maxsus aloqa o'rnatmaydi. Aloqa axborotni qabul qiluvchining tayyorligi yoki holatini tekshirmasdan turib, manbadan qabul qiluvchiga bir yo‘nalishda uzatish orqali erishiladi. Ovozli IP (TCP/IP) ilovalarida UDP TCP ga nisbatan afzalliklarga ega, bunda har qanday qo'l siqish yaxshi ovozli aloqani oldini oladi. VoIP-da oxirgi foydalanuvchilar real vaqt rejimida xabar qabul qilinganligi to'g'risida kerakli tasdiqni taqdim etishlari kutiladi.

  • Ishonchsiz- xabar yuborilganda, uning manzilga etib borishi noma'lum - u yo'lda adashib qolishi mumkin. Tasdiqlash, qayta uzatish, vaqt tugashi kabi tushunchalar mavjud emas.
  • Tartibsizlik- agar bitta qabul qiluvchiga ikkita xabar yuborilsa, ularning maqsadga erishish tartibini oldindan aytib bo'lmaydi.
  • Yengillik- xabarlarni buyurtma qilish yo'q, ulanishni kuzatish yo'q va hokazo. Bu IP-da yaratilgan kichik transport qatlami.
  • Datagrams- paketlar alohida-alohida yuboriladi va ular kelgan taqdirdagina yaxlitligi tekshiriladi. Paketlar qabul qilingandan so'ng hurmat qilinadigan ma'lum chegaralarga ega, ya'ni qabul qiluvchi rozetkadagi o'qish operatsiyasi xabarni dastlab yuborilganidek ishlab chiqaradi.
  • Haddan tashqari yuk nazorati yo'q- UDPning o'zi tirbandlikdan qochmaydi. Yuqori o'tkazish qobiliyatiga ega ilovalar, agar ular ilova darajasidagi boshqaruvlarni amalga oshirmasa, tiqilib qolishiga olib kelishi mumkin.

Internet uzoq vaqtdan beri o'zgargan. Asosiy Internet protokollaridan biri bo'lgan UDP ilovalar tomonidan nafaqat datagrammalar va translyatsiyalarni etkazib berish, balki tarmoq tugunlari o'rtasida tengdoshli ulanishlarni ta'minlash uchun ham qo'llaniladi. Oddiy dizayni tufayli ushbu protokol ilgari rejalashtirilmagan ko'plab foydalanishga ega, ammo protokolning kamchiliklari, masalan, kafolatlangan etkazib berishning yo'qligi yo'qolmadi. Ushbu maqola UDP orqali Kafolatlangan yetkazib berish protokolining amalga oshirilishini tasvirlaydi.

Kirish

Internetning asl arxitekturasi har bir tugun global va noyob IP-manzilga ega bo'lgan va boshqa tugunlar bilan to'g'ridan-to'g'ri aloqa qila oladigan yagona manzil maydonini nazarda tutgan. Endi Internet, aslida, boshqa arxitekturaga ega - global IP-manzillarning bir sohasi va NAT qurilmalari orqasida maxfiy manzillar yashiringan ko'plab sohalar. Ushbu arxitekturada faqat global manzil maydonidagi qurilmalar tarmoqdagi har qanday odam bilan osongina bog'lana oladi, chunki ular noyob, global yo'naltiriladigan IP-manzilga ega. Shaxsiy tarmoqda joylashgan tugun bir xil tarmoqdagi boshqa tugunlarga ulanishi mumkin, shuningdek, global manzil maydonidagi boshqa, taniqli tugunlarga ulanishi mumkin. Ushbu o'zaro ta'sirga asosan tarmoq manzillarini tarjima qilish mexanizmi tufayli erishiladi. Wi-Fi routerlar kabi NAT qurilmalari chiquvchi ulanishlar uchun maxsus tarjima jadvali yozuvlarini yaratadi va paketlardagi IP manzillari va port raqamlarini o'zgartiradi. Bu shaxsiy tarmoqdan global manzil maydonidagi xostlarga chiquvchi ulanishlarni amalga oshirish imkonini beradi. Biroq, shu bilan birga, NAT qurilmalari, agar kiruvchi ulanishlar uchun alohida qoidalar o'rnatilmagan bo'lsa, odatda barcha kiruvchi trafikni bloklaydi.

Ushbu Internet arxitekturasi mijoz-server o'zaro ta'siri uchun etarlicha to'g'ri keladi, agar mijozlar xususiy tarmoqlarda joylashgan bo'lishi mumkin va serverlar global manzilga ega bo'lsa. Ammo bu ikkita tugunni to'g'ridan-to'g'ri ulashda qiyinchiliklar tug'diradi har xil xususiy tarmoqlar. Ikki tugunning to'g'ridan-to'g'ri ulanishi ovozli uzatish (Skype), kompyuterga masofaviy kirish (TeamViewer) yoki onlayn o'yinlar kabi peer-to-peer ilovalari uchun muhimdir.

Turli xil xususiy tarmoqlarda joylashgan qurilmalar o'rtasida tengdoshga ulanishlarni o'rnatishning eng samarali usullaridan biri "teshiklarni ochish" deb ataladi. Ushbu usul ko'pincha UDP protokoliga asoslangan ilovalarda qo'llaniladi.

Ammo agar sizning ilovangiz ma'lumotlarning kafolatlangan yetkazib berilishini talab qilsa, masalan, siz kompyuterlar o'rtasida fayllarni uzatsangiz, UDP-dan foydalanish ko'p qiyinchiliklarni keltirib chiqaradi, chunki UDP kafolatlangan etkazib berish protokoli emas va paketlarni tartibda etkazib berishni ta'minlamaydi. TCP protokoli.

Bunday holda, paketlarni kafolatlangan yetkazib berishni ta'minlash uchun zarur funksionallikni ta'minlaydigan va UDP ustida ishlaydigan dastur darajasidagi protokolni amalga oshirish kerak.

Darhol shuni ta'kidlashni istardimki, turli xil xususiy tarmoqlardagi tugunlar o'rtasida TCP ulanishlarini o'rnatish uchun TCP teshiklarini ochish texnikasi mavjud, ammo ko'plab NAT qurilmalari uni qo'llab-quvvatlamasligi sababli, u odatda asosiy usul sifatida hisoblanmaydi. bunday tugunlarni ulash.

Protokol talablari

  1. Ijobiy qayta aloqa mexanizmi (ijobiy tasdiq deb ataladigan) orqali amalga oshiriladigan ishonchli paket yetkazib berish
  2. Katta ma'lumotlarni samarali uzatish zarurati, ya'ni. protokol paketlarni keraksiz qayta uzatishdan qochishi kerak
  3. Yetkazib berishni tasdiqlash mexanizmini bekor qilish mumkin bo'lishi kerak ("sof" UDP protokoli sifatida ishlash qobiliyati)
  4. Har bir xabarni tasdiqlash bilan buyruq rejimini amalga oshirish imkoniyati
  5. Protokol bo'yicha ma'lumotlarni uzatishning asosiy birligi xabar bo'lishi kerak
Bu talablar asosan RFC 908 va RFC 1151 da tavsiflangan Ishonchli maʼlumotlar protokoli talablari bilan bir xil va men ushbu protokolni ishlab chiqishni ushbu standartlarga asosladim.

Ushbu talablarni tushunish uchun ikkita tarmoq tugunlari o'rtasida TCP va UDP protokollari yordamida ma'lumotlarni uzatishning vaqt diagrammalarini ko'rib chiqaylik. Keling, ikkala holatda ham bitta paketni yo'qotamiz.

TCP orqali interaktiv bo'lmagan ma'lumotlarni uzatish:


Diagrammadan ko'rinib turibdiki, paket yo'qolgan taqdirda, TCP yo'qolgan paketni aniqlaydi va yo'qolgan segment raqamini so'rab jo'natuvchiga xabar beradi.

UDP protokoli orqali ma'lumotlarni uzatish:



UDP yo'qotishlarni aniqlash uchun hech qanday choralar ko'rmaydi. UDP protokolidagi uzatish xatolarini nazorat qilish to'liq dasturning javobgarligi.

TCP protokolidagi xatolarni aniqlash yakuniy tugun bilan ulanishni o'rnatish, ushbu ulanish holatini saqlash, har bir paket sarlavhasida yuborilgan baytlar sonini ko'rsatish va tasdiqlash raqamidan foydalangan holda kvitansiyalarni xabardor qilish orqali erishiladi.

Bundan tashqari, unumdorlikni yaxshilash uchun (ya'ni, tasdiqnoma olmasdan bir nechta segmentni yuborish) TCP protokoli uzatish oynasi deb ataladigan oynadan foydalanadi - segment jo'natuvchisi olishni kutayotgan ma'lumotlar baytlari soni.

TCP protokoli haqida batafsil ma'lumotni rfc 793 da, UDP ni esa rfc 768 da topish mumkin, ular aslida aniqlangan.

Yuqoridagilardan ko'rinib turibdiki, UDP orqali ishonchli xabar yetkazib berish protokolini yaratish uchun (bundan keyin biz qo'ng'iroq qilamiz) Ishonchli UDP), TCP ga o'xshash ma'lumotlarni uzatish mexanizmlarini amalga oshirish talab qilinadi. Aynan:

  • ulanish holatini saqlang
  • segment raqamlashdan foydalaning
  • maxsus tasdiqlash paketlaridan foydalaning
  • protokol o'tkazuvchanligini oshirish uchun soddalashtirilgan oyna mexanizmidan foydalaning
Bundan tashqari, talab qilinadi:
  • ulanish uchun resurslarni ajratish to'g'risida xabarning boshlanishi haqida signal
  • qabul qilingan xabarni yuqori oqim ilovasiga o‘tkazish va protokol resurslarini bo‘shatish uchun xabar tugashini bildiradi
  • "sof" UDP sifatida ishlashi uchun etkazib berishni tasdiqlash mexanizmini o'chirish uchun ulanishga xos protokolga ruxsat berish

Ishonchli UDP sarlavhasi

Eslatib o'tamiz, UDP datagramma IP-datagramma ichiga qamrab olingan. Ishonchli UDP paketi mos ravishda UDP datagrammasiga "o'ralgan".

Ishonchli UDP sarlavhasi inkapsulyatsiyasi:



Ishonchli UDP sarlavhasi tuzilishi juda oddiy:

  • Bayroqlar - paketlarni boshqarish bayroqlari
  • MessageType - yuqori oqim ilovalari tomonidan ma'lum xabarlarga obuna bo'lish uchun ishlatiladigan xabar turi
  • TransmissionId - uzatish raqami, qabul qiluvchining manzili va porti bilan birgalikda ulanishni noyob tarzda aniqlaydi.
  • PacketNumber - paket raqami
  • Variantlar - qo'shimcha protokol variantlari. Birinchi paket bo'lsa, u xabar hajmini ko'rsatish uchun ishlatiladi
Bayroqlar quyidagicha:
  • FirstPacket - xabarning birinchi paketi
  • NoAsk - xabar tasdiqlash mexanizmini yoqishni talab qilmaydi
  • LastPacket - oxirgi xabarlar paketi
  • RequestForPacket - tasdiq paketi yoki yo'qolgan paket uchun so'rov

Protokolning umumiy tamoyillari

Ishonchli UDP ikkita tugun o'rtasida xabarning uzatilishini kafolatlashga qaratilganligi sababli, u boshqa tomon bilan aloqa o'rnatishga qodir bo'lishi kerak. Ulanishni o'rnatish uchun jo'natuvchi tomon FirstPacket bayrog'i bilan paketni yuboradi, unga javob ulanish o'rnatilganligini bildiradi. Barcha javob paketlari yoki boshqacha aytganda, tasdiqlash paketlari har doim PacketNumber maydonining qiymatini muvaffaqiyatli kelgan paketlarning eng katta PacketNumber qiymatidan bir kattaroq qilib o'rnatadi. Birinchi yuborilgan paket uchun Options maydoni xabar hajmini yozadi.

Ulanishni yakunlash uchun shunga o'xshash mexanizm qo'llaniladi. LastPacket bayrog'i oxirgi xabarlar paketida o'rnatiladi. Javob paketi oxirgi paketning raqamini ko'rsatadi + 1, bu qabul qiluvchi tomon uchun xabarning muvaffaqiyatli yetkazib berilishini anglatadi.

Ulanishni o'rnatish va tugatish sxemasi:



Ulanish o'rnatilganda ma'lumotlarni uzatish boshlanadi. Ma'lumotlar paketlar bloklarida uzatiladi. Har bir blok, oxirgisidan tashqari, belgilangan miqdordagi paketlarni o'z ichiga oladi. Bu qabul qilish/uzatuvchi oynaning o'lchamiga teng. Oxirgi ma'lumotlar blokida kamroq paketlar bo'lishi mumkin. Har bir blokni yuborgandan so'ng, jo'natuvchi tomon etkazib berishni tasdiqlashni yoki yo'qolgan paketlarni qayta yetkazib berish so'rovini kutadi, javoblarni olish uchun qabul qilish/uzatish oynasini ochiq qoldiradi. Blokni yetkazib berishni tasdiqlashni olgandan so'ng, qabul qilish/uzatish oynasi siljiydi va keyingi ma'lumotlar bloki yuboriladi.

Qabul qiluvchi tomon paketlarni oladi. Har bir paket uzatish oynasiga to'g'ri kelishini tekshirish uchun tekshiriladi. Oynaga tushmaydigan paketlar va dublikatlar o'chiriladi. Chunki Oynaning o'lchami qat'iy va qabul qiluvchi va jo'natuvchi uchun bir xil bo'lganligi sababli, paketlar bloki yo'qolmagan holda etkazib berilganda, oyna keyingi ma'lumotlar blokining paketlarini qabul qilish uchun o'tkaziladi va etkazib berishni tasdiqlash yuboriladi. . Agar oyna ishchi taymer tomonidan belgilangan muddatda to'ldirilmasa, qaysi paketlar yetkazib berilmaganligini tekshirish uchun tekshiruv boshlanadi va qayta yetkazib berish uchun so'rovlar yuboriladi.

Qayta uzatish diagrammasi:


Protokolni kutish vaqti va taymerlar

Ulanishni o'rnatib bo'lmaydigan bir nechta sabablar mavjud. Misol uchun, agar qabul qiluvchi tomon oflayn bo'lsa. Bunday holda, ulanishni o'rnatishga urinayotganda, ulanish vaqt tugashi sababli yopiladi. Ishonchli UDP ilovasi vaqt tugashini belgilash uchun ikkita taymerdan foydalanadi. Birinchisi, ishchi taymer masofaviy xostdan javob kutish uchun ishlatiladi. Agar u yuboruvchi tomonda ishga tushirilsa, oxirgi yuborilgan paket qayta yuboriladi. Qabul qiluvchida taymer ishga tushirilsa, yo'qolgan paketlar tekshiriladi va qayta yetkazib berish uchun so'rovlar yuboriladi.

Ikkinchi taymer, agar tugunlar o'rtasida aloqa bo'lmasa, ulanishni yopish uchun kerak. Yuboruvchi tomon uchun u ish taymerining muddati tugagandan so'ng darhol boshlanadi va masofaviy tugundan javob kutadi. Belgilangan muddat ichida javob bo'lmasa, ulanish to'xtatiladi va resurslar chiqariladi. Qabul qiluvchi tomon uchun ulanishni yopish taymeri ish taymerini ikki marta ishga tushirgandan so'ng boshlanadi. Bu tasdiqlash paketini yo'qotishdan sug'urta qilish uchun zarur. Taymer yoqilganda, ulanish ham to'xtatiladi va resurslar chiqariladi.

Ishonchli UDP uzatish holati diagrammasi

Protokolning ishlash tamoyillari cheklangan holat mashinasida amalga oshiriladi, uning har bir holati ma'lum bir paketni qayta ishlash mantig'i uchun javobgardir.
Ishonchli UDP holat diagrammasi:

Yopiq- aslida holat emas, bu mashina uchun boshlang'ich va yakuniy nuqta. Davlat uchun Yopiq uzatishni boshqarish bloki olinadi, u asinxron UDP serverini amalga oshirib, paketlarni tegishli ulanishlarga yo'naltiradi va holatni qayta ishlashni boshlaydi.

FirstPacketSending– xabar yuborilayotganda chiquvchi ulanishning dastlabki holati.

Bu holatda oddiy xabarlar uchun birinchi paket yuboriladi. Yuborilganligi tasdiqlanmagan xabarlar uchun bu yagona holat - butun xabar unda yuboriladi.

SendingCycle– xabar paketlarini uzatishning asosiy holati.

Davlatdan unga o'tish FirstPacketSending birinchi xabar paketi yuborilgandan keyin amalga oshiriladi. Aynan shu holatda qayta uzatish uchun barcha tasdiqlar va so'rovlar keladi. Undan chiqish ikki holatda mumkin - xabar muvaffaqiyatli yetkazib berilganda yoki vaqt tugashi tufayli.

Birinchi paket qabul qilindi– xabarni qabul qiluvchining dastlabki holati.

U uzatish boshlanishining to'g'riligini tekshiradi, kerakli tuzilmalarni yaratadi va birinchi paketni olganligi to'g'risida tasdiqnoma yuboradi.

Bitta paketdan iborat bo'lgan va etkazib berishni tasdiqlamasdan yuborilgan xabar uchun bu yagona holat. Bunday xabarni qayta ishlagandan so'ng, ulanish yopiladi.

Yig'ish– xabar paketlarini qabul qilishning asosiy holati.

U paketlarni vaqtincha saqlashga yozadi, paketlar yo'qolganligini tekshiradi, paketlar bloki va butun xabarni yetkazib berish tasdiqlarini yuboradi va yo'qolgan paketlarni qayta yetkazib berish uchun so'rovlarni yuboradi. Agar butun xabar muvaffaqiyatli qabul qilinsa, ulanish ga o'tadi Bajarildi, aks holda vaqt tugashi chiqish sodir bo'ladi.

Bajarildi– agar butun xabar muvaffaqiyatli qabul qilingan bo'lsa, ulanishni yopish.

Ushbu holat xabarlarni yig'ish uchun va jo'natuvchiga yo'lda xabarni etkazib berishni tasdiqlash yo'qolgan holatlar uchun zarurdir. Bu holatdan kutish vaqti tugadi, lekin ulanish muvaffaqiyatli yopilgan deb hisoblanadi.

Kodga chuqurroq. Transmissiya boshqaruv bloki

Reliable UDP ning asosiy elementlaridan biri transmissiya boshqaruv blokidir. Ushbu blokning maqsadi joriy ulanishlar va yordamchi elementlarni saqlash, kiruvchi paketlarni tegishli ulanishlarga taqsimlash, ulanishga paketlarni jo'natish interfeysini ta'minlash va protokol API ni amalga oshirishdir. Uzatishni boshqarish bloki paketlarni UDP sathidan oladi va ularni qayta ishlash uchun davlat mashinasiga yo'naltiradi. Paketlarni qabul qilish uchun u asinxron UDP serverini amalga oshiradi.

ReliableUdpConnectionControlBlock sinfining ba'zi a'zolari:

ichki sinf ReliableUdpConnectionControlBlock: IDisposable ( // ko'rsatilgan kalit uchun bayt massivi. Kiruvchi xabarlarni umumiy ConcurrentDictionary yig'ish uchun ishlatiladi. , bayt> IncomingStreams ( get; private set;) // Belgilangan kalit uchun bayt massivi. Chiquvchi xabarlarni yuborish uchun ishlatiladi. umumiy bir vaqtning o'zida lug'at , bayt> OutcomingStreams ( get; private set; ) // belgilangan kalit uchun ulanish yozuvi. faqat o'qiladigan shaxsiy ConcurrentDictionary , ReliableUdpConnectionRecord> m_listOfHandlers; // xabar obunachilari ro'yxati. faqat o'qish uchun shaxsiy ro'yxat m_subscribers; // mahalliy rozetka xususiy soket m_socketIn; // kiruvchi xabarlar uchun port xususiy int m_port; // mahalliy IP-manzil shaxsiy IPA-manzil m_ipAddress; // mahalliy so'nggi nuqta ommaviy IPEndPoint LocalEndpoint ( get; private set; ) // oldindan ishga tushirilgan holatlar to'plami // davlat mashinasining holatlari ommaviy StatesCollection States ( get; private set; ) // tasodifiy sonlar generatori. TransmissionId xususiy faqat o'qish uchun RNGCryptoServiceProvider m_randomCrypto yaratish uchun foydalaniladi; //...)


Asinxron UDP serverini amalga oshirish:

private void Receive() ( EndPoint connectClient = new IPEndPoint(IPAddress.Any, 0); // har bir soket uchun yangi bufer yarating.BeginReceiveFrom bayt buferi = yangi bayt; // buferni asinxron usulga parametr sifatida o'tkazing. m_socketIn. BeginReceiveFrom(bufer, 0, buffer.Length, SocketFlags.None, ref connectClient, EndReceive, bufer); ) private void EndReceive(IAsyncResult ar) ( EndPoint connectClient = yangi IPEndPoint(IPAd0adt. by this); .m_socketIn .EndReceiveFrom(ar, ref connectClient); //paket qabul qilindi, keyingi Receive(); ni olishga tayyor // chunki bufer bilan bog'liq muammoni hal qilishning eng oddiy yo'li unga IAsyncResult dan havola olishdir. AsyncState bayt baytlari = ((bayt ) ar.AsyncState).Slice(0, bytesRead); // paket sarlavhasini oling ReliableUdpHeader sarlavhasi; agar (!ReliableUdpStateTools.ReadReliableUdpHeader(bayt, sarlavhadan tashqari)) ( // to'plam kiritildi - Discard it return; ) // Tuple paketi uchun ulanish yozuvini aniqlash uchun kalitni yarating kalit = yangi Tuple (connectedClient, header.TransmissionId); // mavjud ulanish yozuvini oling yoki yangisini yarating ReliableUdpConnectionRecord rekord = m_listOfHandlers.GetOrAdd(kalit, yangi ReliableUdpConnectionRecord(kalit, bu, header.ReliableUdpMessageType)); // davlat registriga ishlov berish uchun paketni ishga tushiring.State.ReceivePacket(yozuv, sarlavha, baytlar); )


Har bir xabarni uzatish uchun ulanish ma'lumotlarini o'z ichiga olgan tuzilma yaratiladi. Ushbu tuzilish deyiladi ulanish yozuvi.

ReliableUdpConnectionRecord sinfining ba'zi a'zolari:

ReliableUdpConnectionRecord ichki klassi: IDisposable ( // IncomingStream ( get; set; ) xabari bilan bayt massivi // cheklangan holat mashinasining holatiga havola umumiy ReliableUdpState State ( get; set; ) // yagona identifikatsiya qiluvchi juftlik ulanish yozuvi // umumiy Tupleni uzatuvchi boshqaruv blokida Kalit (get; private set;) // qabul qiluvchi oynaning pastki chegarasi public int WindowLowerBound; // uzatish oynasining o'lchami faqat o'qish uchun ochiq int WindowSize; // umumiy int SndNext yuborish uchun paket raqami; // yuborish uchun paketlar soni umumiy int NumberOfPackets; // uzatish raqami (bu Tuplening ikkinchi qismi) // har bir xabar o'zining faqat o'qish uchun ochiq Int32 TransmissionId ga ega; // masofaviy IP so'nggi nuqtasi - xabarni faqat o'qish uchun ochiq IPEndPoint RemoteClientning haqiqiy qabul qiluvchisi; // paket hajmi, IP darajasida parchalanishning oldini olish uchun // MTU dan oshmasligi kerak – (IP.Header + UDP.Header + RelaibleUDP.Header) public readonly int BufferSize; // uzatishni boshqarish bloki faqat umumiy o'qish ReliableUdpConnectionControlBlock Tcb; // BeginSendMessage/EndSendMessage umumiy faqat o'qish uchun AsyncResultSendMessage AsyncResult uchun asinxron operatsiya natijalarini qamrab oladi; // tasdiq paketlarini yubormang public bool IsNoAnswerNeeded; // oxirgi to'g'ri qabul qilingan paket (har doim eng yuqori raqamga o'rnatiladi) public int RcvCurrent; // yo'qolgan paketlar raqamlari bilan massiv public int LostPackets ( get; private set; ) // oxirgi paket kelganmi. Bool sifatida ishlatiladi. public int IsLastPacketReceived = 0; //...)

Kodga chuqurroq. Shtatlar

Davlatlar ishonchli UDP protokolining davlat mashinasini amalga oshiradilar, unda paketlarni asosiy qayta ishlash sodir bo'ladi. ReliableUdpState mavhum klassi holat uchun interfeysni taqdim etadi:

Protokolning butun mantig'i yuqorida keltirilgan sinflar tomonidan, masalan, ulanish yozuvidan ReliableUdp sarlavhasini yaratish kabi statik usullarni ta'minlovchi yordamchi sinf tomonidan amalga oshiriladi.

DisposeByTimeout usuli

DisposeByTimeout usuli vaqt tugashi bilan ulanish resurslarini chiqarish va xabar yetkazib berish muvaffaqiyatli/muvaffaqiyatsizligini bildirish uchun javobgardir.

ReliableUdpState.DisposeByTimeout:

himoyalangan virtual bekor DisposeByTimeout(obyekt yozuvi) ( ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) yozuvi; agar (record.AsyncResult!= null) ( connectionRecord.AsyncResult.SetAsCompleted(false); ) connectionecord.D);


Bu faqat shtatda bekor qilingan Bajarildi.

Completed.DisposeByTimeout:

himoyalangan bekor qilish bekor DisposeByTimeout(obyekt yozuvi) ( ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) yozuvi; // SetAsCompleted(connectionRecord); ) xabarni muvaffaqiyatli qabul qilish haqida xabar bering.

ProcessPackets usuli

ProcessPackets usuli paket yoki paketlarga qo'shimcha ishlov berish uchun javobgardir. To'g'ridan-to'g'ri yoki paketni kutish taymer orqali chaqiriladi.

Holatida Yig'ish usul bekor qilingan va yo'qolgan paketlarni tekshirish va holatga o'tish uchun javobgardir Bajarildi, oxirgi paketni olgan va tekshiruvdan muvaffaqiyatli o'tgan taqdirda

Assembling.ProcessPackets:

umumiy bekor qilish void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( if (connectionRecord.IsDone != 0) qaytarilsa; agar (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived)) //0 uchun yuborilgan so‘rovlar yo‘qolgan bo‘lsa !=e ( in connectionRecord.LostPackets dagi int seqNum ) ( if (seqNum != 0) ( ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum); ) ) // agar (!connectionRecord.TimerSeconcord). WaitForPacketsTimer .Change(connectionRecord.ShortTimerPeriod, -1); connectionRecord.TimerSecondTry = true; return; ) // agar WaitForPacketTimer-ni ishga tushirishga ikki marta urinishdan keyin // paketlarni qabul qilishning iloji bo'lmasa, ulanishni yakunlash taymerini ishga tushiring StartCloseWaitctionTimer(); ) else if (connectionRecord. IsLastPacketReceived != 0) // muvaffaqiyatli tekshirish ( // ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord) ma'lumotlar blokining olinganligi to'g'risidagi tasdiqni yuborish; connectionRecord.State = connectionRecord.Tcb.States.Completed; connectionRecord.State.ProcessPackets(connectionRecord); // resurslarni bir zumda amalga oshirish o'rniga // agar // oxirgi ack jo'natuvchiga etib bormasa va u yana so'rasa, biz taymerni ishga tushiramiz. // taymer ishga tushganda - resurslarni // Tugallangan holatda amalga oshiramiz, taymer usuli bekor qilinadi StartCloseWaitTimer(connectionRecord); ) // paketlar blokidagi ack boshqa yo'qolganida ham shunday bo'ladi ( if (!connectionRecord.TimerSecondTry) ( ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); connectionRecord.WaitForPacketsTimer.Change(connectionRecord, -Record.1); TimerSecondTry = true; return; ) // ulanishni yakunlash taymerini ishga tushiring StartCloseWaitTimer(connectionRecord); ) )


Holatida SendingCycle bu usul faqat taymerda chaqiriladi va oxirgi xabarni qayta yuborish, shuningdek ulanishni yopish taymerini ishga tushirish uchun javobgardir.

SendingCycle.ProcessPackets:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( if (connectionRecord.IsDone != 0) qaytsa; // oxirgi paketni qayta yuboring // (agar ulanish tiklansa, qabul qiluvchi tugun unga etib bormagan so'rovlarni qayta yuboradi) ReliableUdpStateTools.Send. ( connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1)); // CloseWait taymerini yoqing - ulanish tiklanishini yoki uning tugashini kutish uchun StartCloseWaitTimer(connectionRecord); )


Holatida Bajarildi Usul ishlaydigan taymerni to'xtatadi va xabarni abonentlarga uzatadi.

Bajarildi.ProcessPackets:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( if (connectionRecord.WaitForPacketsTimer != null) connectionRecord.WaitForPacketsTimer.Dispose(); //xabarni yig‘ing va uni obunachilarga yuboring ReliableUdpStateTools.SFromMe);

ReceivePacket usuli

Holatida Birinchi paket qabul qilindi Usulning asosiy vazifasi - birinchi xabarlar paketi haqiqatda interfeysga kelgan-kelmaganligini aniqlash, shuningdek, bitta paketdan iborat xabarni yig'ish.

FirstPacketReceived.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte payload) ( if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket)) // paketni bekor qilish qaytarilishini bildiradi; //Oxirgi packet va ikkita bayroqning kombinatsiyasi -OxirgiPacket. bizda bitta xabar bor, agar (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) & header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket)) ( ReliableUdpStateTools.CreateMessageFromSli(ReliableUdpStateTools. UdpHeader.Length, to'lov yuki.Length )); if ( !header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk)) ( // tasdiq paketini yuboring ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); ) SetAsCompleted(connectionRecord) dan barcha boshlang‘ich packet //0); agar (header.PacketNumber != 0) qaytish;ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);ReliableUdpStateTools.WritePacketData(connectionRecord, sarlavha, foydali yuk); // kelishi kerak bo'lgan paketlar sonini sanash connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((ikki) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize)); // oxirgi qabul qilingan paket (0) raqamini yozing connectionRecord.RcvCurrent = header.PacketNumber; // shundan so'ng biz qabul qiluvchi oynani 1 ta ulanishga ko'chirdikRecord.WindowLowerBound++; // holatini o'zgartirish connectionRecord.State = connectionRecord.Tcb.States.Assembling; // tasdiqlash mexanizmi talab qilinmasa // barcha tuzilmalarni chiqaradigan taymerni ishga tushiring, agar (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk)) ( connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimer, -1) ); ) else ( ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); connectionRecord.WaitForPacketsTimer = yangi taymer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1); ) )


Holatida SendingCycle bu usul yetkazib berishni tasdiqlash va qayta yuborish soʻrovlarini qabul qilish uchun bekor qilingan.

SendingCycle.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader sarlavhasi, bayt yuki) ( if (connectionRecord.IsDone != 0) qaytish; if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.Reque) final oynasining qaytishi //Packet) // Yetkazib berish tasdiqlarini olish uchun oyna chegarasi + 1 olinadi int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets)); // Agar (header.PacketNumber) oynaga bosilganligini tekshiring.< connectionRecord.WindowLowerBound || header.PacketNumber >windowHighestBound) qaytarish; connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); agar (connectionRecord.CloseWaitTimer != null) connectionRecord.CloseWaitTimer.Change(-1, -1); // oxirgi paketni tekshiring: agar (header.PacketNumber == connectionRecord.NumberOfPackets) ( // uzatish tugallandi Interlocked.Increment(ref connectionRecord.IsDone); SetAsCompleted(connectionRecord); return; ) // bu javob tasdiqlovchi birinchi paket if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1)) ( // oynani siljitmasdan SendPacket(connectionRecord); ) // maʼlumotlar blokini qabul qilish tasdigʻi boshqa kelgan boʻlsa (header.PacketNumber == windowHighestBound) ( // qabul qilish/uzatish oynasini siljitish connectionRecord.WindowLowerBound += connectionRecord.WindowSize; // uzatishni boshqarish massivini qayta o'rnatish connectionRecord.WindowControlArray.Nullify(); // paketlar blokini yuborish SendPacket( connectionRecord); ) // bu takroriy uzatish uchun so'rov - kerakli paketni boshqa yuboring ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber)); )


Holatida Yig'ish ReceivePacket usulida kiruvchi paketlardan xabarni yig'ishning asosiy ishi sodir bo'ladi.

Assembling.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte payload) ( if (connectionRecord.IsDone != 0) qaytish; // paketlarni qayta ishlash, agar (header.Flags.HasFlag(ReliableUdpConnectionRecord) // taymerni qayta o'rnating connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1); // ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload) ma'lumotlarini yozing; // agar biz oxirgi bayroqli paketni olgan bo'lsak - buni bajaring, bajaring if (header.Flags.HasFlag (ReliableUdpHeaderFlags.LastPacket)) ( connectionRecord.State = connectionRecord.Tcb.States.Completed; connectionRecord.State.ProcessPackets(connectionRecord); ) qaytish; ) // Oxirgi oynaning eng oxirgi chegarasini hisoblash = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1)); // agar (header.PacketNumber) oynaga tushmaydigan paketlarni olib tashlang< connectionRecord.WindowLowerBound || header.PacketNumber >(windowHighestBound)) qaytarish; // agar (connectionRecord.WindowControlArray.Contains(header.PacketNumber)) qaytarsa, dublikatlarni bekor qiling; // ma'lumotlarni yozish ReliableUdpStateTools.WritePacketData(connectionRecord, sarlavha, foydali yuk); //paket hisoblagich ulanishini ko'paytirishRecord.PacketCounter++; // joriy paket raqamini oyna boshqaruv massiviga yozing connectionRecord.WindowControlArray = header.PacketNumber; // eng katta kiruvchi paketni o'rnating, agar (header.PacketNumber > connectionRecord.RcvCurrent) connectionRecord.RcvCurrent = header.PacketNumber; // taymerlarni qayta ishga tushirish ulanishRecord.TimerSecondTry = noto'g'ri; connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); agar (connectionRecord.CloseWaitTimer != null) connectionRecord.CloseWaitTimer.Change(-1, -1); // agar oxirgi paket kelgan bo'lsa if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket)) ( Interlocked.Increment(ref connectionRecord.IsLastPacketReceived); ) // agar oynaning barcha paketlarini olgan bo'lsak, hisoblagichni qayta o'rnating // va tasdiqlash paketini yuboring, agar (connectionRecord.PacketCounter == connectionRecord.WindowSize) ( // hisoblagichni qayta o'rnating. connectionRecord.PacketCounter = 0; // uzatish oynasini o'zgartirdi connectionRecord.WindowLowerBound += connectionRecord.WindowSize; // uzatishni qayta o'rnating. boshqaruv massivi connectionRecord.WindowControlArray.Nullify() ; ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); ) // agar oxirgi paket allaqachon mavjud bo‘lsa, agar (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived)(Packet=Process!connect tekshiruvi) );)))


Holatida Bajarildi Usulning yagona vazifasi - xabarni muvaffaqiyatli yetkazib berishni takroriy tasdiqlashni yuborish.

Bajarildi.Paketni qabul qilish:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader sarlavhasi, bayt yuki) ( // Agar (header.Flags.HasFlag(ReliableUdpHeaderFlag)) oxirgi ack jo'natuvchiga etib bormaganligi sababli oxirgi paketni qayta yuborish ) ( ReliableUdpStateTools .SendAcknowledgePacket(connectionRecord); ) )

SendPacket usuli

Holatida FirstPacketSending Ushbu usul ma'lumotlarning birinchi paketini yoki agar xabar yetkazib berishni tasdiqlashni talab qilmasa, butun xabarni yuboradi.

FirstPacketSending.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord) ( connectionRecord.PacketCounter = 0; connectionRecord.SndNext = 0; connectionRecord.WindowLowerBound = 0; // agar tasdiqlash talab etilmasa, barcha paketlarni yuboring // va resurslarni chiqaring, agar (connectionRecord.IsNoed) (javob) / / Bu erda jo'natish xuddi shunday sodir bo'ladi ( ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools. CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord))); connectionRecord.Snd.N while(ext+connecord;Snd.)< connectionRecord.NumberOfPackets); SetAsCompleted(connectionRecord); return; } // создаем заголовок пакета и отправляем его ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord); ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header)); // увеличиваем счетчик connectionRecord.SndNext++; // сдвигаем окно connectionRecord.WindowLowerBound++; connectionRecord.State = connectionRecord.Tcb.States.SendingCycle; // Запускаем таймер connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1); }


Holatida SendingCycle bu usulda paketlar bloki yuboriladi.

SendingCycle.SendPacket:

umumiy bekor qilish bekor SendPacket(ReliableUdpConnectionRecord connectionRecord) ( // (connectionRecord.PacketCounter = 0; connectionRecord.PacketCounter) uchun paketlar blokini yuboring< connectionRecord.WindowSize && connectionRecord.SndNext < connectionRecord.NumberOfPackets; connectionRecord.PacketCounter++) { ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord); ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header)); connectionRecord.SndNext++; } // на случай большого окна передачи, перезапускаем таймер после отправки connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); if (connectionRecord.CloseWaitTimer != null) { connectionRecord.CloseWaitTimer.Change(-1, -1); } }

Kodga chuqurroq. Aloqalarni yaratish va o'rnatish

Endi biz asosiy holatlar va holatlarni qayta ishlash usullari bilan tanishganimizdan so'ng, biz protokolning ishlashining bir nechta misollarini biroz batafsilroq ko'rib chiqishimiz mumkin.

Oddiy sharoitlarda ma'lumotlarni uzatish diagrammasi:



Keling, yaratilishni batafsil ko'rib chiqaylik ulanish yozuvi birinchi paketni ulash va yuborish uchun. O'tkazish har doim xabarni yuborish uchun API usulini chaqiradigan dastur tomonidan boshlanadi. Keyinchalik, yangi xabar uchun ma'lumotlarni uzatishni boshlash uchun uzatishni boshqarish blokining StartTransmission usuli qo'llaniladi.

Chiquvchi ulanishni yaratish:

private void StartTransmission(ReliableUdpMessage ishonchli UdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult) ( if (m_isListenerStarted == 0) ( if (this.LocalEndpoint == null) ( yangi ArgumentNullExceptionni ishga tushirishdan oldin yoki "siz konstruksiyani ishga tushirishdan oldin" o'tkazing. xabar yuborish"); ) // kiruvchi paketlarni qayta ishlashni boshlang StartListener(LocalEndpoint); ) // EndPoint va ReliableUdpHeader.TransmissionId bayti asosida lug'at uchun kalit yarating transmissionId = yangi bayt; // tasodifiy sonni yarating transmissionId m_randomCrypto.GetBytes( transmissionId); Tuple kalit = yangi Tuple (endPoint, BitConverter.ToInt32(transmissionId, 0)); // ulanish uchun yangi yozuv yarating va // agar (!m_listOfHandlers.TryAdd(kalit, yangi ReliableUdpConnectionRecord(kalit, bu, ishonchliUdpMessage, asyncResult)) lug'atlarimizda shunday raqam bor yoki yo'qligini tekshiring) ( // agar mavjud bo'lsa. , keyin takrorlang tasodifiy sonni yarating m_randomCrypto.GetBytes(transmissionId); key = new Tuple (endPoint, BitConverter.ToInt32(transmissionId, 0)); agar (!m_listOfHandlers.TryAdd(kalit, yangi ReliableUdpConnectionRecord(kalit, bu, ishonchliUdpMessage, asyncResult))) // agar u yana muvaffaqiyatsiz bo'lsa, istisno qiling new ArgumentException("Pair TransmissionId & EndPoint allaqachon lug'atda mavjud"); ) // m_listOfHandlers.State.SendPacket(m_listOfHandlers) ishlov berish holatini ishga tushirdi; )


Birinchi paketni yuborish (FirstPacketSending holati):

Jamoatni bekor qilish HoDPPAckcket (AloqaRonncececordRecordcounge) (ulanishRecordscounter = 0; ulanish sierword = 0, ulanish ); ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header)); // counter connectionRecord.SndNext++ni oshiring; // oynani siljitish connectionRecord.WindowLowerBound++; //Sending ConnectionC.Record holatiga o'ting. .States.SendingCycle; // Taymer ulanishini ishga tushiringRecord.WaitForPacketsTimer = yangi taymer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1); )


Birinchi paketni yuborgandan so'ng, jo'natuvchi davlatga kiradi SendingCycle– paketni yetkazib berish tasdiqlanishini kuting.
Qabul qiluvchi tomon EndReceive usulidan foydalangan holda yuborilgan paketni qabul qiladi va yangisini yaratadi ulanish yozuvi va ushbu paketni oldindan tahlil qilingan sarlavha bilan qayta ishlash uchun davlat ReceivePacket usuliga o'tkazadi Birinchi paket qabul qilindi

Qabul qiluvchi tomonda ulanishni yaratish:

private void EndReceive(IAsyncResult ar) ( // ... // paket qabul qilindi // paket sarlavhasini tahlil qilish ReliableUdpHeader sarlavhasi; agar (!ReliableUdpStateTools.ReadReliableUdpHeader(baytlar, sarlavhadan tashqari)) ( // noto'g'ri paket keldi - uni bekor qiling. ; ) // Tuple paketi uchun ulanish yozuvini aniqlash uchun kalitni tuzing kalit = yangi Tuple (connectedClient, header.TransmissionId); // mavjud ulanish yozuvini oling yoki yangisini yarating ReliableUdpConnectionRecord rekord = m_listOfHandlers.GetOrAdd(kalit, yangi ReliableUdpConnectionRecord(kalit, bu, sarlavha. ReliableUdpMessageType)); // davlat registriga ishlov berish uchun paketni ishga tushiring.State.ReceivePacket(yozuv, sarlavha, baytlar); )


Birinchi paketni qabul qilish va tasdiqni yuborish (FirstPacketReceived holati):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte payload) ( if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket)) // paketni qaytarishni bekor qilish; // ... // barcha boshidan packet raqami 0 ; agar (header.PacketNumber != 0) qaytarilsa; // xabar qismlarini saqlash uchun massivni ishga tushiring ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header); // ReliableUdpStateTools. foydali yuk); // kelishi kerak bo'lgan paketlar sonini sanash connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize)); // raqamni yozib oling. oxirgi qabul qilingan paketning (0 ) connectionRecord.RcvCurrent = header.PacketNumber; // shundan so'ng qabul qiluvchi oyna 1 ulanishga siljiydiRecord.WindowLowerBound++; // holatini o'zgartiring connectionRecord.State = connectionRecord.Tcb.States.Assembling; agar (/*tasdiqlash mexanizmi kerak bo'lmasa*/) // ... else ( // tasdiqni yuborish ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); connectionRecord.WaitForPacketsTimer = yangi Taymer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1); ))

Kodga chuqurroq. Vaqt tugashi tufayli ulanish yopilyapti

Taym-autlarni boshqarish Ishonchli UDPning muhim qismidir. Oraliq tugun ishlamay qolgan va ikkala yo'nalishda ham ma'lumotlarni etkazib berish imkonsiz bo'lgan misolni ko'rib chiqing.

Vaqt tugashi bilan ulanishni yopish diagrammasi:



Diagrammadan ko'rinib turibdiki, jo'natuvchining ish taymeri paketlar blokini yuborgandan so'ng darhol boshlanadi. Bu holatning SendPacket usulida sodir bo'ladi SendingCycle.

Ish taymerini yoqish (SendingCycle holati):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord) ( // paketlar blokini yuborish // ... // connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1) yuborilgandan keyin taymerni qayta ishga tushiring); if (connectionRecord.CloseWait=! ) connectionRecord. CloseWaitTimer.Change(-1, -1); )


Taymer davrlari ulanish yaratilganda o'rnatiladi. Odatiy bo'lib, ShortTimerPeriod 5 soniya. Misolda u 1,5 soniyaga o'rnatiladi.

Kiruvchi ulanish uchun taymer oxirgi qabul qilingan ma'lumotlar paketini olgandan so'ng ishga tushadi; bu holatning ReceivePacket usulida sodir bo'ladi. Yig'ish

Ish taymerini yoqish (yig'ish holati):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader sarlavhasi, bayt yuki) ( // ... // taymerlarni qayta ishga tushiring connectionRecord.TimerSecondTry = noto'g'ri; connectionRecord.WaitForPacketsTimer.Change(connectionRecord.P1Change), mer! = null) connectionRecord.CloseWaitTimer.Change(-1, -1); // ... )


Ish taymerini kutish vaqtida kiruvchi ulanish ko'proq paketlarni olmagan. Taymer yo'qolgan paketlarni aniqlagan va birinchi marta qayta yetkazib berish so'rovlarini yuborgan ProcessPackets usulini ishga tushirdi va chaqirdi.

Qayta yetkazib berish so'rovlarini yuborish (yig'ish holati):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( // ... if (/*yo'qolgan paketlarni tekshirish */) ( // qayta yetkazib berish uchun so'rov yuborish // agar (!connectionRecord). TimerSecondTry) ( connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); connectionRecord.TimerSecondTry = true; return; ) // agar WaitForPacketTimer-ni ishga tushirishga ikki marta urinishdan keyin // paketlarni qabul qilishning iloji bo'lmasa, ulanishni ishga tushiring. StartCloseWaitTimer(connectionRecord); ) aks holda (/*oxirgi paket yetib keldi va muvaffaqiyatli tekshiring */) ( // ... StartCloseWaitTimer(connectionRecord); ) // agar paketlar blokiga ruxsat yo‘qolgan bo‘lsa ( if (! connectionRecord.TimerSecondTry) ( // ackni qayta yuborish connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); connectionRecord.TimerSecondTry = true; return; ) // ulanishni yakunlash taymerini ishga tushiring StartCloseWaitctionRecord(ne); ))


TimerSecondTry o'zgaruvchisi o'rnatilgan rost. Ushbu o'zgaruvchi ish taymerini qayta ishga tushirish uchun javobgardir.

Yuboruvchi tomonida ish taymeri ham ishga tushiriladi va oxirgi yuborilgan paket qayta yuboriladi.

Ulanishni yopish taymerini yoqish (SendingCycle holati):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( // ... // oxirgi paketni qayta yuborish // ... // CloseWait taymerini yoqing - ulanish tiklanishini yoki uning tugashini kutish uchun StartCloseWaitTimer(connectionRecord); )


Shundan so'ng, chiquvchi ulanishda ulanishni yopish taymerini ishga tushiradi.

ReliableUdpState.StartCloseWaitTimer:

Himoyalangan Vood StartClosewaittimer (ReliaBleudpconnection ConnectionReCord) (AGAR (ConnectionReCORD.CLOSEWATIMER! = NULL) ConnectionReCord.closewATIMER. O'zgartirish (ConnectionReCord.longtimerperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperperConnectionReCord. rd.Closewaitimer = Yangi taymer (Disposebytimeout, ConnectionReCord, Connection.longtimer Period, -1) ; )


Ulanishni yopish taymerining standart kutish vaqti 30 soniya.

Qisqa vaqtdan so'ng, qabul qiluvchi tomonda ishlaydigan taymer yana ishga tushadi, so'rovlar yana yuboriladi, shundan so'ng kiruvchi ulanish uchun ulanishni yopish taymerini ishga tushiradi.

Yopuvchi taymerlar ishga tushganda, ikkala ulanish yozuvlarining barcha resurslari chiqariladi. Yuboruvchi yuqori oqim ilovasiga yetkazib berishda xatolik haqida xabar beradi ( API ishonchli UDP ga qarang).

Resurslarga ulanish yozuvini chiqarish:

public void Dispose() ( sinab ko'ring ( System.Threading.Monitor.Enter(this.LockerReceive); ) nihoyat ( Interlocked.Increment(ref this.IsDone); if (WaitForPacketsTimer != null) ( WaitForPacketsTimer.Dispose(); ) agar (CloseWaitTimer != null) ( CloseWaitTimer.Dispose(); ) bayt oqim; Tcb.IncomingStreams.TryRemove(Kalit, chiquvchi oqim); oqim = null; Tcb.OutcomingStreams.TryRemove(Kalit, chiquvchi oqim); oqim = null; Tizim .Threading.Monitor.Exit(this.LockerReceive); ) )

Kodga chuqurroq. Ma'lumot uzatishni tiklash

Paket yo'qolgan taqdirda ma'lumotlarni uzatishni tiklash diagrammasi:



Taymer tugashi bilan ulanishni yopishda allaqachon muhokama qilinganidek, qabul qiluvchi taymer yo'qolgan paketlarni tekshiradi. Agar paketlar yo'qolsa, qabul qiluvchiga etib bormagan paketlar soni ro'yxati tuziladi. Bu raqamlar ma'lum bir ulanishning LostPackets qatoriga kiritiladi va qayta yetkazib berish uchun so'rovlar yuboriladi.

Paketlarni qayta etkazib berish uchun so'rovlarni yuborish (yig'ish holati):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord) ( //... if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0)) ( // paketlar yo‘qolgan, ular uchun ulanish uchun so‘rovlar yuborilgan. LostPackets ) ( if (seqNum != 0) ( ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum); ) ) // ... ) )


Yuboruvchi qayta yetkazib berish so'rovini qabul qiladi va etishmayotgan paketlarni qayta jo'natadi. Shuni ta'kidlash kerakki, hozirda jo'natuvchi allaqachon ulanishni yopish taymerini ishga tushirgan va so'rovni olgandan so'ng u qayta tiklanadi.

Yo'qotilgan paketlarni qayta yuborish (SendingCycle holati):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader sarlavhasi, bayt yuki) ( // ... connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1); //Aloqani yopish taymerini qayta o'rnating, agar (qo'shilgan bo'lsa). connectionRecord .CloseWaitTimer.Change(-1, -1); // ... // bu qayta uzatish uchun so'rov - boshqa kerakli paketni yuboring ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord)Nu); )


Qayta yuborilgan paket (diagrammada №3 paket) kiruvchi ulanish tomonidan qabul qilinadi. Qabul qilish oynasi to'lganligini va normal ma'lumotlarni uzatish qayta tiklanganligini tekshirish uchun tekshiriladi.

Qabul qilish oynasida urishlarni tekshirish (yig'ish holati):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader sarlavhasi, bayt yuki) ( // ... // paketlar hisoblagichini oshirish connectionRecord.PacketCounter++; // oyna boshqaruv massiviga joriy paket raqamini yozing connectionRecord.WindowControlArray = header.PacketNu; // qabul qilingan eng katta paketni o'rnating, agar (header.PacketNumber > connectionRecord.RcvCurrent) connectionRecord.RcvCurrent = header.PacketNumber; // taymerlarni qayta ishga tushiring connectionRecord.TimerSecondTry = noto'g'ri; connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPif (-1)); connectionRecord.CloseWaitTimer != null) connectionRecord.CloseWaitTimer.Change(-1, -1); // ... // agar biz barcha oyna paketlarini olgan bo'lsak, hisoblagichni qayta o'rnating // va agar (connectionRecord) tasdiqlovchi paketni yuboring. .PacketCounter == connectionRecord. WindowSize) ( // hisoblagichni qayta o'rnatish. connectionRecord.PacketCounter = 0; // uzatish oynasi ko'chirildi connectionRecord.WindowLowerBound += connectionRecord.WindowSize; //uzatishni boshqarish massivining ulanishini bekor qilishRecord.WindowControlArray.Nullify(); ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord); ) // ...)

Ishonchli UDP API

Ma'lumotlarni uzatish protokoli bilan o'zaro aloqada bo'lish uchun ochiq sinf Reliable Udp mavjud bo'lib, u uzatishni boshqarish blokining ustiga o'raladi. Bu erda eng muhim sinf a'zolari:
umumiy muhrlangan sinf ReliableUdp: IDisposable ( // mahalliy so'nggi nuqtani oladi umumiy IPEndPoint LocalEndpoint // ReliableUdp misolini yaratadi va // ko'rsatilgan IP manzilda // va portda kiruvchi paketlarni tinglashni boshlaydi. Port uchun 0 qiymati / dan foydalanishni anglatadi. / a dinamik ravishda ajratilgan umumiy port ReliableUdp (IPAddress localAddress, int port = 0) // kiruvchi xabarlarni qabul qilish uchun obuna bo'ling umumiy ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback qo'ng'iroq, ReliableUdpMessageTypes ipPEd.PointTypes ipPEd.PointTypes =ReliableUdpMessage, = null) // xabarlarni qabul qilish obunasini bekor qilish umumiy bekor Obunani bekor qilish(ReliableUdpSubscribeObject subscribeObject) // xabarni asinxron tarzda yuborish // Eslatma: XP va Server 2003 bilan moslik yo'qolmaydi, chunki .NET Framework 4.0 umumiy topshirig'i ishlatiladi SendMessageAsync(ReliableUdpMessage ishonchliUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken) // umumiy IAsyncResult BeginSendMessage(ReliableUdpMessage, IPEndPoint, ReliableUdpMessage, ReliableUdpMessage, IPEndPoint, masofaviy holat) sifatida asinxron xabar yuborishni boshlang. asinxron ommaviy yuborish EndSendMessage (IAsyncResult asyncResult ) // toza resurslar public void Dispose() )
Xabarlarni qabul qilish obuna orqali amalga oshiriladi. Qayta qo'ng'iroq qilish usuli uchun delegat imzosi:
umumiy delegat bekor ReliableUdpMessageCallback(ReliableUdpMessage ishonchliUdpMessage, IPEndPoint remoteClient);
Xabar:
umumiy sinf ReliableUdpMessage ( // xabar turi, oddiy sanab umumiy ReliableUdpMessageTypes Type ( get; private set; ) // xabar ma'lumotlari umumiy bayti Body (ol; private set; ) // agar rost bo'lsa, etkazib berishni tasdiqlash mexanizmi o'chiriladi / / ma'lum bir xabarni uzatish uchun umumiy bool NoAsk (ol; shaxsiy to'plam; ) )
Muayyan xabar turiga va/yoki ma'lum bir jo'natuvchiga obuna bo'lish uchun ikkita ixtiyoriy parametr ishlatiladi: ReliableUdpMessageTypes messageType va IPEndPoint ipEndPoint.

Xabar turlari:
umumiy enum ReliableUdpMessageTypes: qisqa ( // Har qanday = 0, // STUN serveriga so'rov StunRequest = 1, // STUN serveridan javob StunResponse = 2, // Fayl uzatish FileTransfer =3, // ... )

Xabar asinxron tarzda yuboriladi; bu maqsadda protokol asinxron dasturlash modelini amalga oshiradi:
umumiy IAsyncResult BeginSendMessage(ReliableUdpMessage ishonchliUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Ob'ekt holati)
Xabarni yuborish natijasi rost bo'ladi - agar xabar qabul qiluvchiga muvaffaqiyatli etib kelgan bo'lsa va noto'g'ri bo'lsa - ulanish vaqt tugashi tufayli yopilgan bo'lsa:
public bool EndSendMessage (IAsyncResult asyncResult)

Xulosa

Ushbu maqola doirasida ko'p narsa tasvirlanmagan. Mavzuni muvofiqlashtirish mexanizmlari, istisnolar va xatolarni qayta ishlash, asinxron xabar yuborish usullarini amalga oshirish. Ammo protokolning yadrosi, paketlarni qayta ishlash mantig'ining tavsifi, ulanishni o'rnatish va taym-autlarni ishlab chiqish siz uchun aniqroq bo'lishi kerak.

Ishonchli yetkazib berish protokolining ko'rsatilgan versiyasi ancha mustahkam va moslashuvchan bo'lib, ilgari belgilangan talablarga javob beradi. Ammo shuni qo'shimcha qilmoqchimanki, tasvirlangan dasturni yaxshilash mumkin. Masalan, o'tkazish qobiliyatini oshirish va taymer davrlarini dinamik ravishda o'zgartirish uchun siz protokolga toymasin oyna va RTT kabi mexanizmlarni qo'shishingiz mumkin, shuningdek ulanish tugunlari o'rtasida MTU ni aniqlash mexanizmini amalga oshirish foydali bo'ladi (lekin faqat jo'natish holatida). katta xabarlar).

E'tiboringiz uchun rahmat, fikr va mulohazalaringizni kutaman.
CLR asinxron dasturlash modelini amalga oshirish va IAsyncResult dizayn namunasini qanday amalga oshirish kerak

  • Asinxron dasturlash modelini vazifaga asoslangan asinxron naqshga o'tkazish (APM dan TAPga):
    TPL va an'anaviy .NET asinxron dasturlash
    Boshqa asinxron naqshlar va turlar bilan o'zaro ishlash
  • Yangilash: Mayorovp va sidristijga interfeysga vazifa qo'shish g'oyasi uchun rahmat. Kutubxonaning eski OT bilan mosligi ta'sir qilmaydi, chunki 4-chi ramka XP va 2003 serverlarini qo'llab-quvvatlaydi.

    UDP ma'lumotlar ishonchliligi, tartibliligi yoki yaxlitligini ta'minlash uchun qo'l siqishlarsiz oddiy uzatish modelidan foydalanadi. Shunday qilib, UDP ishonchsiz xizmatni taqdim etadi va datagramlar ishlamay qolishi, takrorlanishi yoki izsiz yo'qolishi mumkin. UDP xatolarni tekshirish va tuzatish zarur emasligini yoki dastur tomonidan bajarilishi kerakligini anglatadi. Vaqtga sezgir ilovalar ko'pincha UDP dan foydalanadi, chunki kechiktirilgan paketlarni kutishdan ko'ra paketlarni tashlab yuborish afzalroqdir, bu real vaqtda tizimlarda mumkin emas. Agar tarmoq interfeysi qatlamidagi xatolarni tuzatish zarur bo'lsa, dastur ushbu maqsad uchun mo'ljallangan TCP yoki SCTP dan foydalanishi mumkin.

    UDP ning fuqaroligi bo'lmagan protokol sifatidagi xususiyati DNS va IPTV, IP orqali ovoz, IP tunnel protokollari va ko'plab onlayn o'yinlar kabi oqimli media ilovalari kabi juda ko'p mijozlarning kichik so'rovlariga javob beradigan serverlar uchun ham foydalidir.

    Xizmat portlari

    UDP yuqori qatlam protokoliga hech qanday xabar yetkazib berish kafolatlarini bermaydi va yuborilgan xabarlar holatini saqlamaydi. Shu sababli, UDP ba'zan Ishonchsiz Datagram Protocol deb ataladi.

    Tekshirish summasini hisoblashdan oldin, UDP xabari oxirida 16 bitga ko'payadigan uzunlikdagi nol bitlar bilan to'ldiriladi (psevdo-sarlavha va qo'shimcha nol bitlar xabar bilan birga yuborilmaydi). Nazorat summasini hisoblash paytida UDP sarlavhasidagi nazorat summasi maydoni yuborilgan xabarlar null sifatida qabul qilinadi.

    Tekshirish summasini hisoblash uchun psevdo-sarlavha va UDP xabari so'zlarga bo'linadi (1 so'z = 2 bayt (oktet) = 16 bit). Keyin bitli to'ldiruvchi barcha so'zlar yig'indisining bit bo'yicha to'ldiruvchisi hisoblanadi. Natija UDP sarlavhasidagi tegishli maydonga yoziladi.

    Nolga teng nazorat summasi zaxiralangan va bu datagramda nazorat summasi yo'qligini bildiradi. Hisoblangan nazorat summasi nolga teng bo'lsa, maydon ikkilik birliklar bilan to'ldiriladi.

    Xabar kelib tushganda, qabul qiluvchi nazorat summasini yana hisoblab chiqadi (nazorat summasi maydonini hisobga olgan holda) va natijada o'n olti birlik ikkilik soni (ya'ni 0xffff) bo'lsa, nazorat summasi birlashtirilgan deb hisoblanadi. Agar summa qo'shilmasa (ma'lumotlar uzatish paytida buzilgan bo'lsa), datagram yo'q qilinadi.

    Tekshirish summasini hisoblash misoli

    Misol uchun, bir nechta 16 bitli so'zlarning nazorat summasini hisoblaylik: 0x398a, 0xf802, 0x14b2, 0xc281. Bitta to‘ldiruvchi bilan ularning yig‘indisini toping.
    0x398a + 0xf802 = 0x1318c → 0x318d
    0x318d + 0x14b2 = 0x0463f → 0x463f
    0x463f + 0xc281 = 0x108c0 → 0x08c1
    Endi biz olingan natijaning bitli to'ldiruvchisini topamiz:

    0x08c1 = 0000 1000 1100 0001 → 1111 0111 0011 1110 = 0xf73e yoki, aks holda - 0xffff - 0x08c1 = 0xf73e . Bu kerakli nazorat summasi.

    Tekshirish summasini hisoblashda haqiqiy IPv6 sarlavhasini taqlid qiluvchi psevdo-sarlavha yana ishlatiladi:

    Bitlar 0 – 7 8 – 15 16 – 23 24 – 31
    0 Manba manzili
    32
    64
    96
    128 Qabul qiluvchining manzili
    160
    192
    224
    256 UDP uzunligi
    288 Nollar Keyingi sarlavha
    320 Manba porti Belgilangan port
    352 Uzunlik Tekshirish summasi
    384+
    Ma'lumotlar

    Manba manzili IPv6 sarlavhasi bilan bir xil. Qabul qiluvchining manzili - oxirgi oluvchi; agar IPv6 paketida Marshrutlash sarlavhasi bo'lmasa, bu IPv6 sarlavhasidan maqsad manzil bo'ladi, aks holda boshlang'ich tugunda marshrutlash sarlavhasining oxirgi elementining manzili va qabul qiluvchi tugunda, IPv6 sarlavhasidan maqsad manzil. Keyingi sarlavha qiymati protokol qiymatiga teng - UDP uchun 17. UDP uzunligi - UDP sarlavhasi va ma'lumotlarining uzunligi.

    Ishonchlilik va ortiqcha yuk muammolarini hal qilish

    Ishonchliligi yo'qligi sababli, UDP ilovalari ba'zi yo'qotishlar, xatoliklar va takrorlanishlarga tayyorlanishi kerak. Ulardan ba'zilari (masalan, TFTP) ixtiyoriy ravishda dastur darajasida elementar ishonchlilik mexanizmlarini qo'shishi mumkin.

    Ammo ko'pincha bunday mexanizmlar UDP ilovalari tomonidan ishlatilmaydi va hatto ularga aralashadi. Oqimli media, real vaqtda multiplayer o'yinlar va VoIP ko'pincha UDP protokolidan foydalanadigan ilovalarga misoldir. Ushbu maxsus ilovalarda paketlarni yo'qotish odatda katta muammo emas. Agar dastur yuqori darajadagi ishonchlilikni talab qilsa, u holda boshqa protokol (TCP) yoki o'chirish kodlaridan foydalanish mumkin.

    Kattaroq potentsial muammo shundaki, TCP dan farqli o'laroq, UDP-ga asoslangan ilovalar tiqilib qolishni nazorat qilish va oldini olish mexanizmlariga ega emas. Mavjud tarmoqli kengligining muhim qismini iste'mol qiladigan tiqilinchga sezgir UDP ilovalari Internet barqarorligini buzishi mumkin.

    Tarmoq mexanizmlari nazoratsiz, yuqori tezlikdagi yuklar paytida tirbandlikning mumkin bo'lgan ta'sirini kamaytirish uchun ishlab chiqilgan. Paket navbatlari va tushirish texnikasidan foydalanadigan marshrutizatorlar kabi tarmoq elementlari ko'pincha haddan tashqari UDP trafigini sekinlashtiradigan yagona vositadir. DCCP (Datagram Congestion Control Protocol) ushbu potentsial muammoni qisman hal qilish uchun oxirgi xostga oqimli media kabi yuqori tezlikdagi UDP oqimlari uchun tiqilib qolishni nazorat qilish mexanizmlarini qo'shish orqali ishlab chiqilgan.

    Ilovalar

    Ko'pgina asosiy Internet ilovalari UDP dan foydalanadi, jumladan DNS (bu erda so'rovlar tez bo'lishi kerak va faqat bitta so'rovdan keyin bitta javob paketidan iborat bo'lishi kerak), Simple Network Management Protocol (SNMP), Routing Information Protocol (RIP), Dynamic Host Configuration (DHCP) .

    Ovozli va video trafik odatda UDP yordamida amalga oshiriladi. Jonli video va audio oqim protokollari tasodifiy paket yo'qotishlarini bartaraf etish uchun mo'ljallangan, shuning uchun yo'qolgan paketlar qayta uzatilganda katta kechikishlar o'rniga sifat biroz yomonlashadi. TCP va UDP ikkalasi ham bir tarmoqda ishlaganligi sababli, ko'pgina kompaniyalar ushbu real vaqtda ilovalardan UDP trafigining yaqinda o'sishi ma'lumotlar bazasi yoki buxgalteriya tizimlari kabi TCP ilovalarining ishlashiga to'sqinlik qilayotganini payqashdi. Ishbilarmonlik va real vaqtda ilovalar kompaniyalar uchun muhim bo'lganligi sababli, muammolarga sifatli yechimlarni ishlab chiqish ba'zilar tomonidan ustuvor vazifa sifatida ko'riladi.

    UDP va TCP ni solishtirish

    TCP ulanishga yo'naltirilgan protokol bo'lib, ikkita xost o'rtasida aloqa o'rnatish uchun "qo'l siqish" talab qilinadi. Ulanish o'rnatilgandan so'ng, foydalanuvchilar har ikki yo'nalishda ham ma'lumotlarni yuborishlari mumkin.

    • Ishonchlilik- TCP xabarni tasdiqlash, qayta uzatish va kutish vaqtini boshqaradi. Xabarni etkazish uchun ko'p urinishlar qilingan. Agar u yo'lda yo'qolib qolsa, server yo'qolgan qismni yana so'raydi. TCP-da etishmayotgan ma'lumotlar yoki (bir nechta vaqt tugashi holatlarida) uzilgan ulanishlar yo'q.
    • Tartiblilik- agar ikkita xabar ketma-ket yuborilsa, birinchi xabar birinchi bo'lib qabul qiluvchi ilovaga etib boradi. Agar ma'lumotlar bo'laklari noto'g'ri tartibda kelsa, TCP barcha ma'lumotlar buyurtma qilinmaguncha va dasturga yuborilgunga qadar tartibsiz ma'lumotlarni buferga yuboradi.
    • Og'irlik- TCP ma'lumotlarni yuborishdan oldin rozetkaga ulanishni o'rnatish uchun uchta paketni talab qiladi. TCP ishonchlilik va tirbandlikni nazorat qiladi.
    • Ip o'tkazish- ma'lumotlar baytlar oqimi sifatida o'qiladi, xabar chegaralari yoki segmentlari uchun maxsus belgilar uzatilmaydi.

    UDP oddiyroq, xabarga asoslangan, ulanishsiz protokoldir. Ushbu turdagi protokollar ikkita xost o'rtasida maxsus aloqa o'rnatmaydi. Aloqa axborotni qabul qiluvchining tayyorligi yoki holatini tekshirmasdan, manbadan qabul qiluvchiga bir yo'nalishda uzatish orqali erishiladi. Biroq, TCP ga nisbatan UDP ning asosiy afzalligi Internet protokoli (VoIP) ilovalarida bo'lib, bu erda har qanday qo'l siqish yaxshi ovozli aloqani oldini oladi. VoIP-da oxirgi foydalanuvchilar real vaqt rejimida xabar qabul qilinganligi to'g'risida kerakli tasdiqni taqdim etishlari kutiladi.

    • Ishonchsiz- xabar yuborilganda, uning manzilga etib borishi noma'lum - u yo'lda adashib qolishi mumkin. Tasdiqlash, qayta uzatish, vaqt tugashi kabi tushunchalar mavjud emas.
    • Tartibsizlik- agar bitta qabul qiluvchiga ikkita xabar yuborilsa, ularning maqsadga erishish tartibini oldindan aytib bo'lmaydi.
    • Yengillik- xabarlarni buyurtma qilish, ulanishlarni kuzatish va h.k. Bu IP-da yaratilgan kichik transport qatlami.
    • Datagrams- paketlar alohida-alohida yuboriladi va ular kelgan taqdirdagina yaxlitligi tekshiriladi. Paketlar qabul qilingandan so'ng hurmat qilinadigan ma'lum chegaralarga ega, ya'ni qabul qiluvchi rozetkadagi o'qish operatsiyasi xabarni dastlab yuborilganidek ishlab chiqaradi.
    • Haddan tashqari yuk nazorati yo'q- UDPning o'zi tirbandlikdan qochmaydi. Yuqori o'tkazish qobiliyatiga ega ilovalar, agar ular ilova darajasidagi boshqaruvlarni amalga oshirmasa, tiqilib qolishiga olib kelishi mumkin.

    RFC havolalari

    • RFC 768 - Foydalanuvchi Datagram Protokoli
    • RFC 2460 – Internet protokoli spetsifikatsiyasi 6-versiya (IPv6)
    • RFC 2675 - IPv6 Jumbograms
    • RFC 4113 - UDP uchun boshqaruv ma'lumotlar bazasi
    • RFC 5405 - Ilova dizaynerlari uchun Unicast UDP foydalanish bo'yicha ko'rsatmalar

    Shuningdek qarang

    Havolalar

    • Kurose, J.F.; Ross, K. V. (2010). Kompyuter tarmoqlari: yuqoridan pastga yondashuv (5-nashr). Boston, MA: Pearson Education. ISBN 978-0-13-136548-3.
    • Foruzan, B.A. (2000). TCP/IP: Protocol Suite, 1-nashr. Yangi Dehli, Hindiston: Tata McGraw-Hill Publishing Company Limited.
    • [elektron pochta himoyalangan]. "UDP protokoli haqida umumiy ma'lumot". IPv6.com. 2011-yil 17-avgustda olindi.
    • Klark, M.P. (2003). Ma'lumotlar tarmoqlari IP va Internet, 1-nashr. G'arbiy Sasseks, Angliya: John Wiley & Sons Ltd.
    • Postel, J. (1980 yil avgust). RFC 768: Foydalanuvchi Datagram Protokoli. Internet muhandisligi ishchi guruhi. http://tools.ietf.org/html/rfc768 dan olindi
    • Deering S. & Hinden R. (1998 yil dekabr). RFC 2460: Internet protokoli, 6-versiya (IPv6) spetsifikatsiyasi. Internet muhandisligi ishchi guruhi. http://tools.ietf.org/html/rfc2460 dan olindi
    • "UDP ning ma'lumotlar ilovalariga ta'siri". networkperformancedaily.com. 2011-yil 17-avgustda olindi.
    • D. Komer. TCP/IP yordamida Internetda ishlash. 11-bob. UDP protokoli.

    Xayrli kun, aziz o'quvchilar.
    Ommabop talabga ko'ra, bugun men siz uchun kompyuter tarmog'i atamalarining asoslari bilan tanishtiradigan maqolani nashr etaman, xususan:

    • Tarmoq protokollari - bu qo'rqinchli nomlar nima va ular nima uchun ishlatiladi?
    • UDP, TCP, ICMP - nima, nima uchun va qanday farq
    • Hammaning IP manzili bor, lekin nima uchun bu narsa hamma ham bilmaydi :-)
    • Manzil niqobi (quyi tarmoq)
    • Gateway
    • Marshrutlash jadvallari haqida bir necha so'z
    • Portlar - ular aslida nima?
    • MAC manzili

    Shunga o'xshash.

    Maqola, menimcha, yoshu qari hamma uchun foydali bo'ladi, chunki u juda ko'p g'alati, tushunarsiz harakatlar yoki so'zlar to'plamini emas, balki hech bo'lmaganda tushunarli tilda taqdim etilgan ma'lumotlar blokini o'z ichiga oladi. Bularning barchasi qanday ishlashini va nima uchun kerakligini tushunasiz. Bor.

    Tarmoq protokollari TCP/IP, NWLink IPX/SPX, NetBEUI

    Keling, tarmoq protokoli nima va u nima uchun ishlatilishidan boshlaylik.
    Tarmoq protokoli kompyuterlar o'rtasida aloqa qilish uchun amalga oshiriladigan dasturiy ta'minot qoidalari to'plamidir. Kompyuterlar bir-biri bilan gaplashadigan va ma'lumot uzatadigan til turi. Ilgari, kompyuterlar, aytganda, Windowsning ko'p tilli va eski versiyalarida protokollarning butun to'plamidan foydalanilgan - TCP/IP, NWLink IPX/SPX, NetBEUI. Endi biz umumiy kelishuvga erishdik va standart faqat TCP/IP protokolidan foydalanishga aylandi, shuning uchun u bundan keyin ham muhokama qilinadi.

    TCP/IP haqida gapirganda, ular odatda bu nom bilan juda ko'p turli xil... qoidalarni yoki aytaylik, ushbu protokol yordamida (yoki foydalanish uchun) belgilangan standartlarni nazarda tutadilar. Masalan, pochta serverlari o'rtasida xabarlar almashinadigan qoidalar mavjud va oxirgi foydalanuvchi o'z pochta qutisiga xatlarni qabul qiladigan qoidalar mavjud. Video konferentsiyalarni o'tkazish qoidalari va Internet orqali "telefon" suhbatlarini tashkil qilish qoidalari mavjud. Darhaqiqat, bu qoidalar ham emas ... Ko'proq grammatika yoki boshqa narsa kabi. Xo'sh, bilasizmi, ingliz tilida dialoglarni qurish uchun bitta tuzilma mavjud, frantsuz tilida boshqasi bor ... Demak, TCP/IP da shunga o'xshash narsa bor, ya'ni. Turli xil grammatik qoidalarning ma'lum bir to'plami aniq ajralmas TCP/IP protokoli yoki aniqrog'i, TCP/IP protokoli stegi.

    Tarmoq protokollari UDP, TCP, ICMP

    TCP/IP protokoli doirasida ma'lumotlarni uzatish uchun ishlatiladigan protokollar TCP va UDP hisoblanadi. Ko'pchilik TCP va UDP portlari mavjudligini eshitgan bo'lishi mumkin, ammo farq nima ekanligini va nima ekanligini hamma ham bilmaydi. Shunday qilib..

    TCP protokoli (Transmission Control Protocol) orqali ma'lumotlarni uzatish ma'lumotni qabul qilishni tasdiqlashni talab qiladi. "Xo'sh, ular aytishadi, siz buni oldingizmi? - Tushundim!" Agar uzatuvchi tomon belgilangan muddatda kerakli tasdiqni olmasa, ma'lumotlar qayta uzatiladi. Shuning uchun TCP ulanishga asoslangan protokol hisoblanadi, UDP (User Datagram Protocol) esa bunday emas. UDP qabul qilishni tasdiqlash talab etilmagan hollarda qo'llaniladi (masalan, DNS so'rovlari yoki IP-telefoniya (ularning Skype taniqli vakili)). Ya'ni, farq qabul qilishning tasdiqlanishi mavjudligidadir. "Hammasi shu!" Ko'rinadi, lekin amalda bu muhim rol o'ynaydi.

    Tarmoq parametrlari haqidagi ma'lumotlarni uzatish uchun ishlatiladigan ICMP protokoli (Internet Control Message Protocol) ham mavjud. kabi foydali paket turlarini o'z ichiga oladi ping, erishib bo'lmaydigan masofa, TTL va boshqalar.

    IP manzil nima

    Har bir inson bor, lekin hamma ham bu qanday manzil ekanligini va nima uchun usiz yashash mumkin emasligini bilmaydi. Men sizga aytyapman.

    IP manzil - tarmoqdagi kompyuterni aniqlash uchun ishlatiladigan 32 bitli raqam. Olingan qiymatlarni nuqta bilan ajratib, ushbu raqamning har bir oktetining o'nlik qiymatlarida manzilni yozish odatiy holdir. Masalan, 192.168.101.36

    IP-manzillar noyobdir, ya'ni har bir kompyuterning o'ziga xos raqamlar kombinatsiyasi mavjud va tarmoqda bir xil manzilga ega ikkita kompyuter bo'lishi mumkin emas. IP-manzillar markazlashtirilgan tarzda taqsimlanadi, internet-provayderlar o'z ehtiyojlariga muvofiq milliy markazlarga arizalar kiritadilar. Provayderlar tomonidan qabul qilingan manzil diapazonlari mijozlar o'rtasida yanada taqsimlanadi. Mijozlar, o'z navbatida, o'zlari provayder sifatida harakat qilishlari va olingan IP manzillarini subklientlar va boshqalar o'rtasida taqsimlashlari mumkin. IP manzillarini tarqatishning ushbu usuli bilan kompyuter tizimi noyob IP-manzilga ega bo'lgan kompyuterning "joylashuvini" aniq biladi; - unga ma'lumotlarni "egasi" tarmog'iga yuborish kifoya, va provayder, o'z navbatida, manzilni tahlil qiladi va manzillarning bu qismi kimga berilganligini bilib, ma'lumotni keyingi egasiga yuboradi. ma'lumotlar maqsadli kompyuterga yetib borguncha IP-manzil pastki diapazoni.

    Mahalliy tarmoqlarni qurish uchun maxsus manzil diapazonlari ajratilgan. Bular 10.x.x.x, 192.168.x.x, 10.x.x.x, 172.16.x.x dan 172.31.x.x, 169.254.x.x gacha bo'lgan manzillar, bu erda x 0 dan 254 gacha bo'lgan istalgan sonni bildiradi. Belgilangan manzillardan uzatiladigan paketlar yo'naltirilmaydi, boshqacha qilib aytganda, ular Internet orqali yuborilmaydi va shuning uchun turli xil mahalliy tarmoqlardagi kompyuterlar belgilangan diapazonlardan mos keladigan manzillarga ega bo'lishi mumkin. Ya'ni, kompaniya MChJ "Horns and Hooves" va MChJ "Vasya and Company" 192.168.0.244 manzilli ikkita kompyuterga ega bo'lishi mumkin, ammo Internet-provayderdan olingan 85.144.213.122 manzillari bilan, aytaylik, mumkin emas, chunki . Internetda ikkita bir xil IP manzil bo'lishi mumkin emas. Bunday kompyuterlardan Internetga va orqaga ma'lumot yuborish uchun Internet bilan ishlashda mahalliy manzillarni haqiqiylarga almashtiradigan maxsus dasturlar va qurilmalar qo'llaniladi. Boshqacha qilib aytganda, ma'lumotlar tarmoqqa mahalliy manzildan emas, balki haqiqiy IP-manzildan yuboriladi. Bu jarayon foydalanuvchi tomonidan sezilmasdan sodir bo'ladi va manzil tarjimasi deb ataladi. Shuni ham ta'kidlashni istardimki, bitta tarmoq ichida, aytaylik, Horns and Hooves MChJ kompaniyasida bitta mahalliy IP manzilga ega ikkita kompyuter bo'lishi mumkin emas, ya'ni yuqoridagi misolda 192.168.0.244 manzilli bitta kompyuter nazarda tutilgan edi. bir kompaniyada, ikkinchisi boshqasida bir xil manzilga ega. Xuddi shu kompaniyada 192.168.0.244 manzilli ikkita kompyuter bir-biriga mos kelmaydi.

    Ehtimol siz tashqi IP va ichki IP, doimiy (statik IP) va o'zgaruvchan (dinamik) IP kabi atamalarni eshitgansiz. Ular haqida qisqacha:

    • tashqi IP - bu provayderingiz sizga bergan IP-dir, ya'ni. Sizning Internetdagi yagona manzilingiz, masalan, 85.144.24.122
    • ichki IP - mahalliy IP, ya'ni. Mahalliy tarmoqdagi IP manzilingiz, masalan, 192.168.1.3
    • statik IP - har bir ulanish bilan o'zgarmaydigan IP, ya'ni. Sizga qat'iy va abadiy tayinlangan
    • dinamik IP har bir ulanish bilan o'zgarib turadigan suzuvchi IP-manzildir

    IP-manzilingiz turi (statik yoki dinamik) provayderingiz sozlamalariga bog'liq.

    Manzil niqobi nima (quyi tarmoq)

    Bir tashkilotning IP-manzillarining bir qismini, boshqasining bir qismini va hokazolarni tanlash mumkin bo'lishi uchun quyi tarmoq tushunchasi kiritildi. Quyi tarmoq - bir xil mahalliy tarmoqqa tegishli deb hisoblangan IP-manzillar qatori. Mahalliy tarmoqda ishlashda ma'lumot to'g'ridan-to'g'ri qabul qiluvchiga yuboriladi. Agar ma'lumotlar mahalliy tarmoqqa tegishli bo'lmagan IP-manzilli kompyuterlar uchun mo'ljallangan bo'lsa, unda bir tarmoqdan boshqasiga yo'naltirish marshrutini hisoblash uchun unga maxsus qoidalar qo'llaniladi.

    Maska - bu dasturga berilgan guruhga (pastki tarmoq) nechta kompyuter kiritilganligini bildiruvchi parametr. Manzil maskasi IP-manzilning o'zi bilan bir xil tuzilishga ega: u har biri 0 dan 255 gacha bo'lishi mumkin bo'lgan to'rtta guruh raqamlar to'plamidir. Bunday holda, niqob qiymati qanchalik past bo'lsa, ushbu kichik tarmoqqa ko'proq kompyuterlar ulanadi. Kichik kompaniya tarmoqlari uchun niqob odatda 255.255.255.x (masalan, 255.255.255.224) hisoblanadi. Tarmoq niqobi IP manzili bilan birga kompyuterga tayinlanadi. Masalan, 255.255.255.0 maskali 192.168.0.0 tarmog'ida 192.168.0.1 dan 192.168.254 192.168.0.0 gacha bo'lgan manzilli kompyuterlar bo'lishi mumkin. 192 .168.0 .127. Menimcha, ma'nosi aniq. Qoidaga ko'ra, IP-manzillarni saqlash uchun provayderlar kam sonli kompyuterlarga ega tarmoqlardan foydalanadilar. Masalan, mijozga 255.255.255.252 niqobli manzil berilishi mumkin. Ushbu quyi tarmoq faqat ikkita kompyuterni o'z ichiga oladi.

    Kompyuter IP-manzilni olgandan so'ng va pastki tarmoq niqobining qiymatini bilgandan so'ng, dastur ushbu mahalliy quyi tarmoqda ishlashni boshlashi mumkin. Biroq, global tarmoqdagi boshqa kompyuterlar bilan ma'lumot almashish uchun siz tashqi tarmoq uchun ma'lumotni qayerga jo'natish qoidalarini bilishingiz kerak. Shu maqsadda Gateway manzili kabi xarakteristikadan foydalaniladi.

    Gateway nima?

    Shlyuz - bu turli xil IP quyi tarmoqlari o'rtasida ma'lumotlarni uzatuvchi qurilma (kompyuter yoki router). Agar dastur (IP va maska ​​bo'yicha) maqsad manzili mahalliy quyi tarmoqning bir qismi emasligini aniqlasa, u bu ma'lumotlarni shlyuz sifatida ishlaydigan qurilmaga yuboradi. Protokol sozlamalarida bunday qurilmaning IP-manzilini belgilang.

    Faqat mahalliy tarmoqda ishlash uchun shlyuz ko'rsatilmagan bo'lishi mumkin.

    Internetga ulanadigan individual foydalanuvchilar yoki bitta ulanish kanaliga ega bo'lgan kichik korxonalar uchun tizim faqat bitta shlyuz manziliga ega bo'lishi kerak - bu Internetga ulangan qurilmaning manzili. Agar bir nechta marshrutlar bo'lsa, bir nechta shlyuzlar bo'ladi. Bunday holda, ma'lumotlar yo'lini aniqlash uchun marshrutlash jadvalidan foydalaniladi.

    Marshrutlash jadvallari nima

    Shunday qilib, biz ularga muammosiz etib keldik. Va shuning uchun.. Bu qanday jadvallar?

    Tashkilot yoki foydalanuvchi Internetga ulanishning bir nechta nuqtalariga ega bo'lishi mumkin (masalan, birinchi provayderda biror narsa noto'g'ri bo'lgan taqdirda zaxira kanallari, lekin Internet hali ham juda zarur) yoki uning tarkibida bir nechta IP-tarmoqlarni o'z ichiga olishi mumkin. Bunday holda, tizim u yoki bu ma'lumotlarni qaysi yo'l bilan (qaysi shlyuz orqali) yuborishni bilishi uchun marshrutlash jadvallari qo'llaniladi. Har bir shlyuz uchun marshrutlash jadvallari ular orqali ma'lumot uzatilishi kerak bo'lgan Internet quyi tarmoqlarini ko'rsatadi. Bunday holda, bir nechta shlyuzlar uchun siz bir xil diapazonlarni o'rnatishingiz mumkin, ammo ma'lumotlarni uzatish uchun har xil xarajatlar bilan: masalan, ma'lumot eng past narxga ega bo'lgan kanal orqali yuboriladi va agar u yoki boshqa sabablarga ko'ra muvaffaqiyatsiz bo'lsa, keyingi mavjud ko'pchilik avtomatik ravishda arzon ulanishdan foydalaniladi.

    Tarmoq portlari nima

    Ma'lumotlarni uzatishda, jo'natuvchi va qabul qiluvchining IP manzillaridan tashqari, ma'lumotlar paketi port raqamlarini o'z ichiga oladi. Misol: 192.168.1.1:80, - bu holda 80 port raqamidir. Port - bu ma'lumotlarni qayta ishlash kerak bo'lgan jarayonni (dasturni) aniqlash uchun ma'lumotlarni qabul qilish va uzatishda foydalaniladigan raqam. Shunday qilib, agar paket 80-portga yuborilsa, bu ma'lumot HTTP serveri uchun mo'ljallanganligini ko'rsatadi.

    1 dan 1023 gacha bo'lgan port raqamlari ma'lum dasturlarga (ma'lum portlar deb ataladi) tayinlangan. 1024 -65 535 raqamli portlardan xususiy dasturlarda foydalanish mumkin. Bunday holda, mumkin bo'lgan nizolar bepul portni tanlash orqali dasturlarning o'zlari tomonidan hal qilinishi kerak. Boshqacha qilib aytadigan bo'lsak, portlar dinamik ravishda taqsimlanadi: dastur keyingi safar ishga tushganda, u boshqa port qiymatini tanlashi mumkin, agar siz portni sozlamalar orqali qo'lda o'rnatmasangiz.

    MAC manzili nima

    Gap shundaki, tarmoqqa yuborilgan paketlar nomlari yoki IP manzillari bilan emas, balki kompyuterlarga qaratilgan. Paket ma'lum bir manzilga ega bo'lgan qurilma uchun mo'ljallangan, u MAC manzili deb ataladi.

    MAC manzili tarmoq qurilmasining o'ziga xos manzili bo'lib, unga uskuna ishlab chiqaruvchisi tomonidan tayinlangan, ya'ni. Bu tarmoq kartangizning muhrlangan raqamining bir turi. MAC manzilining birinchi yarmi ishlab chiqaruvchining identifikatori, ikkinchisi - bu qurilmaning noyob raqami.

    Qoidaga ko'ra, MAC manzili provayder bilan identifikatsiya qilish uchun talab qilinadi (agar provayder login-parol o'rniga MAC manzilini bog'lashdan foydalansa) yoki routerni sozlashda.

    Barcha tarmoq sozlamalarini qayerda ko'rish mumkin

    Bularning barchasini qayerga qarash va o'zgartirish mumkinligi haqida bir necha so'z aytishni deyarli unutib qo'ydim.