컴퓨터 구조 운영체제 네트워크 자료구조 알고리즘 데이터베이스 내 학습
network · 20

유니/멀티/브로드캐스트

유니캐스트브로드캐스트멀티캐스트

네트워크에서 데이터를 보낼 때 가장 먼저 정해야 할 것은 "누구에게 보내는가"입니다. 한 명에게만 보낼 수도 있고, 같은 네트워크의 모두에게 보낼 수도 있고, 관심 있는 그룹에게만 보낼 수도 있습니다. 이 세 가지가 유니캐스트(unicast), 브로드캐스트(broadcast), 멀티캐스트(multicast)입니다. 각각 목적지 주소의 종류와 전달 범위가 다르고, 같은 데이터를 여럿에게 보낼 때 드는 비용도 크게 다릅니다.

유니캐스트는 송신자와 수신자가 1:1로 통신하는 방식으로, 웹 접속처럼 대부분의 인터넷 통신이 여기에 속합니다. 브로드캐스트는 같은 브로드캐스트 도메인의 모든 호스트에게 보내는 방식이고, ARP 요청이나 DHCP Discover가 대표 예입니다. 멀티캐스트는 특정 그룹에 가입한 호스트에게만 한 번의 전송으로 데이터를 전달하는 방식으로, 실시간 영상 배포나 서비스 탐색에 쓰입니다. 이 토픽에서는 세 방식이 누구에게 전달되는지, 주소가 어떻게 다른지, 멀티캐스트 그룹 가입이 어떻게 이루어지는지를 단계별로 봅니다.

핵심 개념

유니캐스트

한 송신자가 특정한 한 수신자에게 1:1로 보냅니다. 같은 데이터를 여러 명에게 주려면 수신자 수만큼 반복해서 보내야 합니다.

핵심 개념

브로드캐스트

같은 네트워크(브로드캐스트 도메인)의 모든 호스트에게 보냅니다. 라우터는 브로드캐스트를 넘기지 않아 인터넷 전체로 퍼지지 않습니다.

핵심 개념

멀티캐스트

그룹 주소로 한 번 보내면 그 그룹에 가입한 호스트에게만 전달됩니다. 송신은 1번이고 수신자가 늘어도 송신자의 부담이 거의 변하지 않습니다.

핵심 개념

멀티캐스트 주소

IPv4에서는 224.0.0.0부터 239.255.255.255까지가 멀티캐스트 그룹 주소입니다. 224.0.0.1은 같은 네트워크의 모든 호스트, 224.0.0.2는 모든 라우터를 뜻합니다.

핵심 개념

IGMP

IPv4 호스트가 멀티캐스트 그룹 가입과 탈퇴를 라우터에 알리는 프로토콜입니다. IPv6에서는 같은 역할을 MLD가 맡습니다.

핵심 개념

IGMP 스누핑

스위치가 IGMP 메시지를 엿보고 가입자가 있는 포트만 기억해, 멀티캐스트 프레임을 그 포트로만 보내는 기능입니다. 없으면 모든 포트로 흘러갑니다.

수신자가 많을수록 차이가 벌어집니다 — 같은 데이터를 N명에게 보낼 때 유니캐스트는 송신이 N번이지만, 브로드캐스트와 멀티캐스트는 1번입니다.
브로드캐스트는 원치 않는 호스트도 받습니다 — 같은 네트워크의 모든 호스트가 패킷을 받아 처리한 뒤에야 관련이 없다는 것을 알고 버립니다. 호스트가 많을수록 낭비가 커집니다.
멀티캐스트는 가입이 있어야 받습니다 — 그룹에 가입한 호스트에게만 전달됩니다. 대신 TCP로는 쓸 수 없고 보통 UDP로 보내므로 손실 복구를 애플리케이션이 직접 챙겨야 합니다.
범위는 라우터가 정합니다 — 브로드캐스트는 같은 네트워크에서 끝나고, 멀티캐스트는 멀티캐스트 라우팅이 설정된 곳까지 퍼질 수 있습니다. 인터넷 전체에서는 일반적으로 쓸 수 없습니다.
이 시각화에서 확인할 것 — "전송 방식" 탭에서 누가 받는지와 송신 횟수를, "주소" 탭에서 주소 영역과 MAC 변환을, "그룹 가입" 탭에서 가입과 스위치 전달 범위를 STEP으로 확인하세요.

전송 방식의 배경

ARP와 DHCP 같은 기본 프로토콜은 브로드캐스트를 이용합니다. 1989년 RFC 1112는 IP 멀티캐스트를 위한 호스트 확장과 IGMP를 정의했고, 이후 IGMPv2(RFC 2236)에서 탈퇴 메시지(Leave)가 추가되었습니다. IPv6에는 브로드캐스트가 없고, 같은 용도를 멀티캐스트가 대신합니다.

숫자로 확인하기

송신 횟수 — 호스트 5대 가운데 3대(H1, H3, H5)가 데이터를 원할 때 유니캐스트는 3번, 브로드캐스트와 멀티캐스트는 1번 보냅니다.
받는 호스트 수 — 유니캐스트는 3대, 브로드캐스트는 5대 전부(원하지 않는 2대 포함), 멀티캐스트는 가입한 3대입니다.
MAC 변환 — 그룹 주소 239.1.2.3은 01:00:5e로 시작하는 MAC 주소 뒤에 하위 23비트(1.2.3)를 붙여 01:00:5e:01:02:03이 됩니다. 5비트가 빠져 그룹 주소 32개가 같은 MAC 주소를 씁니다.
브로드캐스트 주소 — 192.168.1.0/24 네트워크의 브로드캐스트 주소는 호스트 비트가 모두 1인 192.168.1.255이고, 제한된 브로드캐스트 주소는 255.255.255.255입니다.

자주 하는 오해

브로드캐스트는 인터넷 전체에 퍼진다 — 라우터가 브로드캐스트를 다른 네트워크로 넘기지 않으므로 같은 브로드캐스트 도메인 안에서만 전달됩니다.
멀티캐스트는 모두에게 전달된다 — 그룹에 가입한 호스트에게만 전달됩니다. 다만 IGMP 스누핑이 없는 스위치는 가입하지 않은 포트로도 프레임을 내보낼 수 있습니다.
멀티캐스트면 인터넷으로 영상 방송을 할 수 있다 — 인터넷의 일반 라우터는 멀티캐스트를 전달하지 않는 경우가 많아, 통신사 내부망(IPTV)이나 기업 내부망처럼 관리되는 네트워크에서 주로 씁니다. 인터넷 방송은 보통 HTTP 기반 스트리밍 같은 유니캐스트 방식으로 합니다.
192.168.1.255는 아무 호스트 주소다 — 192.168.1.0/24에서는 브로드캐스트 전용 주소라 호스트에 할당할 수 없습니다. 네트워크 크기에 따라 브로드캐스트 주소가 달라집니다.

면접에서 이렇게 물어요

면접 질문

유니캐스트, 브로드캐스트, 멀티캐스트의 차이는?

유니캐스트는 1:1, 브로드캐스트는 같은 네트워크의 모든 호스트, 멀티캐스트는 그룹에 가입한 호스트들에게만 보냅니다. 같은 데이터를 여럿에게 보낼 때 유니캐스트는 수신자 수만큼 송신해야 하지만 나머지는 한 번이면 됩니다.

면접 질문

브로드캐스트의 문제점은 무엇인가요?

필요 없는 호스트도 모두 패킷을 받아 처리해야 해서 호스트가 많을수록 낭비가 큽니다. 브로드캐스트가 폭주하는 폭풍이 생기면 같은 도메인 전체 성능이 크게 떨어집니다. VLAN으로 도메인을 나누면 영향 범위가 줄고, 스톰 컨트롤과 STP로 폭풍 자체를 막습니다.

면접 질문

멀티캐스트 수신자는 어떻게 그룹에 가입하나요?

IPv4에서는 호스트가 IGMP 멤버십 보고를 보내 가입을 알리고, 탈퇴도 IGMP로 알립니다. 스위치의 IGMP 스누핑이 가입자 포트를 기억해 그 포트로만 전달합니다.

면접 질문

IPv6에는 왜 브로드캐스트가 없나요?

IPv6는 브로드캐스트를 없애고 멀티캐스트로 대체했습니다. 모든 노드에게 보내는 주소(ff02::1) 같은 멀티캐스트 주소를 쓰고, ARP 역할도 멀티캐스트 기반의 이웃 탐색(NDP)이 맡습니다.

실제 시스템에서는

ARP와 DHCP — ARP 요청과 DHCP Discover는 브로드캐스트로 보냅니다. 상대의 주소를 모를 때 같은 네트워크 전체에 묻는 방식입니다.
서비스 탐색 — mDNS(224.0.0.251)와 SSDP(239.255.255.250) 같은 프로토콜이 멀티캐스트로 같은 네트워크의 기기와 서비스를 찾습니다.
IPTV와 금융 시세 — 통신사의 IPTV나 금융 시세 배포처럼 같은 데이터를 많은 수신자에게 동시에 보내는 관리된 네트워크에서 멀티캐스트를 씁니다.
라우팅 프로토콜 — OSPF는 Hello와 링크 상태 전달에 224.0.0.5(모든 OSPF 라우터)를, 대표 라우터(DR/BDR)로 보내는 전달에 224.0.0.6을 씁니다.

함께 보면 좋은 토픽

ARP — 브로드캐스트로 MAC 주소를 묻는 과정을 봅니다.
DHCP — 브로드캐스트로 시작하는 주소 할당 과정을 봅니다.
서브네팅 / CIDR — 브로드캐스트 주소가 정해지는 방식을 봅니다.
라우팅 — 브로드캐스트를 막고 네트워크를 나누는 라우터를 봅니다.

참고 자료

Python — UDP 멀티캐스트 송신과 수신 (그룹 가입)

import socket, struct

GROUP, PORT = "239.1.2.3", 5007

# 수신: 그룹에 가입하면 호스트가 IGMP 가입 보고를 보낸다
rx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
rx.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
rx.bind(("", PORT))
mreq = struct.pack("4s4s", socket.inet_aton(GROUP), socket.inet_aton("0.0.0.0"))
rx.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
data, addr = rx.recvfrom(1024)

# 송신: 그룹 주소로 한 번만 보낸다
tx = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
tx.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
tx.sendto(b"hello group", (GROUP, PORT))

수신 쪽은 UDP 소켓을 만들어 포트에 묶은 뒤, IP_ADD_MEMBERSHIP 옵션으로 그룹 239.1.2.3에 가입합니다. 이 옵션을 설정하면 운영체제가 네트워크에 IGMP 멤버십 보고를 보내 시각화의 그룹 가입 탭과 같은 가입이 이루어집니다. 송신 쪽은 그룹 주소와 포트로 한 번만 보내면 되고, 받는 호스트가 몇 대든 송신 코드는 같습니다. IP_MULTICAST_TTL은 패킷의 TTL(라우터를 지날 때마다 1씩 감소)을 정하며, 기본값 1은 라우터를 넘지 못해 같은 네트워크 안에서만 전달됩니다. 멀티캐스트는 TCP로 쓸 수 없고 보통 UDP로 보내므로 손실된 데이터를 자동으로 다시 보내 주지 않아, 필요하면 애플리케이션이 따로 처리해야 합니다. 위 코드는 수신(rx)과 송신(tx) 프로세스를 따로 실행해야 하며, 한 스크립트로 이어 실행하면 recvfrom에서 멈춥니다.

Python, tcpdump — 브로드캐스트 송신과 관찰

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)   # 브로드캐스트 허용
s.sendto(b"who is there?", ("255.255.255.255", 9999))

# 터미널에서 브로드캐스트 / 멀티캐스트 프레임만 관찰하기
sudo tcpdump -i eth0 -n 'ether broadcast'
sudo tcpdump -i eth0 -n 'ip multicast'

UDP 소켓에서 브로드캐스트를 보내려면 SO_BROADCAST 옵션을 켜야 합니다. 목적지 255.255.255.255는 제한된 브로드캐스트 주소로 같은 네트워크 안의 모든 호스트에 전달되고 라우터를 넘지 않습니다. tcpdump의 ether broadcast 필터는 목적지가 브로드캐스트인 이더넷 프레임을, ip multicast 필터는 멀티캐스트 목적지의 IP 패킷을 보여 줍니다. ether broadcast 필터에는 ARP 요청과 DHCP Discover 같은 브로드캐스트 프레임이 잡힙니다. 브로드캐스트는 같은 네트워크의 모든 호스트가 받아 처리해야 하므로 호스트 수가 많을수록 부담이 커지는 방식입니다. 인터페이스 이름(eth0)은 환경마다 다릅니다.

Python — 주소 종류 판별과 멀티캐스트 MAC 계산

import ipaddress

for a in ["192.168.1.10", "192.168.1.255", "239.1.2.3", "224.0.0.1"]:
    print(a, ipaddress.ip_address(a).is_multicast)    # False False True True

net = ipaddress.ip_network("192.168.1.0/24")
print(net.broadcast_address)                          # 192.168.1.255

def mcast_mac(group):
    low23 = int(ipaddress.ip_address(group)) & 0x7FFFFF   # 하위 23비트
    mac = (0x01005E << 24) | low23
    return ":".join(f"{(mac >> s) & 0xFF:02x}" for s in range(40, -1, -8))

print(mcast_mac("239.1.2.3"))                       # 01:00:5e:01:02:03

ipaddress 모듈의 is_multicast는 주소가 멀티캐스트 영역(224.0.0.0/4)에 있는지 알려 주고, 네트워크 객체의 broadcast_address는 서브넷의 마지막 주소인 브로드캐스트 주소를 돌려줍니다. 192.168.1.255는 유니캐스트처럼 보여도 멀티캐스트가 아닙니다. mcast_mac은 그룹 주소의 하위 23비트를 01:00:5e로 시작하는 MAC 주소 뒤에 붙입니다. 239.1.2.3은 01:00:5e:01:02:03이 되며, 시각화의 주소 탭이 보여 주는 값과 같습니다. 그룹 주소의 의미 있는 28비트 중 하위 23비트만 MAC 주소에 담기고 나머지 5비트는 빠집니다. 그래서 224.0.2.3과 224.128.2.3은 둘 다 01:00:5e:00:02:03을 쓰는 식으로, 여러 그룹이 같은 MAC 주소를 공유할 수 있습니다.

Q1

유니캐스트(Unicast)란?

"uni" 는 하나를 뜻합니다.
유니캐스트는 송신자와 수신자가 1:1로 통신하는 방식입니다. 웹 서핑 같은 일반적인 인터넷 통신 대부분이 유니캐스트입니다.

Q2

브로드캐스트(Broadcast)란?

ARP 요청, DHCP Discover 에서 쓰인 방식입니다.
IPv4에서 브로드캐스트는 같은 브로드캐스트 도메인 안의 모든 호스트에게 전송하는 방식입니다. 라우터는 브로드캐스트를 넘기지 않으므로 인터넷 전체로 퍼지지 않습니다. IPv6에는 브로드캐스트가 없고 멀티캐스트가 그 역할을 맡습니다.

Q3

멀티캐스트(Multicast)에 대한 설명으로 옳은 것은?

IPTV나 실시간 영상 배포에 쓰입니다.
멀티캐스트는 그룹에 가입한 수신자에게만 데이터를 전달합니다. 송신자는 한 번만 보내도 되고, 여러 수신자에게 각각 유니캐스트하는 것보다 대역폭을 아낄 수 있습니다.