2016년 6월 12일 일요일

뇌자극 TCP_IP 프로그래밍 23강 요약

23강 멀티 캐스팅

1. 캐스트

컴퓨터 네트워킹에서 정보를 배포하는 것은 배포라는 용어 대신 캐스트(cast) 라는 용어를 사용한다.
인터넷은 크게 세 가지 캐스팅 방식을 사용한다.

유니캐스트

인터넷 상에서 노드와 노드 사이에 통신 선로가 개설되어서 1:1로 통신하는 방식을
유니 캐스트(uincast)라고 한다.
멀티 스레드나 멀티 프로세스의 경우는 1:1 통신 선로를 다수 개설한 유니캐스트 방식이다.

브로드 캐스트

말 그래도 방송(broadcast)이다. 따로 대상을 정하지 않고,
해당 네트워크 영역에 있는 모든 컴퓨터에 정보를 뿌린다.
브로드 캐스트는 지역 네트워크 내의 컴퓨터로 데이터를 전송한다.

지역 네트워크를 벗어나서 데이터가 방송되지는 않는다.
일반적으로 주변의 네트워크 상황을 알고 싶을 때 사용한다.
라우터는 패킷의 IP 정보를 읽어서 어느 쪽으로 패킷을 보내야 할지 결정하는 일을 한다.

그러기 위해서는 주변의 라우터의 정보를 모두 알고 있어야 한다.
이때 브로드캐스트 방식으로 주변 모든 라우터에게 ARP 요청을 보낸다.

브로드 캐스트 주소는 해당 네트워크 영역에서 가장 큰 주소다.
예를 들어 192.168.16.0 주소 영역에서는 192.168.16.255 가 브로드 캐스트 주소가 된다.

멀티 캐스트

멀티캐스트(multicast)는 특정 네트워크 상에서 해당 채널에 포함된 모든 컴퓨터에 데이터를 전송한다.
브로드캐스트는 해당 네트워크의 모든 컴퓨터에 전송하지만,
멀티캐스트는 채널의 개념이 있어서 해당 채널에 포함되어 있어야지만 데이터를 받는다.

캐스트별 성능과 용도

유니캐스트는 1:1 통신으로서 대부분의 서비스에 무난하게 사용할 수 있지만
다수의 유저에게 동일한 데이터를 전송해야 하는 서비스에는 비효율적이다.
대상마다 연결을 맺어야 하기에 프로그래밍 과정이 복잡해지고 서버의 부하도 크다.

브로드캐스트 또는 멀티캐스트로 데이터를 전송하면,
해당 데이터는 라우터로 전송된 다음 라우터에서 복사되어 다른 컴퓨터로 전달된다.
그만큼 서버는 데이터 복사에 따를 부담을 덜게 된다.

모두에 뿌리는 브로드 캐스트 보다는 수신하기 원하는 채널에만 뿌리는
멀티캐스트가 더 효율적으로 네트워크 자원을 사용한다.

2. 멀티 캐스트의 활용과 단점

멀티 캐스트를 제대로 할려면 멀티캐스트를 지원하는 라우터가 필요하다.
인터넷에 멀티캐스트를 지원하지 않는 라우터가 있을 수 있다는 것이 단점이다.

이 문제를 해결하기 위해서 MBone(Multicast Backbone)이라는 멜터캐스팅 지원망이 있다.
MBone은 멀티캐스트가 가능한 네트워크들을 상호 연결한 네트워크 망이다.

당분간은 MBone 망이 대안일 수 있다. 대신 한정된 라우터를 사용하고 있으므로
인터넷의 대역폭을 제대로 활용하지 못하는 문제가 있다.

3. 멀티캐스트 주소 환경

멀티캐스트는 특정 채널에 속한 컴퓨터만 전송한다. 따라서 그룹 관리 기능이 필요하다.
그룹들은 인터넷 주소로 관리되며 인터넷 주소는 클래스를 이용해서 체계적으로 관리되고 있다.

멀티캐스트 그룹을 관리하기 위한 D클래스가 예약되어 있다.
D클래스는 224.0.0.1 ~ 239.255.255.254 의 범위를 가진다.

4. 멀티캐스트 소켓 프로그래밍

멀티캐스트 클래스로 연결

멀티캐스트는 D클래스 주소를 사용한다. D클래스 주소는 어떤 컴퓨터를 가리키는 주소라기 보다는 멀티캐스트 데이터를 주고 받기 위한 논리적인 채널로 이해할 수 있다.

예를 들어 224.1.1.2라는 멀티캐스트 주소에 접속하는 것은 224.1.1.2 라는 이름의 채널에 접속한다고 생각하면 된다.

소켓 옵션을 이용한 멀티캐스트 소켓 만들기

멀티캐스트를 사용하기 위해서는 멀티캐스트 주소로 연결한 후
setsockopt 함수를 이용해서 멀티 캐스트 채널로 가입해주어야 한다.

IP_ADD_MEMBERSHIP : 멀티캐스트 채널의 멤버에 가입한다.
IP_DROP_MEMBERSHIP : 멀티캐스트 채널에서 탈퇴한다.

그리고 ip_mreq 구조체의 값을 채우면 소켓의 멀티캐스트를 제어할 수 있다.

struct ip_mreq mreq;
struct sockaddr_in sockaddr;

mreq.imr_multiaddr = sockaddr.sin_addr;
mreq.imr_interface.s_addr = htonl(INADDR_ANY);

setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));

mir_multiaddr은 멀티캐스트 주소다.
imr_interface.s_addr은 데이터를 받을 인터페이스의 주소로
일반적으로 모든 인터페이스 주소를 통해서 데이터를 받기 때문에
INADDR_ANY를 옵션으로 사용한다.

소스 코드 받기

윈도우 멀티캐스트 프로그래밍

윈도우의 윈속도 BSD 소켓과 동일한 방식으로 멀티캐스트를 지원한다.
setsockopt 함수를 그대로 사용하며 값들 역시 BSD 소켓에서와 같다.
단지 멀티 스레드 기술로 입력과 출력을 동시에 다루고 있음만 다르다.

소스 코드 받기

댓글 없음:

댓글 쓰기