UDP Socket

All lectures for UZ purposes
Daraja, Dars
Mavjud

Tarmoq o'zaro hamkorligi haqida gapirganda, OSI modelini eslamasdan ilojimiz yo'q.

Bugun ushbu modelda bizni eng ko'p qiziqtirgan transport darajasi (4).

Ushbu darajada biz "A nuqtasidan B nuqtasiga" borgan ma'lumotlar bilan ishlaymiz. Transport darajasining asosiy vazifasi - xabarni adresatga yetkazilishini kafolatlash va to'g'ri ketma-ketlikni saqlash. Transport darajasining 2 ta eng keng tarqalgan protokollari bor: TCP va UDP. Ular kontseptual ravishda boshqacha ishlaydi, lekin har biri o'z afzalliklariga ega, bu ularni muayyan vazifalarni hal qilish uchun profilda ishlatishga imkon beradi.

Avval TCP ishlash sxemasini ko'rib chiqamiz.

TCP (Transmission Control Protocol) — bu tarmoq protokoli, u ma'lumotlar almashinuvini boshlashdan oldin ikki host o'rtasida aloqa o'rnatilganiga ishonch hosil qiladi.

Bu juda ishonchli protokol, chunki har safar navbatdagi ma'lumotlar paketini yuborishdan oldin, u oldingi paket yetib kelganligini tekshirishi kerak.

Yuborilayotgan paketlar tartiblangan, va agar biror paket bilan muammo yuzaga kelsa (qabul qiluvchi tomon paket yetib kelganligini tasdiqlamasa), paket qayta yuboriladi. Shu sababli uzatish tezligi nisbatan past, chunki tartiblash va ma'lumotlar uzatishini qattiq nazorat qilish ko'proq vaqt oladi.

Ayni paytda uning "aka-antagonisti" — UDP protokoli keladi. Unga, TCPdan farqli o'laroq, har bir paketning ketma-ketligi va holati unchalik muhim emas, u shunchaki ma'lumotlarni tasdiqlovsiz jo'natadi. Uning ustiga, u ulanishni o'rnatish bilan shug'ullanmaydi va uning holatidan hech qanday bog'liq emas.

Uning vazifasi — shunchaki ma'lumotlarni manzilga jo'natish. Shundan kelib chiqadigan asosiy kamchilik — past ishonchlilik, chunki u ma'lumot bo'laklarini yo'qotishi mumkin. Bundan tashqari, qabul qiluvchi undan kelayotgan ma'lumotlar tartibsiz bo'lishi mumkinligini tayyor bo'lishi kerak. Uning afzalligi esa — yuqori uzatish tezligi, chunki ushbu protokol doirasi faqat ma'lumotlarni jo'natishga chegaralangan.

Ma'lumotlarning o'zida farqlar ham mavjud. TCPda ma'lumotlar oqim sifatida uzatiladi, ya'ni ma'lumotlar hudud belgilashiga ega emas. UDPda esa ma'lumotlar datagram sifatida uzatiladi va belgilashlar mavjud, va ma'lumotlarning to'liqligini qabul qiluvchi tomon tasdiqlashi kerak, lekin faqat xabar muvaffaqiyatli yetib kelganidan keyin.

Xulosa qilaylik:

TCP — yuqori ishonchlilik va to'g'rilikka ega protokol bo'lib, ma'lumotlarning yo'qolishiga imkon bermaydi. Xabar har doim maksimal aniqlik bilan yetkaziladi yoki umuman yetkazilmaydi. Qabul qiluvchi tomonning ma'lumotlarni tartiblash logikasiga ehtiyoji yo'q, chunki kelayotgan ma'lumotlar allaqachon tartiblangan bo'ladi. UDP — unchalik ishonchli bo'lmasa-da, tezroq ma'lumot uzatish protokoli. Jo'natuvchi va qabul qiluvchi tomon logikasi ushbu protokol bilan ishlash uchun ba'zi manipulyatsiyalarni talab qiladi. Lekin Keling, uning ishini tarmoq orqali kompyuter yoki mobil o'yin misolida ko'rib chiqaylik. Biz allaqachon 5 soniya oldin kelishi kerak bo'lgan narsaga ahamiyat bermasligimiz mumkin va agar ular yetishmasa, bir necha paketlarni o'tkazib yuborishimiz mumkin — o'yin biroz kechikadi, lekin o'ynash mumkin!

Javada UDP orqali uzatish uchun datagramlar bilan ishlash uchun DatagramSocket va DatagramPacket sinflarining ob'ektlari ishlatiladi.

Ma'lumotlar almashish uchun jo'natuvchi va qabul qiluvchi datagram turidagi socketlar — DatagramSocket sinfining ob'ektlarini yaratadi. Ushbu sinfda bir nechta konstruktorlar mavjud, ularning farqi shundan iboratki, yaratilgan socket qayerga ulanadi:

DatagramSocket() Mahalliy mashinadagi har qanday bo'sh portga
DatagramSocket(int port) Mahalliy mashinadagi ko'rsatilgan portga
DatagramSocket(int port, InetAddress addr) Mahalliy mashinadagi ko'rsatilgan portga, belgilangan manzillardan biriga (addr)

Ushbu sinf socket parametrlariga kirish va boshqarish uchun ko'plab metodlarni (biz ularni quyida ko'rib chiqamiz), shuningdek, datagramlarni qabul qilish va jo'natish metodlarini o'z ichiga oladi:

send(DatagramPacket pack) Datagramlarni paketlarga qadoqlangan holda jo'natadi
receive(DatagramPacket pack) Datagramlarni paketlarga qadoqlangan holda qabul qiladi

DatagramPacket — datagram paketini ifodalovchi sinf. Datagram paketlari paketlarni ulanishsiz yetkazib berish xizmatini amalga oshirish uchun ishlatiladi. Har bir xabar ushbu paketda mavjud ma'lumotlar asosida faqat bitta mashinadan ikkinchisiga yo'naltiriladi. Bitta mashinadan ikkinchisiga yuborilgan bir nechta paketlar turli yo'ldan o'tkazilishi va har qanday tartibda yetib kelishi mumkin. Paketlarni yetkazilishiga kafolat berilmaydi.

Konstruktorlar:

DatagramPacket(byte[] buf, int length) Ma'lumotlar paketlarini qabul qilish uchun DatagramPacket yaratadi, length uzunlikda.
DatagramPacket(byte[] buf, int length, InetAddress address, int port) Ko'rsatilgan tugunni ko'rsatilgan port raqamiga length uzunlikda paket yuborish uchun datagram paketini yaratadi.
DatagramPacket(byte[] buf, int offset, int length) DatagramPacket yaratadi, length uzunlikda paketlarni qabul qilish uchun, buferda offsetni ko'rsatib.
DatagramPacket(byte[] buf, int offset, int length, InetAddress address, int port) Paketni ko'rsatilgan tugunning port raqamiga offsetni ko'rsatib length uzunlikda paket yuborish uchun datagram paketini yaratadi.
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) Paketni ko'rsatilgan tugunning port raqamiga offsetni ko'rsatib length uzunlikda paket yuborish uchun datagram paketini yaratadi.
DatagramPacket(byte[] buf, int length, SocketAddress address) Paketni ko'rsatilgan tugunning port raqamiga length uzunlikda paket yuborish uchun datagram paketini yaratadi.

UDP ishlash sxemasi bo'yicha biz bilamizki, ulanish o'rnatilmaydi va paketlar omadga ko'ra yuboriladi, qabul qiluvchi ularni kutayotganiga umid qilinadi. Biroq, DatagramSocket sinfining metodi connect(InetAddress addr, int port) yordamida ulanishni o'rnatish mumkin.

Adres va port bo'yicha host bilan bir tomonlama ulanish o'rnatiladi: yoki jo'natish uchun, yoki datagramlarni qabul qilish uchun. Bunday ulanishni disconnect() metod yordamida uzib qo'yish mumkin.

Endi DatagramSocket asosida server (qabul qiluvchi tomon) uchun kod yozamiz:


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;

class Recipient {

   public static void main(String[] args) {
       try {
           DatagramSocket ds = new DatagramSocket(1050);

           while (true) {
               DatagramPacket pack = new DatagramPacket(new byte[5], 5);
               ds.receive(pack);
               System.out.println(new String(pack.getData()));
           }
       } catch (IOException e) {
           e.printStackTrace();
       }
   }
}

Biz 1050 portini tinglash uchun mo'ljallangan DatagramSocket ob'ektini yaratamiz. Xabarni qabul qilib, uni konsolga chiqaradi. Biz “Hello” so'zini yuboramiz, shuning uchun bufer hajmini besh bayt bilan cheklaymiz.

Endi jo'natuvchi sinfini yaratamiz:


import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

class Sender {
   private String host;
   private int port;

   Sender(String host, int port) {
       this.host = host;
       this.port = port;
   }

   private void sendMessage(String mes) {
       try {
           byte[] data = mes.getBytes();
           InetAddress address = InetAddress.getByName(host);
           DatagramPacket pack = new DatagramPacket(data, data.length, address, port);
           DatagramSocket ds = new DatagramSocket();
           ds.send(pack);
           ds.close();
       } catch (IOException e) {
           System.err.println(e);
       }
   }

   public static void main(String[] args) {
   Sender sender = new Sender("localhost", 1050);
   String message = "Hello";

   Timer timer = new Timer();
   timer.scheduleAtFixedRate(new TimerTask() {
       @Override
       public void run() {
           sender.sendMessage(message);
       }
   }, 1000, 1000);
}

}

sendMessage metodida biz DatagramPacket, DatagramSocket yaratamiz va xabarni jo'natamiz. Diqqat qiling, jo'natishdan so'ng DatagramSocket close() metod yordamida yopiladi.

Qabul qiluvchi konsolda har soniyada jo'natuvchi tomonidan yuborilgan "Hello" xabari ko'rinadi. Demak, o'zaro aloqa o'rnatilgan va hamma narsa to'g'ri ishlamoqda.

Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION