본문 바로가기
programing/Networks

멀티 캐스트& 브로드 캐스트

by RedWiz 2015. 5. 18.

 

 

Multicasting.zip

 

- 멀티 캐스트 이점

> 특정 멀티 캐스트 그룹을 대상으로 데이터를 단 한번 전송

> 단 한번 전송해도 그룹에 속하는 모든 클라이언트는 데이터 수신

> 멀티 캐스트 그룹 수는 IP 주소 범위 내에서 얼마든지 추가 가능

> 특정 멀티캐스트 그룹으로 전송되는 데이터를 수신하려면 해당 그룹에 가입

 

- 멀티 캐스트 그룹 : 클래스 D에 속하는 IP 주소(224.0.0.0 ~ 239.255.255.255)

-> 멀티 캐스트 그룹 가입 : IP 주소중 클래스 D를 목적지로 전송되는 멀티 캐스트 데이터를 수신

 

- 멀티 캐스트는 UDP 기반

 

- 다수의 클라이언트에게 동일한 데이터를 전송하는 일은 서버와 네트워크의 트래픽 측면에서 매우 부정적

=> 멀티 캐스트 : 하나의 영역에 동일한 패킷이 둘 이상 전송되지 않음

> TCP나 UDP의 경우 호스트 만큼 전송을 해야함 -> 멀티 캐스트는 한 번 전송하면 됨

> 멀티 캐스트는 멀티미디어 데이터의 실시간 전송에 주로 사용

 

- 멀티캐스트를 지원하지 않거나 트래픽 문제로 일부러 막아 놓은 경우도 있음

> Tunneling 기술 사용

 

- TTL(Time to Live)

> TTL : 패킷을 얼마나 멀리 전달할 지 결정

> 정수, 라우터를 거칠 때마다 1씩 감소, 0이 되면 패킷은 더 이상 전달되지 못하고 소멸

 

- 멀티 캐스트 설정과 가입

> 설정과 관련된 프로토콜 레벨 : IPPROTO_IP, 옵션 이름 : IP_MULTICAST_TTL

ex)

#include <ws2tcpip.h>    // IP_MULTICAST_TTL는 ws2tcpip.h 에 선언 됨

 // 소켓 만들때 반드시 멀티캐스트 주소로

int time_live = 64;

SOCKET hSockSend = socket(PF_INET, SOCK_DGRAM, 0);

setsockopt(hSockSend, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&time_live, sizeof(time_live));

 

> 가입과 관련된 프로토콜 레벨 : IPPROTO_IP, 옵션 이름 : IP_ADD_MEMBERSHIP

ex)

#include <ws2tcpip.h>    // IP_ADD_MEMBERSHIP, IP_MREQ는 ws2tcpip.h 에 선언 됨

IP_MREQ join_adr;

SOCKET hSockRecv = socket(PF_INET, SOCK_DGRAM, 0);

join_adr.imr_multiaddr.s_addr = "멀티 캐스트 그룹의 주소";

join_adr.imr_interface.s_addr = "그룹에 가입할 호스트의 주소"

setsockopt(hSockRecv, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char*)&join_adr, sizeof(join_adr);

 

> IP_MREQ

typedf struct ip_mreq

{

struct in_addr imr_multiaddr;    // 가입할 그룹의 IP 주소

struct in_addr imr_interface;    // 그룹에 가입할 소켓의 호스트 IP, INADDR_ANY 사용 가능

} IP_MREQ;

 

cf. 멀티캐스트는 MBone이라는 가상 네트워크 기반으로 동작 (소프트웨어적인 네트워크)

 


 

- 브로드 캐스트

> 멀티캐스트는 서로 다른 네트워크 상의 호스트라도 멀티캐스트 그룹에 가입되어있으면 데이터 수신 가능

> 브로드캐스트는 동일한 네트워크로 연결되어 있는 호스트로 전송대상 제한

 

- 동일한 네트워크에 연결되어있는 모든 호스트에게 동시에 데이터 전달

- UDP 기반

 

- Directed Broadcast

> IP주소가 네트워크 주소를 제외한 나머지 호스트 주소를 전부 1로 설정

> 특정 지역 네트워크에 연결된 모든 호스트에 데이터 전송

 

- Local Broadcast :

> 255.255.255.255 IP 주소가 예약

 

ex)

hSockSend;

int bcast = 1;    // SO_BROADCAST의 옵션 정보를 1로 초기화하기 위함

hSockSend = socket(PF_INET, SOCK_DGRAM, 0);

setsocket(hSockSend, SOL_SOCKET, SO_BROADCAST, (char*)&bcast, sizeof(bcast));

 

- 소켓 옵션 변경은 Sender에만 필요