ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TCP/IP 소켓 프로그래밍 - 14장 : 멀티캐스트 & 브로드캐스트
    네트워크 2024. 6. 25. 17:28
     

    14장

    14-1 멀티캐스트 ( Multicast )

     

    멀티캐스트 방식은 UDP를 기반으로 데이터를 전송한다.

     

     

    UDP에서는 하나의 목적지(호스트)를 대상으로 데이터 전송이 이루어지지만,

    멀티캐스트에서는 특정 그룹의 다수 호스트에게 데이터 전송이 이루어진다.

     

     

    멀티캐스트의 데이터 전송방식은 아래와 같다.

    • 멀티캐스트 서버는 특정 멀티캐스트 그룹에게 데이터를 단한번 전송함.
    • 멀티캐스트 그룹의 수는 IP주소 범위 내 추가 가능 ( class D : 224.0.0.0 ~ 239.255.255.255 )
    • 특정 멀티캐스트 그룹으로 전송되는 데이터를 수신하려면 해당 그룹에 가입하면 됨.

     

    멀티캐스트 한 패킷은 네트워크 상에서 라우터들이 이 패킷을 복사해 다수의 호스트에게 전달한다.

    하나의 패킷이 여러 라우터를 통해 계속해서 복사되고 있지만,

    하나의 영역에 동일한 패킷이 둘 이상 전송되지 않는다는 점에서 트래픽면에서 효율적이다.

     

    멀티캐스팅을 지원하지 않는 라우터 또는 네트워크의 불필요한 트래픽 문제 때문에

    일부러 막아놓은 경우도 있으니 주의해야 한다.

     

    멀티캐스트 패킷의 전송에는 TTL 설정이 필요하다.

    TTL은 Time to Live의 약자로 패킷을 얼마나 멀리 보낼 것인가를 결정한다.

    라우터를 하나 거칠 때마다 TTL 값은 1씩 감소하고 0이 되면 패킷이 소멸된다.

     

    너무 큰 수의 TTL은 네트워크 트래픽에 문제를 야기할 수 있다.

     

    TTL 설정은 9장에서의 소켓 옵션설정을 통해 이루어지며, 관련 프로토콜 레벨은 IPPROTO_IP이다.

    다음은 TTL 32로 설정하는 코드 예시이다.

     

    int send_sock;
    int time_live = 32;
    ...
    send_sock = socket(PF_INET, SOCK_DGRAM, 0);   //udp로 설정해준 것을 잊지말자!
    setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void*)&time_live, sizeof(time_live));
    ...

     

    멀티캐스트 그룹의 가입도 마찬가지로 소켓 옵션설정으로 이루어지며

    관련 프로토콜 레벨 역시 IPPROTO_IP 이다.

    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));
    ...

     

     

    구조체 ip_mreq는 아래와 같이 구성되어 있다.

    struct ip_mreq
    {
    	struct in_addr imr_multiaddr;  //가입할 그룹의 ip주소
    	struct in_addr imr_interface;  //가입하려는 호스트의 IP 주소 (이때, INADDR_ANY 이용가능)
    }

     

     

    아래는 멀티캐스팅 방식으로 receiver 가 2초에 한번씩 sender에게 문장을 받은 예제이다.

     

     

    news_receiver.c 예제를 구현할 때, 책과 달리 __USE_MISC 매크로를 정의해주어야 한다.

    추가적으로, 왜인지 마지막줄은 출력을 잘 못하는 것 같다. 이 부분에 대한 공부가 필요하다.

    (문서의 끝부분에서 EOF를 바탕으로 처리를 어떻게 할지에 대한 공부)

     

    receiver가 sender보다 늦게 실행되면 이전에 전송된 데이터를 수신할 수 없다.

     

    cf)

    멀티캐스트는 MBone이라 불리는 가상네트워크를 기반으로 동작하는데,

    인터넷 상에서 별도의 프로토콜을 기반으로 동작하는 것이다.

    멀티캐스트가 가능하도록 돕는 가상 네트워크 연구는 멀티캐스트 기반 응용 소프트웨어를 개발하는 것과 다른 분야임을 잊지 말자!

    MBone에 대해서도 찾아봐야 겠다.

     


     

    14-2 브로드캐스트 ( Broadcast )

     

    멀티캐스트와의 공통점은 한 번에 여러 호스트에게 데이터를 전송한다는 점이다.

     

    차이점은

    • 멀티캐스트는 서로 다른 네트워크에 존재해도 수신이 가능하지만,
    • 브로드캐스트는 동일 네트워크에 연결된 호스트로 전송대상이 제한된다.

     

    브로드캐스트는 UDP를 기반으로 데이터를 송수신한다.

     

     

    브로드캐스트는 전송 시 사용되는 IP주소에 따라 아래와 같이 나뉜다.

    • Directed 브로드캐스트
    • Local 브로드캐스트

    Directed 브로드캐스트는

    네트워크 주소를 제외한 나머지 호스트 주소를 전부 1로 설정하면 된다.

    (192.12.34를 네트워크 주소로 가진다면, 192.12.34.255로 브로드캐스트 할 수 있다. )

     

    Local 브로드캐스트는

    255.255.255.255 IP 주소를 사용하면 된다.

    ( 192.12.34를 네트워크 주소로 가지는 한 호스트가 255.255.255.255로

    동일 네트워크 상 모든 호스트에게 브로드캐스트 할 수 있다.)

     

     

    기본적으로 생성되는 소켓은 브로드캐스트 기반의 데이터 전송이 불가능하도록 설정되어있으니,

    아래와 같이 바꿔줘야 한다. ( sender 입장에서만 바꿔주면 된다. )

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

     

     

    아래는 브로드 캐스트 방식 예제를 약간 고쳐서 실행한 결과이다.

     

    cf)

    텍스트 파일을 만들어서 입력을 한 후, 이 값을 읽어 sender가 보내주는 예제인데,

    이때, 텍스트 파일을 어떻게 작성하느냐에 따라서 receiver가 출력할 때, 마지막 문장을 출력할 수도 있고 출력하지 않을 수도 있다. ( 마지막에 enter를 쳐주면 printf에서는 자동으로 flush가 이루어지는 것 같다. )

     

    fflush(stdout)을 이용해 출력 스트림을 한 번 비워주는 것이 도움이 될 수 있다.

    파일 입출력 공부해야겠지?



Designed by Tistory.