- 멀티 캐스트 이점
> 특정 멀티 캐스트 그룹을 대상으로 데이터를 단 한번 전송
> 단 한번 전송해도 그룹에 속하는 모든 클라이언트는 데이터 수신
> 멀티 캐스트 그룹 수는 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에만 필요
'programing > Networks' 카테고리의 다른 글
Asynchronous Notification IO 모델 (0) | 2015.05.22 |
---|---|
표준 입출력 함수, 입출력 스트림, select()의 문제, 쓰레드 (0) | 2015.05.21 |
입출력 함수 (0) | 2015.05.18 |
IO 멀티플렉싱 기반 서버 (0) | 2015.05.15 |
Half-close, DNS, 소켓 옵션 (0) | 2015.05.15 |