Национална академия по разработка на софтуер



страница9/14
Дата25.07.2016
Размер2.68 Mb.
#6706
1   ...   6   7   8   9   10   11   12   13   14

1.6.Multicast сокети


Понякога се налага един пакет да бъде изпратен едновременно до много получатели. Това е необходимо винаги, когато дадено сървърско приложение иска да извести за нещо всички свои клиенти или иска да изпрати една и съща информация едновременно на много потребители. Да вземем за пример излъчването на мултимедийна информация, да кажем цифрова телевизия, в Интернет или локална мрежа. В този случай един и същ мултимедиен сигнал (който на практика е кодиран в някаква последователност от пакети) трябва да достигне едновременно до много потребители. Би било крайно неефективно ако сървърът разпраща информацията на всеки потребител поотделно, особено ако тази информация е обемиста, какъвто е случаят с изпращането на телевизионен сигнал. Например ако в една организация 100 души едновременно гледат един и същ телевизионен канал, не е редно една и съща информация от телевизионния сървър да идва до организацията 100 пъти, като може да дойде само веднъж. Ако се замислим, така е и в реалния свят на спътниковата телевизията. Спътниците излъчват телевизионния сигнал за даден канал само веднъж, а всички потребители, които се интересуват от него го визуализират на своите телевизори. По Интернет не може да стане точно така, но е възможно ако няколко потребителя, които имат общ Интернет доставчик, гледат един и същ канал, информацията от сървъра за телевизия до техния Интернет доставчик да идва само веднъж.

За решаването на описаните проблеми в пакета протоколи TCP/IP има стандартно предвидена функционалност, която позволява групово изпращане на пакети до множество машини. Различават се два модела за групово разпращане на пакети – broadcast и multicast. При broadcast модела един изпратен пакет се получава от всички машини в локалната мрежа, а при multicast модела един пакет се разпраща до всички машини, които предварително са заявили, че искат да го получават, т.е. за се абонирали за дадена група пакети. За разлика от broadcast, multicast може да се използва не само в локална мрежа.


Пример за multicast комуникация


Да си представим, че трябва да изградим комуникационен софтуер за нуждите на голяма организация. Служителите в нея са разделени на работни групи и всеки служител трябва да комуникира постоянно с колегите от своята група като им изпраща съобщения. От началството пък искат да могат да разпращат важни съобщения до всички служители.

Една проста комуникационна система за организацията може да се изгради по следния начин: Софтуерът на всеки служител отваря TCP сокет до централен сървър, през който минават всички съобщения. Сървърът знае към кои групи принадлежи всеки служител и когато получи съобщение предназначено за някоя група, го разпраща до всички нейни членове. По подобен начин, отново с централен сървър, цялата система може да се изгради и чрез UDP сокети. При големи натоварвания, обаче, централният сървър би могъл да не издържи или да работи, но неприемливо бавно. Представете си ако системата служи за комуникация не между хора, а между различни софтуерни компоненти на една сложна информационна система, където има десетки сървъри, като всеки от тях участва в хиляди групи и изпраща стотици съобщения в секунда. Очевидно натоварването е голямо, а рискът от срив на сървъра и спиране на работата на всички също не е малък.


Multicast сокети в Java


За решаването на проблеми, подобни на описаните по-горе, са разработени multicast сокетите. Те много приличат на UDP сокети, но не са съвсем като тях. Multicast сокетите поддържат 4 основни операции – включване в група (абониране), изпращане на съобщение до дадена група, получаване на съобщение, предназначено за дадена група и изключване от група (спиране на абонамента). Всяка multicast група се идентифицира с уникален IP адрес от диапазона [224.0.0.0 ... 239.255.255.255]. Един компютър може да е едновременно в много multicast групи. Изпращането на пакет до всички членове на дадена група става като се изпрати този пакет до IP адреса на групата.

За регистрация на multicast сокети, както и за включване и изключване в групи се използва класа java.net.MulticastSocket. При изпращане и получаване на пакети се използва и класа java.net.DatagramPacket – същият този клас, който се използва за представяне на пакета и при UDP комуникация.


Примерен multicast клиент


Да разгледаме един пример – клиентско приложение, което се абонира за multicast групата 224.0.0.1, след което получава и отпечатва на конзолата всички съобщения, получени на порт 2004 в тази група:

MulticastListener.java

import java.net.*;

import java.io.IOException;

public class MulticastListener {

public static final String

MULTICAST_GROUP_ADDRESS = "224.0.0.1";



public static final int LISTENING_PORT = 2004;

public static final int MAX_PACKET_SIZE = 1024;

public static void main(String[] args) throws IOException {

MulticastSocket multicastSocket =



new MulticastSocket(LISTENING_PORT);

InetAddress multicastGroupAddr =

InetAddress.getByName(MULTICAST_GROUP_ADDRESS);

multicastSocket.joinGroup(multicastGroupAddr);

System.out.println("Joined to multicast group " +

MULTICAST_GROUP_ADDRESS + ".");



byte[] receiveBuf = new byte[MAX_PACKET_SIZE];

DatagramPacket packet =



new DatagramPacket(receiveBuf, receiveBuf.length);

System.out.println("Listening for packets...");



while (true) {

multicastSocket.receive(packet);

String packetAsString = new String(

packet.getData(), 0, packet.getLength());

System.out.println("Received packet from " +

packet.getAddress().getHostAddress() + ":" +

packet.getPort() + " - " + packetAsString);

}

}



}

Както виждаме от кода, работата с multicast сокети съвсем не е сложна. Създаваме си multicast сокет, извикваме метода joinGroup(), с който се абонираме за някой multicast адрес и след това получаваме в цикъл UDP пакетите, предназначени за тази група на избрания порт.

Използвахме класа java.net.MulticastSocket, който предоставя няколко основни метода – joinGroup() за присъединяване към multicast група, leaveGroup() за напускане на група, getTTL() и setTTL() за извличане и промяна на параметъра TTL (time to live).


Как работи multicasting-а. Какво е IGMP. Какво е TTL


Преди да си изясним каква е ролята на TTL параметъра, трябва да си изясним механизма, по който работи multicast комуникацията. За нея от съществено значение е протоколът IGMP (Internet Group Management Protocol). IGMP е протокол на мрежово ниво, част от комплекта протоколи TCP/IP и служи да информира маршрутизаторите в дадена мрежа за това, че даден хост иска или не иска да получава съобщенията за дадена multicast група. По принцип пакетите, предназначени за даден multicast адрес могат да преминават от един маршрутизатор към друг и да достигат съседни мрежи, т.е. multicast комуникацията може да работи не само в локална мрежа, но и в Интернет. Преминаването на един пакет през един маршрутизатор намалява стойността на неговия TTL с единица. Достигането на стойност 0 прекратява разпространението на пакета. Стойността TTL означава максималния брой маршрутизатори, през които съобщението може да премине.

По стандарт в организацията на IP адресното пространство е предвидена специална зона от адреси от 224.0.0.1 до 239.255.255.255, които са предназначени за multicasting. Всеки от тези адреси би могъл да бъде използван за адрес на multicast група.

Абонаментът за multicast услуги става по IP адрес на групата, но в рамките на тази група може да има 65535 различни услуги, съответстващи на различните възможни номера на портове.

Изпращането и получаването на multicast пакети става по протокол UDP. Няма разлика между това дали изпращаме обикновен UDP пакет и UDP пакет до multicast адрес. Разликата е само в адреса на получателя. Ако адресът е някаква multicast група, пакетът ще бъде доставен до всички нейни членове, а ако адресът е обикновено IP, пакетът ще бъде доставен само до съответния хост. Абонирането и прекратяването на абонамент към дадена група става по протокол IGMP, но след успешен абонамент вече се използва обикновена UDP комуникация.


Каква е ефективността при multicast комуникация


Поради факта, че за разпространението на multicast UDP пакетите се грижи мрежовият хардуер на IP ниво, този метод за разпращане на съобщения до група потребители е изключително ефективен и многократно по-бърз от алтернативните подходи с централен сървър и TCP или UDP базирана комуникация. Ефективността може да се разгледа от две различни страни:

    • спестява се време при изпращане на едно и също съобщение до голям брой потребители

    • спестява се мрежов трафик

Изпращането на един пакет до хиляди компютри абонирани за някой multicast адрес отнема точно толкова време, колкото изпращането на един пакет до един компютър. Това означава, че изпращането на едно UDP съобщение до група получатели по multicast сокет може да е хиляди пъти по-бързо отколкото изпращането на същото съобщение до същата група получатели чрез TCP сокет или обикновен UDP пакет.

От друга страна, когато едно съобщение трябва да се получи от хиляди машини в дадена мрежа, то достига до тази мрежа само веднъж и всички машини го получават без това да причини повече трафик отколкото ако само една машина в тази мрежа трябва да го получи. Така мрежовият трафик може да се намали хиляди пъти.

Заради голямата си ефективност при комуникация в група multicasting-ът е предпочитан метод за работа при приложения, за които високата производителност е от жизнена важност.

Примерен multicast сървър


След като изяснихме в общи линии какво е multicasting и за какво се използва, нека напишем сървър за нашия примерен multicast клиент. Да си поставим за задача създаването на програмка, която изпраща на всяка секунда по едно съобщение до всички машини в multicast групата 224.0.0.1, като го адресира до порт 2004, на който би могъл да слуша нашият примерен multicast клиент. Ето една примерна реализация:

MulticastSender.java

import java.net.*;

public class MulticastSender {

public static final String

MULTICAST_GROUP_ADDRESS = "224.0.0.1";



public static final int TARGET_PORT = 2004;

public static void main(String[] args) throws Exception {

InetAddress multicastGroupAddr =

InetAddress.getByName(MULTICAST_GROUP_ADDRESS);

MulticastSocket multicastSocket = new MulticastSocket();



while (true) {

String message = "Hello " + new java.util.Date();

DatagramPacket packet = new DatagramPacket(

message.getBytes(), message.length(),

multicastGroupAddr, TARGET_PORT);

multicastSocket.send(packet);

System.out.println("Sent UDP packet to " +

MULTICAST_GROUP_ADDRESS + ":" + TARGET_PORT);

Thread.sleep(1000);

}

}



}

Както виждаме, кодът силно прилича на код, който разпраща UDP пакети. Единствената разлика е, че вместо класа DatagramSocket е използван класът MulticastSocket и преди да започне разпращането се указва групата, към която ще става изпращането. Примерната сървърска програма в безкраен цикъл праща съобщение, съдържащо текущата дата.

Как работят примерния multicast клиент и сървър


За да тестваме клиента и сървъра, компютърът ни трябва да е включен в мрежа. На компютър без мрежов интерфейс и двете програми биха могли да не работят (всъщност това зависи до известна степен от операционната система). Най-добре можем да видим как работят примерния клиент и примерния сървър ако имаме няколко компютъра в мрежа и пуснем на всеки от тях няколко клиента и няколко сървъра. Така всеки клиент ще получава всички изпратени пакети, а всеки сървър ще праща до всички клиенти. При желание могат да се добавят и още multicast групи. Ето как биха могли да изглеждат съответно изходите на един от клиентите и на един от сървърите ако в мрежата има пуснати 2 клиента и 2 сървъра съответно на машини с IP адреси 192.168.200.1 и 192.168.200.2 :

Изход от MulticastListener на машината 192.168.200.1

Joined to multicast group 224.0.0.1.

Listening for packets...

Received packet from 192.168.200.2:1448 - Hello Sat Mar 06 23:35:34 EET 2004

Received packet from 192.168.200.1:4107 - Hello Sat Mar 06 23:35:46 EET 2004

Received packet from 192.168.200.2:1448 - Hello Sat Mar 06 23:35:35 EET 2004

Received packet from 192.168.200.1:4107 - Hello Sat Mar 06 23:35:47 EET 2004

Received packet from 192.168.200.2:1448 - Hello Sat Mar 06 23:35:36 EET 2004

...


Изходът на сървърът не е толкова интересен:

Изход от MulticastSender на машината 192.168.200.1

Sent UDP packet to 224.0.0.1:2004

Sent UDP packet to 224.0.0.1:2004

Sent UDP packet to 224.0.0.1:2004

Sent UDP packet to 224.0.0.1:2004

...




Каталог: books -> inetjava
books -> В обятията на шамбала
books -> Книга се посвещава с благодарност на децата ми. Майка ми и жена ми ме научиха да бъда мъж
books -> Николай Слатински “Надеждата като лабиринт” София, Издателство “виденов & син”, 1993 год
books -> София, Издателство “Българска книжница”, 2004 год. Рецензенти доц д. ик н. Димитър Йончев, проф д-р Нина Дюлгерова Научен редактор проф д-р Петър Иванов
books -> Николай Слатински “Измерения на сигурността” София, Издателство “Парадигма”, 2000 год
books -> Книга 2 щастие и успех предисловие
books -> Превръщане на числа от една бройна система в друга
books -> Тантриското преобразяване


Сподели с приятели:
1   ...   6   7   8   9   10   11   12   13   14




©obuch.info 2024
отнасят до администрацията

    Начална страница