본문 바로가기
💻 programming

[TCP/IP] 멀티캐스팅 프로그래밍, 라우팅 테이블 업데이트

by 연구원-A 2021. 1. 13.
반응형

멀티캐스트란?

멀티캐스트(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
반응형

댓글