유니/멀티/브로드캐스트
네트워크에서 데이터를 보낼 때 가장 먼저 정해야 할 것은 "누구에게 보내는가"입니다. 한 명에게만 보낼 수도 있고, 같은 네트워크의 모두에게 보낼 수도 있고, 관심 있는 그룹에게만 보낼 수도 있습니다. 이 세 가지가 유니캐스트(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 메시지를 엿보고 가입자가 있는 포트만 기억해, 멀티캐스트 프레임을 그 포트로만 보내는 기능입니다. 없으면 모든 포트로 흘러갑니다.
전송 방식의 배경
ARP와 DHCP 같은 기본 프로토콜은 브로드캐스트를 이용합니다. 1989년 RFC 1112는 IP 멀티캐스트를 위한 호스트 확장과 IGMP를 정의했고, 이후 IGMPv2(RFC 2236)에서 탈퇴 메시지(Leave)가 추가되었습니다. IPv6에는 브로드캐스트가 없고, 같은 용도를 멀티캐스트가 대신합니다.
숫자로 확인하기
자주 하는 오해
면접에서 이렇게 물어요
면접 질문
유니캐스트, 브로드캐스트, 멀티캐스트의 차이는?
유니캐스트는 1:1, 브로드캐스트는 같은 네트워크의 모든 호스트, 멀티캐스트는 그룹에 가입한 호스트들에게만 보냅니다. 같은 데이터를 여럿에게 보낼 때 유니캐스트는 수신자 수만큼 송신해야 하지만 나머지는 한 번이면 됩니다.
면접 질문
브로드캐스트의 문제점은 무엇인가요?
필요 없는 호스트도 모두 패킷을 받아 처리해야 해서 호스트가 많을수록 낭비가 큽니다. 브로드캐스트가 폭주하는 폭풍이 생기면 같은 도메인 전체 성능이 크게 떨어집니다. VLAN으로 도메인을 나누면 영향 범위가 줄고, 스톰 컨트롤과 STP로 폭풍 자체를 막습니다.
면접 질문
멀티캐스트 수신자는 어떻게 그룹에 가입하나요?
IPv4에서는 호스트가 IGMP 멤버십 보고를 보내 가입을 알리고, 탈퇴도 IGMP로 알립니다. 스위치의 IGMP 스누핑이 가입자 포트를 기억해 그 포트로만 전달합니다.
면접 질문
IPv6에는 왜 브로드캐스트가 없나요?
IPv6는 브로드캐스트를 없애고 멀티캐스트로 대체했습니다. 모든 노드에게 보내는 주소(ff02::1) 같은 멀티캐스트 주소를 쓰고, ARP 역할도 멀티캐스트 기반의 이웃 탐색(NDP)이 맡습니다.
실제 시스템에서는
함께 보면 좋은 토픽
참고 자료
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)란?
Q2
브로드캐스트(Broadcast)란?
Q3
멀티캐스트(Multicast)에 대한 설명으로 옳은 것은?