멀티캐스트란?
멀티캐스트(multicast)란 여러 호스트에게 데이터를 동시에 전송하는 것을 말합니다. 멀티캐스트가 수행되는 절차는 다음과 같습니다. 먼저, 클라이언트는 멀티캐스트 그룹에 참여 (join)해야 합니다. 멀티캐스트 그룹에 참여함으로써 해당 멀티캐스트 주소로 들어오는 데이터를 수신하고 싶다고 알릴 수 있습니다. 그룹에 참여하고 나면 서버가 멀티캐스트 주소로 데이터를 송신했을 때 멀티캐스트 그룹에 참여한 모든 클라이언트에게 데이터가 전달됩니다. 아래는 멀티캐스트 데이터 전송을 그림으로 표현한 것입니다. (ko.wikipedia.org/wiki/멀티캐스트)
멀티캐스트 주소
멀티캐스트 그룹에 참여하기 위해서는 멀티캐스트 주소를 이용해야 합니다. 그런데 모든 주소를 멀티캐스트 주소로 사용할 수 있는 것은 아닙니다. IPv4와 IPv6 둘 다 멀티캐스트를 위한 주소 범위를 따로 지정하고 있습니다. 먼저 IPv4에서 멀티캐스트를 위해 할당된 범위는 224.0.0.0 ~ 239.255.255.255입니다.
그 중에서 특정 목적으로 사용되는 멀티캐스트 주소들은 다음과 같습니다.
- 224.0.0.0: Base address (reserved)
- 224.0.0.1 ~ 224.0.0.255: Well-known address (reserved)
- 224.0.0.1: 동일한 네트워크에 있는 모든 호스트 그룹
- 224.0.0.2: 동일한 네트워크에 있는 모든 라우터 그룹
- ...
- 224.0.0.22: IGMPv3 (Internet group management protocol; 멀티캐스트 그룹 관리용 프로토콜)
실제 사용할 수 있는 멀티캐스트 주소는 224.0.1.0 ~ 238.255.255.255 입니다. 위키피디아 내용을 보면 더 세부적으로 나뉘는 것 같습니다. (en.wikipedia.org/wiki/Multicast_address)
멀티캐스트 예제 코드
아래에서 제공하는 샘플 코드를 이용할 수 있습니다. 코드 전문을 발췌하지는 않았습니다.
cs.ecs.baylor.edu/~donahoo/practical/CSockets2/textcode.html
- MulticastSender.c
- MulticastReceiver.c
멀티캐스트 예제가 동작하지 않을 때
1. bind failed 문제
리눅스에서 예제 코드를 빌드하고 MulticastReceiver를 하나 이상 실행하면 bind failed 문제가 발생합니다. SO_REUSEADDR 소켓 옵션을 추가하면 bind 에러가 발생하지 않습니다.
stackoverflow.com/questions/18443004/usage-of-so-reuseport-with-multicast-udp
// Add SO_REUSEADDR socket option
int optvalue;
if (setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, &optvalue, sizeof(optvalue)) < 0) {
DieWithSystemMessage("setsockopt(SO_REUSEPORT) failed");
}
2. 라우팅 문제
다른 호스트에 존재하는 멀티캐스트 서버와 클라이언트가 통신이 안되는 문제가 있었습니다. 멀티캐스트 주소를 인터넷 인터페이스에 전달하도록 라우팅 테이블을 업데이트해서 통신할 수 있었습니다. 사실 이 방법이 틀린 방법일 수도 있습니다....
route add -net x.x.x.x netmask x.x.x.x eth0
만약 224.x.x.x 주소를 사용하는 네트워크를 인터넷 인터페이스 eth0로 전달하려면 아래 명령어를 사용하면 됩니다.
route add -net 224.0.0.0 netmask 255.0.0.0 eth0
'💻 programming' 카테고리의 다른 글
Putty 테마, 폰트 변경하기 (0) | 2021.08.05 |
---|---|
리눅스 terminator 세팅하기 (0) | 2021.08.05 |
git 커밋 메시지를 작성하는 방법 (How to Write a Git Commit Message) (0) | 2021.02.26 |
[TCP/IP] 2. TCP 서버 - 클라이언트 (IPv4) (0) | 2020.12.18 |
[TCP/IP] 1. 네트워크, 패킷 그리고 프로토콜 (0) | 2020.12.18 |
댓글