소켓프로그래밍#10 : 멀티캐스트, 브로드캐스트

kkado·2022년 6월 5일
0

네트워크프로그래밍

목록 보기
11/16

멀티캐스트(Multicast)

멀티캐스트란 한 번의 송신으로 메시지나 정보를 목표한 여러 컴퓨터에 동시에 전송하는 것을 말한다.

  • 멀티캐스트 서버는 특정 멀티캐스트 그룹을 대상으로 데이터를 한 번 전송한다.
  • 딱 한 번 전송하더라도 그룹에 속하는 클라이언트는 모두 데이터를 수신한다.
  • 멀티캐스트 그룹의 수는 IP 주소 범위 내에서 얼마든지 추가 가능하다.
  • 특정 멀티캐스트 그룹으로 전송되는 데이터를 수신하려면 해당 그룹에 가입하면 된다.

모든 호스트에 데이터 전송을 해야할 때, TCP 또는 UDP보다 발생하는 트래픽 양이 적다.
멀티캐스트는 연결의 개념이 없어 UDP 소켓을 기반으로 전송된다.

라우팅과 TTL

한 번 전송으로 다수가 수신 가능한 이유는 라우터가 패킷을 복사해서 다수의 호스트에 전달하는 방식이기 때문이다. 그렇기 때문에 TTL 이라는 것을 설정해야 한다.

TTL (Time to Live)

패킷을 얼마나 멀리 보낼 것인가를 결정한다.
TTL은 정수로 표현되며 라우터를 하나 거칠 때마다 1 감소한다.
TTL이 0이 되면 해당 패킷은 소멸한다.

int send_sock;
int time_live = 64;
...
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, IPPROTO_IP, IPMULTICAST_TTL, (void*)&time_live, sizeof(time_live));

TTL의 설정과 관련된 프로토콜 레벨은 IPPROTO_IP이고, 옵션의 이름은 IP_MULTICAST_TTL이다. setsockopt 함수로 지정해 줄 수 있다.

그룹 가입 방법

int recv_sock;
struct ip_mreq join_adr;
...
recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
...
join_adr.imr_multiaddr.s_addr = {멀티캐스트 그룹의 주소정보}
join_adr.imr_interface.s_addr = {그룹에 가입할 호스트의 주소정보}

setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void*)&join_adr, sizeof(join_adr));

멀티캐스트 그룹의 가입 역시 setsockopt 옵션 정보 변경을 통해 이뤄진다. 옵션명은 IP_ADD_MEMBERSHIP 이다.

그룹의 정보는 ip_mreq 구조체 변수를 이용해 표현한다.

struct ip_mreq
{
	struct in_addr imr_multiaddr;
    struct in_addr imr_interface;
}

멀티캐스트 sender

설정해주고 나면 sender와 receiver의 코드 구현 자체는 간단하다.

sender

sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr*)&mul_adr, sizeof(mul_adr));

mul_adr에 Multicast IP와 Port 정보가 들어 있고, send_sock는 UDP 소켓이다.

receiver

recvfrom(recv_sock, buf, BUFSIZE-1, 0, NULL, 0);

받을 때도 일반 UDP 받듯이 받으면 된다. 다만, 당연히 위에서 그룹 가입이 되어 있어야 한다.

브로드캐스트 (Broadcast)

브로드캐스트(Broadcast) 역시 한 번에 여러 호스트에게 데이터를 전송한다. 하지만 전송이 이루어지는 범위가 '동일한 네트워크로 연결되어 있는 호스트' 라는 점에서 멀티캐스트와 조금 다르다.

  • 동일한 네트워크 내에 존재하는 호스트에게 데이터를 전송하는 방법
  • 데이터 전송의 대상이 호스트가 아닌 데트워크이다.
  • 멀티캐스트와 마찬가지로 UDP 소켓을 기반으로 한다.

directed broadcast

Directed 브로드캐스트의 IP주소는 네트워크 주소를 제외한 나머지 호스트 주소를 모두 1로 설정해서 얻을 수 있다.

local broadcast

Local 브로드캐스트의를 위해서 255.255.255.255 라는 IP가 특별히 예약되어 있다.

IP 주소가 UDP와 유일한 차이점이다. 기본적으로 생성되는 소켓만 브로드캐스트 기반으로 변경해주면 이하 구현 방식은 똑같다.

브로드캐스트가 가능하려면 소켓의 SO_BROADCAST 옵션을 1로 변경해야 한다.

int bcast = 1;

send_sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void*)&bcast, sizeof(bcast));


Sender 구현. SO_BROADCAST 옵션 수정 이외에는 똑같다.


Receiver 구현. 마찬가지로 특별한 것은 없다.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글