본문 바로가기
전공 수업/컴퓨터 통신(Computer Communication)

[14주 차] - 소켓 옵션 관련 함수, 멀티캐스팅과 브로드캐스팅

by TwoJun 2022. 12. 2.

    과목명 : 컴퓨터 통신(Computer communication)

수업일자 : 2022년 11월 28일 (월)

 

 

 

 

 

1. 브로드캐스팅(Broadcasting)

1-1. 정의

- 송신 호스트가 보낸 데이터를 네트워크에 연결된 모든 호스트가 받게 되는 데이터 송신 방법을 의미합니다.

 

 

 

 

1-2. 네트워크 브로드캐스트(Network-directed broadcast)

- 호스트 ID 비트가 모두가 1인 경우로 특정 네트워크에 대한 브로드캐스팅을 의미합니다. 데이터가 라우터를 거쳐야 하나 라우터 설정에 따라 데이터가 전송되지 않아 브로드캐스팅이 불가능할 수 있는 특징이 있습니다.

Network-directed broadcast
브로드캐스트의 주소 format - 네트워크 브로드캐스트

 

 

 

 

1-3. 서브넷 브로드캐스트(Subnet-directed broadcast)

- 서브넷 ID를 제외한 호스트 ID 비트가 모두 1인 경우로, 특정 서브넷에 대한 브로드캐스팅을 의미하고 있습니다. 마찬가지로 라우터 설정에 의해 데이터가 미전송될 수 있으므로 일반적인 외부 서브넷 브로드캐스팅은 불가능하나, 송신자가 속한 서브넷에 대해선 브로드캐스팅이 가능합니다.

Subnet-directed broadcast

 

브로드캐스트의 주소 format - 서브넷 브로드캐스트

 

 

 

 

1-4. 지역 브로드캐스트(Local broadcast 또는 Limited broadcast)

- 송신 호스트 자신이 속한 네트워크에 대한 브로드캐스팅을 의미합니다. 자신이 속한 네트워크이기에 항상 브로드캐스팅이 가능하며 브로드캐스트 데이터가 라우터를 넘어가지 않는다는 특징이 있습니다.

Local broadcast 또는 Limited broadcast

 

브로드캐스트의 주소 format - 지역 브로드캐스트

 

 

 

 

 

 

 

2. 소켓 옵션(Socket option)

2-1. 소켓 옵션의 개요

Multi-tasking OS, 소켓 프로그래밍 Model

 

- 소켓 프로그래밍은 TCP/IP 등 통신 프로토콜의 기능을 사용하여 통신하는 응용 프로그램을 설계할 수 있는 네트워크 프로그래밍 기법입니다.

 

- 현재까지 작성된 모든 소켓 프로그램은 소켓의 동작 속성 변경 없이 소켓 함수를 그대로 사용하여 구현했으나, 다양한 요구 사항에 맞는 응용 프로그램을 작성하다 보면 소켓 함수의 코드나 프로토콜의 동작이 달라져야 할 때가 있으며 이때 소켓 옵션을 사용하여 소켓 함수의 동작을 변경함으로써 코드와 프로토콜 구현을 세부적으로 조정할 수 있게 됩니다.

 

- 소켓 옵션은 처리 주체에 따라 아래와 같이 두 가지 종류로 구분할 수 있습니다

 

 

 

 

2-2. 소켓 옵션의 두 가지 종류

(1) 소켓 코드가 처리하는 옵션

- 소켓 옵션을 설정하면 소켓 코드에서 자체적으로 해석하고 처리합니다. 

 

 

(2) 프로토콜 구현 코드가 처리하는 옵션

- 해당 소켓 옵션을 설정하면 프로토콜 구현 코드에서 해석하고 처리하게 됩니다.

 

 

 

 

2-3. 소켓 옵션을 설정하는 함수 : setsockopt()

int setsockopt( 
    SOCKET s, 
    int level,    // 소켓 라이브러리의 위치를 지정한다. (User space 또는 Kernel space의 라이브러리)
    int optname,
    const char *optval,
    int optlen
);

(1) s

- 소켓 옵션을 적용할 소켓 대상입니다.

 

(2) level

- 소켓 라이브러리의 위치를 지정합니다.

 

(3) optname

- 설정할 옵션 이름을 지정합니다.

 

(4) optval

- 설정할 옵션 값을 가지고 있는 버퍼의 주소입니다.

 

(5) optlen

- optval이 가리키는 버퍼의 크기입니다.(바이트 단위)

 

 

 

 

 

2-4. 설정된 소켓의 옵션 값을 얻는 함수 : getsockopt()

int getsockopt(
    SOCKET s, 
    int level,
    int optname,
    char *optval,
    int *optlen
);

(1) s

- 옵션 값을 얻을 소켓 대상입니다.

 

(2) level

- 옵션을 해석하고 처리할 주체를 지시하게 됩니다.

 

(3) optname

- 옵션 값을 얻을 옵션의 이름을 지정합니다.

 

(4) optval

- 얻은 옵션 값을 저장할 버퍼의 주소입니다.

 

(5) optlen

- 값-결과 인자로 사용되며 해당 함수 호출 후 얻은 옵션 값의 크기로 운영체제가 값을 채워줍니다.

 

 

 

 

 

2-5. 사용할 소켓 라이브러리의 대표적인 예시 : IP 프로토콜 코드가 처리하는 IPPROTO_IP

optname optval 타입 get set 설명
IP_HDRINCL BOOL - - 데이터 송신 시 IP 헤더 직접 포함 여부
IP_TTL int - - IP 패킷의  TTL(Time-to-live) 값 설정
IP_MULTICAST_IF IN_ADDR{} - - 멀티캐스트 패킷을 보낼 인터페이스 선택
IP_MULTICAST_TTL int  - - 멀티캐스트 패킷의 TTL 값 설정
IP_MULTICAST_LOOP BOOL - - 멀티캐스트 패킷의 루프백 여부 결정
IP_ADD_MEMBERSHIP
IP_DROP_MEMBERSHIP
ip_mreq{}

(해당 optval 값은 참여/탈퇴할 그룹의 IP 주소)
  - 멀티캐스트 그룹의 참여(Join)와 탈퇴

 

 

 

 

 

 

 

3. 멀티캐스팅(Multicasting), IPPROTO_IP, IPPROTO_IPV6 옵션

3-1. 멀티캐스팅(Multicasting)의 정의

- 멀티캐스팅이란, 송신 측에서 한 번의 송신으로 목표로 하는(동일한 그룹에 가입된) 네트워크 사용자에게 데이터를 동시에 전송하는 것을 의미합니다.

 

 

 

 

3-2. 멀티캐스팅용 주소들(IPv4, IPv6)

- 멀티 캐스팅용 주소의 경우 고정된 상위 비트를 제외한 나머지 부분을 그룹 ID라고 부르며 그룹 ID가 통신할 멀티캐스트 그룹을 나타냅니다. 응용 프로그램들은 멀티캐스트 데이터를 수신하기 위해 자유롭게 그룹에 가입(Join)하고 탈퇴(Leave)할 수 있습니다.

 

(1) IPv4

- 224.0.0.0 ~ 239.255.255.255

멀티캐스트 주소 format(IPv4)

 

 

(2) IPv6

- FFXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXX (X는 0~F까지의 Hexademical)

멀티캐스트 주소 format(IPv6)

 

 

 

 

3-3. 웹 멀티캐스팅의 특징

멀티캐스트의 데이터 전송 방식들

 

(1) 그룹의 가입과 탈퇴가 자유롭다는 특징이 있습니다.

 

(2) 아래 그림처럼 A, B 호스트는 그룹 구성원에게 언제든지 멀티캐스트 데이터를 송신할 수 있습니다.

 

(3) 멀티캐스트 데이터를 수신하려면 그룹에 가입되어 있어야 합니다.

 

(4) 멀티캐스트 데이터를 송신하기 위해 반드시 그룹에 Join해야 하는 것은 아닙니다.

- 아래 그림처럼 그룹에 Join하지 않은 C도 데이터를 보내고 있습니다.

 

 

 

 

 

3-4. 멀티캐스팅 코드

(1) IP_MULTICAST_IF, IPV6_MULTICAST_IF 옵션

- IP 주소를 둘 이상 보유한 호스트에서 멀티캐스트 데이터를 보낼 네트워크 인터페이스를 선택할 때 사용합니다.

 

- 해당 코드를 수행하면 코드에서 설정한 IP 주소의 네트워크 인터페이스를 통해 멀티캐스트 데이터가 전송됩니다.

 

 

(2) IP_MULTICAST_TTL, IPV6_MULTICAST_TTL 옵션

- 라우터 경계를 넘어 특정 범위까지 패킷을 보내려면 해당 옵션을 사용하여 TTL 값을 변경한 후 데이터를 보낼 수 있습니다

 

- 보통 TTL 값은 Default 값으로 1로 세팅되며, 0이 되면 패킷은 중간에 버려지고 1로 세팅된 TTL 값은 라우터 경계를 넘어갈 수 없기에 해당 옵션을 사용하여 TTL 값을 변경한 후 외부로 패킷을 전송할 수 있도록 합니다.

 

 

(3) IP_MULTICAST_LOOP, IPV6_MULTICAST_LOOP 옵션

- 멀티캐스트 그룹에 가입한 응용 프로그램이 자신의 그룹에 멀티캐스트 데이터를 보내면 자신도 수신받게 되며, 이때 해당 루프백 옵션을 통해 그룹에게 멀티캐스트 데이터를 보내고 자신은 받지 않도록 처리할 수 있습니다.

 

 

 

(4) IP_ADD_MEMBERSHIP / IP_DROP_MEMBERSHIP

IPV6_ADD_MEMBERSHIP / IPV6_DROP_MEMBERSHIP 옵션

- 멀티캐스트 데이터를 수신받기 위해선 해당 그룹에 Join되어 있어야 합니다. 

 

-  IP(IPV6)_ADD_MEMBERSHIP 옵션은 그룹에 가입(Join)할 때 사용됩니다.

 

- IP(IPV6)_DROP_MEMBERSHIP 옵션은 해당 그룹에서 탈퇴(Leave)할 때 사용하게 됩니다.

 

- IP 옵션은 ip_mreq 구조체를, IPv6 옵션은 ipv6_mreq 구조체를 옵션으로 사용하게 됩니다.

 

- 아래는 예시 코드입니다.

struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("123.123.123.123");    // 본인이 가입하거나 탈퇴할 그룹의 주소
mreq.imr_interface.s._addr = inet_addr("147.76.111.12");    // 본인 Interface의 주소
setsockopt(sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq, sizeof(mreq));

 

 

 

 

 

3-5. IPPROTO_TCP 레벨 옵션

- TCP는 신뢰성 있는 데이터 전송을 담당하는 프로토콜 중 하나로 ACK(Acknowledgement)에 기반한 데이터 재전송을 진행하게 됩니다. 

 

- 즉, 데이터를 보낸 후 상대 측이 잘 수신하였는지 ACK 패킷을 보내 확인하고 수신되지 못했다면 데이터를 재전송합니다.

 

 

 

 

 

 

 

 

- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.

- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.

댓글