'Network/Network'에 해당되는 글 31건

  1. 2012.01.15 Multicast (2) IGMP
  2. 2012.01.15 Multicast (1) 기본 이론
  3. 2012.01.15 Multicast Address 멀티캐스트 주소
  4. 2011.12.26 IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소 1
  5. 2011.12.26 소켓 옵션
  6. 2011.12.22 Socket 함수 정리
  7. 2011.12.22 block & non-block
  8. 2011.12.22 socket select/poll
  9. 2011.12.02 IP Subnet
  10. 2011.12.02 멀티캐스트 원리

Multicast (2) IGMP

Network/Network 2012. 1. 15. 21:13

1. IGMP

 

IGMP는 Client와 Router(L3 장비) 간의 Multicast 정보를 교환할 때 사용하는 Protocol

 

Multicast Group에 대해 가입과 탈퇴를 유지하기 위하여 사용된다.

 

IGMP를 통하여 Multicast Group에 join을 할 거면 Client에서 데이터를 받기 원하는 Multicast 주소를 라우터에게 알려

 

Multicast Group에 가입시키고 더이상 Multicast 데이터를 받기를 원치 않으면 그룹에서 탈퇴하겠다는 메시지를 라우터에게 알린다.

 

또한 IGMP는 계속하여 Multicast 데이터를 받을 지를 묻는 Query 역할도 한다.

 

 

 2. IGMP Message

 

IGMP Message는 Query Message와 Report Message와 Leave Message 가 있다. 각 각에 대해 알아보면...

 

0x11   Membership Query : 라우터가 호스트에게 Multicast Group으로 발송하는 데이터를 받기 원하는지 묻는다.

 

0x12   IGMP version 1 Membership Report : Query에 대한 답변으로 IGMP version 1으로 받기를 원할 때 사용한다.

 

0x16   IGMP version 2 Membership Report : Query에 대한 답변으로 IGMP version 2로 받기를 원할 때 사용한다.

 

0x17   Leave Report : IGMP version 2에만 사용하는 Message로 데이터를 그만 받기를 원할 때 사용한다.

 

※ 각 Message에 대해 다음 Topology를 통해 알아보자.

 

 

1) Topology

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

※ R1을 가상으로 서버로 만들고 P1, P2, P3는 가상의 Client로 한다.

 

    P1에 이더넷 포트 중 하나는 VM-Ware Lan Card와 연결 시켜 IGMP Message에 대한 Capture를 한다.

 

 

2) Config

 

 

1> Basic Config

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

※ 각 라우터마다 공통적으로 설정한다. Multicasting Routing Protocol은 나중에 포스트로 다루어 보도록 한다.

 

 

2> Multicast Group 가입

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

※ Clinet 쪽인 P1에서 임시적인 방법으로 Join을 하여 IGMP v2 Membership Report를 보낸다.

 

    그리고 계속하여 Multicast Group에 Join 할 것인지 묻는 Membership Query를 받는다.

 

 

3> Multicast Group 탈퇴

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

※ Multicast Group에서 탈퇴함으로 Leave Report를 보낸다.

 

 

3) Analyze

 

 

1> Membership Query Message

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

※ Multicast Server가 Multicast가 가능한 Host에게 Query를 한다.(224.0.0.1)

 

 

2> IGMP version 2 Membership Report Message

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

 

※ Multicast Group에 Join 함으로 Membership Report 메시지를 보낸다. ip igmp version 1으로 하면 IGMP v1 Report 메시지가 올 것이다.

 

 

3> Leave Report

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.

※ 그룹에서 탈퇴하면 Leave 메시지를 Multicast가 가능한 라우터에게 보낸다.(224.0.0.2)

 

 

>>> 이와 같이 IGMP를 통하여 Multicast Group에 가입할 지 탈퇴할 지 정보를 주고 받는다.

'Network > Network' 카테고리의 다른 글

FIN_WAIT  (0) 2012.03.22
inet_addr, inet_ntoa  (0) 2012.02.22
Multicast (1) 기본 이론  (0) 2012.01.15
Multicast Address 멀티캐스트 주소  (0) 2012.01.15
IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
:

Multicast (1) 기본 이론

Network/Network 2012. 1. 15. 21:12

1. Multicast 정의

 

Multicast는 Multicast Group에 소속된 특정 다수에게 데이터를 전송하는 기법이다.

 

다수에게 데이터를 보낼 때 Unicast 처럼 각 Host마다 데이터를 만들어 보내지 않고 하나의 데이터로만 전송을 한다.

 

그리고 하나의 데이터만을 전송하나 Broadcast 처럼 모든 Host에게 데이터를 전송하지 않고 그룹 멤버들에게만 전송을 한다.

 

한마디로 Multicast는 Unicast의 장점과 Broadcast 장점을 결합하여 만들어진 기술이라 할 수 있겠다.

 

그러면 Unicast, Broadcast, Multicast 데이터 전달 방식을 그림을 통해 비교하여 알아보자.

 

 

1) Unicast 방식

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.



 

※ 하나의 트래픽을 발송 하더라도 다수의 Host에게 전달한다면 그 트래픽을 Host 수 만큼 복사하여 각 Host에게 전달한다.

 

    신뢰성 있게 전송을 할 수 있으나 트래픽의 수 증가로 회선에 많은 부담을 갖는다. 다수의 Host에게 데이터 전달에 문제가 있다.

 

 

2) Broadcast 방식

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.



 

※ 하나의 트래픽이 다수의 Host에게 발송할 때 하나의 트래픽으로 보낸다. 그리하여 회선의 부담을 주지 않는다.

 

    그러나 네트워크 영역에서 다수의 Host들은 원하든 안원하든 모두 다 트래픽을 전달 받게 된다.

 

    No Receiver 입장에서는 그 트래픽이 불필요할 것이다.

 

 

3) Multicast 방식

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.



 

※ 원하는 Host에게만 데이터를 보내는 Unicast의 장점과 트래픽을 하나로 보내는 Broadcast 장점을 결합한 방식이 Multicast이다.

 

 

2. Multicast 특징

 

① Multicast Group 단위로 묶어 그 그룹의 Host들은 동시에 데이터를 받을 수 있다.

 

② UDP를 사용하여 전송함으로 신뢰성을 보장 받지는 못한다.

 

③ Client에서 Multicast 사용하는 Application을 시작하면 Multicast IP 주소와 Multicast MAC 주소를 라우터에 등록함으로 Multicast Group에 등록된다.

 

④ 하나의 Client에서 여러 Multicast 주소를 수용할 수 있다. 즉 여러 가지 Multicast 데이터를 동시에 받을 수 있다.

 

⑤ Server가 Multicast 주소로 데이터를 전송 중에 있을 때 중간에 Client가 끼어 들어도 처음부터 데이터를 받을 수 없고 중간 부터 데이터를 받게 된다.

 

 

3. Multicast 주소 체계

 

1) Multicast IP 주소 체계

 

224.0.0.0 ~ 239.255.255.255 범위를 갖는 Class D IP 주소를 사용한다.

 

 224.0.0.0 ~ 224.0.0.255

 IETF에서 관리용으로 사용되는 대역

 (RIP, EIGRP, OSPF 등)

 224.0.1.0 ~ 238.255.255.255

 실제 인터넷에서 Multicast를 사용한 기관이나

 기업에게 할당하는 대역

 232.0.0.0 ~ 232.255.255.255

 PIM 기술을 위해 사용하는 대역

 

 233.0.0.0 ~ 233.255.255.255

 하나의 AS 내에 전파를 원할 때 사용하는 대역

 

 239.0.0.0 ~ 239.255.255.255

 기관이나 기업 내부에서 사용할 수 있는

 사설 Multicast 주소

 

※ 다음과 같이 Multicast 주소를 갖는다. Multicast를 할 시 주요 IP 두 개는 다음과 같은 역할을 한다.

 

    224.0.0.1 : 현재 서브넷에 존재하는 Multicast가 가능한 모든 호스트를 지칭한다.

 

    224.0.0.2 : 현재 서브넷에 존재하는 Multicast가 가능한 모든 라우터를 지칭한다.

 

 

2) Multicast MAC 주소 체계

 

Multicast MAC 주소는 앞에 0100.5Exx.xxxx 가 붙고 뒤에 xxx들은 IP 주소에 일부분을 참조하여 이루어 진다.

 

예를 들어 227.35.189.34 의 Multicast MAC 주소를 보면

 

   227      .     35       .     189      .     34         를 이진수로 표현하면 아래와 같다.

 

1110 0011 . 0010 0011 . 1011 1101 . 0010 0010   빨간색은 참조하지 않고 파란 부분만 참조를 한다.

 

 

초록색 부분인 Multicast MAC 기본 앞부분을 제외하고 나머지는 위 파란색 부분과 매치 시킨다.

 

0000 0001 - 0000 0000 - 0101 1110 - 0010 0011 - 1011 1101 - 0010 0010   으로 표현된다.

 

    01       -     00       -     5E       -      23     -     BD      -      22

 

Multicast IP 주소 227.35.189.34의 Multicast MAC 주소는 0100.5E23.BD22 이다.

 

※ 글로 표현할려니 약간 헤깔리게 되어 있으나 법칙만 알아 두고 Window에 계산기를 이용하여 천천히 풀어보면 쉽게 될 것이다.

 

 

4. Multicast Protocol

 

어떤 장비와 Multicast 정보를 교환하느냐에 따라 세가지 프로토콜로 나눌 수 있다.

 

1) IGMP : 호스트와 라우터 간 Multicast 정보를 교환하는 프로토콜

 

2) CGMP , IGMP Snooping : 라우터와 스위치 간 Multicast 정보를 교환하는 프로토콜

 

3) Multicasting Routing Protocol : 라우터와 라우터 간 Multicast 정보를 교환하는 프로토콜

 

 

이미지를 클릭하시면 원본크기로 보실수 있습니다.



 

 

※ 어떤 장비에서 어떤 장비로 Multicast 정보를 보내느냐에 따라 사용하는 Protocol이 다르다. 다음 포스트부터 하나씩 자세히 알아보도록 하자. 


'Network > Network' 카테고리의 다른 글

inet_addr, inet_ntoa  (0) 2012.02.22
Multicast (2) IGMP  (0) 2012.01.15
Multicast Address 멀티캐스트 주소  (0) 2012.01.15
IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
소켓 옵션  (0) 2011.12.26
:

Multicast Address 멀티캐스트 주소

Network/Network 2012. 1. 15. 21:04
1. 개요

   멀티캐스트 주소는 멀티캐스트 그룹에 참여하는 구성원(Host Group)들을 확인하기 위
   한 주소를 말한다.  이 주소로 전송하면 이에 참여하는 여러 호스트들이 동시 수신.


2. 멀티캐스트 IP 주소 (3 계층)

   ㅇ Multicast Host Group Address
      - IP 멀티캐스트를 구현코자 IP 주소 체계상의 D 클래스로써 선두 4비트가 1110 으
        로 할당되였다.  이에따른 주소범위는 224.0.0.0 ~ 239.255.255.255 이다. 

   * IANA에서 특정목적의 관리용으로 사용하는 멀티캐스트 주소들은,
   ㅇ 224.0.0.0 : 예약됨
   ㅇ 224.0.0.1~224.0.0.255 : Well-Known Address으로 예약됨. IANA 관리. TTL=1.
                              주로 멀티캐스트 라우팅 프로토콜용.
      - 例 : 224.0.0.1  : Subnet에 있는 모든 호스트 그룹
             224.0.0.2  : Subnet에 있는 모든 라우터 그룹
             224.0.0.4  : 모든 DVMRP 라우터 그룹
             224.0.0.5  : 모든 OSPF 라우터 그룹(ALLSPFRouters),
             224.0.0.13 : 모든 PIM 라우터 그룹
             224.0.0.22 : IGMP v3 등

   * 실제 멀티캐스팅 응용을 위해 할당된 주소들은,
   ㅇ 224.0.1.0~238.255.255.255 : 실제 멀티캐스트 어플리케이션 용도
      - 232.0.0.0~232.255.255.255 : SSM(Source Specific Multicast) 용도
      - 233.0.0.0~233.255.255.255 : 하나의 AS 전체에 할당되는 주소
         . GLOP address
   ㅇ 239.0.0.0~239.255.255.255 : 사설망에서 사용 (Private)(Administrative Scoping)

   ※ 한편, IPv6 에서의 멀티캐스트 주소는 최상위 8 비트가 0xFF로 시작된다.


3. 멀티캐스트 Ethernet 주소 (2 계층)

  ㅇ 이더넷은 하드웨어에 의한 멀티캐스트를 구현
     - 멀티캐스트 주소를 구분하기 위해 최상위 Octet최하위 비트가 1인 경우를
       멀티캐스트로 정하고 있다.
     - 즉, *1, *3, *5, *7, *9, *B, *D, *F 로 시작하는 주소          ☞ MAC 주소

  ㅇ 이더넷 상에서 IP 멀티캐스트용으로만 할당된 주소
     -  01 00 5E 로 시작함.  즉, 01 00 5E 00 00 00 ~ 01 00 5E FF FF FF
     -  매핑 방법은, IP 멀티캐스트 주소의 끝 23개 비트를,  멀티캐스트 Ethernet 주소
        00010000. 00000000. 01011110. 0 의 바로 뒤에 붙이는 방법을 사용한다.

'Network > Network' 카테고리의 다른 글

Multicast (2) IGMP  (0) 2012.01.15
Multicast (1) 기본 이론  (0) 2012.01.15
IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
소켓 옵션  (0) 2011.12.26
Socket 함수 정리  (0) 2011.12.22
:

IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소

Network/Network 2011. 12. 26. 14:50

IP주소와 서브넷마스크(Subnet Mask) 를 알고있을경우 네트워크주소와 브로드캐스트주소를 구하는 방법이다.

 

IP주소는 각각의 컴퓨터에 네트워크 관리자에의해 고정으로 혹은 DHCP가 유동으로 부여해준다.

서브넷마스크는 네트워크를 구성할때, IP를 몇개를 하나의 단위로 묶는가에 대한 32비트 값이다.

(고정IP를 할당받는 PC라면 네트워크 관리자에게 문의, DHCP로부터 받는 유동IP 이면 해당 IP클래스의 디폴트 서브넷일 것이다.)

 

네트워크주소는 해당 서브넷의 시작주소,

브로드캐스트주소는 해당 서브넷의 마지막 주소로 보면 된다.

 

 

 

 

 

예1)

내 컴퓨터의 IP주소가 165.132.120.10 이고,

서브넷마스크가 255.255.252.0 이라고 가정하자.

이를 32비트로 표현하면

IP주소는 10100101 10000100 01111000 01100100

서브넷은 11111111 11111111 11111100 00000000 이다.

 

IP주소와 서브넷마스크를 비트 AND 연산을 수행하면 네트워크주소를 얻을 수 있다.

10100101 10000100 01111000 01100100

11111111 11111111 11111100 00000000

----------------------------------------------------------

10100101 10000100 01111000 00000000 <- 이것이 네트워크 주소 즉, 165.132.120.0 이다.

 

얻어진 네트워크 주소에서 서브넷마스크의 0으로된 비트를 모두 1로 바꾸어주면 브로드캐스트 주소를 얻을 수있다.

10100101 10000100 01111000 00000000 (네트워크주소) 에서 마지막 10개 비트(서브넷에서의 0에 해당하는 비트)를 1로 바꾸면,

10100101 10000100 01111011 11111111 <- 이것이 브로드캐스트 주소 즉, 165.132.123.255 이다.

 

그러므로 내 컴퓨터가 사용하는 IP주소 165.132.120.10 이 속한 네트워크는 165.132.120.0 ~ 165.132.123.255 이다.

 

 

 

 

 

예2)

내 컴퓨터의 IP주소가 165.132.120.10 이고,

서브넷마스크가 IP클래스 기본 서브넷마스크인 255.255.0.0 이라고 가정하면(즉, 서브넷이 없는경우)

비트 AND연산 없이 쉽게 네트워크 주소와 브로드캐스트 주소를 구할 수있다.

 

클래스 기본 서브넷마스크일경우, 165.132.120.10 이 클래스 B에 해당하는 IP주소이므로

165.132.0.0 이 네트워크 주소가 되고,

165.132.255.255 가 브로드캐스트 주소가 된다.

 

 

마찬가지로 서브넷마스크가 모두 255로 되어있는경우(1의 갯수가 8배수) 에도 쉽게 눈으로도 구할 수있다.

165.132.120.10 IP를 사용하고 서브넷이 255.255.255.0 이라면

네트워크주소는 165.132.120.0, 브로드캐스트주소는 165.132.120.255가 된다.

'Network > Network' 카테고리의 다른 글

Multicast (1) 기본 이론  (0) 2012.01.15
Multicast Address 멀티캐스트 주소  (0) 2012.01.15
소켓 옵션  (0) 2011.12.26
Socket 함수 정리  (0) 2011.12.22
block & non-block  (0) 2011.12.22
:

소켓 옵션

Network/Network 2011. 12. 26. 13:51

소켓 옵션

- SOL_SOCKET

optname

optval 타입

설명

SO_BROADCAST

BOOL

브로드캐스팅 허용

SO_DONTROUTE

BOOL

데이터 전송 시 라우팅 테이블 참조 과정 생략

SO_KEEPALIVE

BOOL

주기적으로 연결 여부 확인

SO_LINER

linger{}

보낼 데이터가 있을 경우 closesocket()함수 리턴 지연

SO_SNDBUF

SO_RCVBUF

int

소켓 송/수신 버퍼 크기 설정

SO_SNDTIMEO

SO_RCVTIMEO

int

send(), recv() 등의 함수에 대한 타임아웃(timeout) 설정

SO_REUSEADDR

BOOL

지역 주소(IP 주소, 포트 번호) 재사용 허용

*참고 - shutdown() 함수

 

optname

설명

SD_RECEIVE

소켓 s에 대한 데이터 수신이 금지 된다. 데이터 송신 가능

SD_SEND

소켓 s에 대한 데이터 송신이 금지 된다. 데이터 수신 가능

SD_BOTH

소켓 s에 대한 데이터 송수신이 모두 금지된다.

- IPPROTO_IP

optname

optval 타입

설명

IP_HDRINCL

BOOL

데이터를 보낼 때 IP 헤더를 포함

IP_TTL

int

IP 패킷의 TTL(time-to-live) 변경

IP_MULTICAST_IF

IN_ADR{}

멀티캐스트 패킷을 보낼 인터페이스 설정

IP_MULTICAST_TTL

int

멀티캐스트 패킷의 TTL 변경

IP_MULTICAST_LOOP

BOOL

멀티캐스트 패킷의 루프백 여부 설정

IP_ADD_MEMBERSHIP

IP_DROP_MEMBERSHIP

ip_mreq{}

멀티캐스트 그룹 가입과 탈퇴

 

- IPPROTO_TCP

optname

optval 타입

설명

TCP_NODELAY

BOOL

Nagle 알고리즘 작동 중지


'Network > Network' 카테고리의 다른 글

Multicast Address 멀티캐스트 주소  (0) 2012.01.15
IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
Socket 함수 정리  (0) 2011.12.22
block & non-block  (0) 2011.12.22
socket select/poll  (0) 2011.12.22
:

Socket 함수 정리

Network/Network 2011. 12. 22. 10:26

1. socket : 소켓을 생성

#include <sys/socket.h>

int socket(int domain, int type, int protocol);


반환 값 :

정상(fd >0), 실패(-1)

ERR_NO 

  EAFNOSUPPORT : Address Family를 지원하지 않음.

  EMFILE : 프로세스에서 더 이상 fd 생성 불가

  ENFILE : 시스템에서 더 이상 fd 생성 불가

매개변수 :

domain : Address Family ( AF_INET, AF_INET6 ...)

type : SOCK_STREAM(TCP), SOCK_DGRAM(UDP)

protocol : IPPROTO_TCP, IPPROTO_UDP


2. bind : 소켓을 주소에 묶는다.


#include <sys/socket.h>

int bind(int socket, const struct sockaddr *address, socklen_t address_len);


반환 

정상(0), 실패(-1)

ERR_NO

  EADDRINUSE : 지정한 주소가 사용 중

  EADDRNOTAVAIL : 이 시스템에서 사용할 수 없는 주소

  EBADF : socket 매개변수가 잘못된 fd

  EINVAL : socket은 이미 다른 주소로 bind되었다, 소켓 종료, 

                새로운 주소로 bind를 지원하지 않음.

매개변수

socket : socket file descriptor( socket()로 생성된)

address : 주소

address_len : address의 크기


3. 주소 구조체.


struct sockaddr {
    u_short sa_family;
    char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

struct in_addr {
    __u32   s_addr;
};



 sockaddr

sockaddr_in 

  u_short safamily

  short sin_family 

  char sa_data[14]

  u_short sin_port 

  struct in_addr sin_addr

  char sin_zero[8]


sockaddr은 주소 체계의 인터페이스와 같은 역할을 한다고 함.

우리가 사용하는 주소체계인 sockddr_in의 경우 sin_zero[8]이라는 패딩을 시키는 장면을 볼 수 있다.

in_addr의 경우는 32비트 데이터 형이다.


ex)


sockaddr_in addr;
addr.sin_family = PF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(1234);

bind(..., (struct sockaddr *)&addr, sizeof(addr));



4. listen 함수 : 네트워크 시스템의 들어오는 연결 요청을 임시로 저장하는 큐(accept 전까지)


#include <sys/socket.h>

int listen(int socket, int backlog);


반환 

성공(0), 실패(-1)

ERR_NO

  EBADF : socket 변수가 잘못된 디스크립터

  EDESTADDRREQ : bind가 되지 않았음.

  EINVAL : socket이 이미 연결됨.

매개변수

socket : listen을 할 소켓

backlog : Q의 크기


5. accept 함수 : 큐에 있는 연결 요청을 수락하여 처리한다.


#include <sys/socket.h>

int accept(int socket, struct sockaddr *restrict address, socklen_t *restrict address_len);


반환

성공(fd >= 0) 실패(-1)

ERR_NO

  EAGAIN or EWOULDBLOCK : O_NONBLOCK옵션이 소켓 fd에 대해 설정되어 있으면, 

                                            현재 수락할 연결 요청이 없음.

  EBADF : socket이 잘못된 fd임.

  ECONNABORTED : 연결이 취소됨.

  EOPNOTSUPP : socket fd가 연결 수락을 지원하지 않음.


매개변수

socket : accept할 소켓 fd

address : 연결 성공이되면 상대방의 주소를 담아옴.

address_len : address의 크기를 담아옴.


6. connect 함수


#include <sys/socket.h>

int connect(int socket, const struct sockaddr *address, socklen_t address_len);


반환

성공(0), 실패(-1)

ERR_NO

  EALREADY : 연결 요청이 이미 소켓에서 수행 중이다.

  EBADF : socket 잘못된 fd

  ECONNREFUSED : 타겟이 연결을 대기하지 않거나 연결을 거절하였다.

  EISCONN : 지정한 소켓이 연결 모드에 있고 이미 연결 되었다.


매개변수

socket : 접속에 사용할 socket fd

address : 접속할 서버의 address

address_len : address의 크기


7. IP주소 관련.


#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);
char *inet_ntoa(const struct in_addr in);

unsigned long htonl (unsigned long hostlong);
unsigned short htons (unsigned short hostshort);
unsigned long ntohl (unsigned long netlong);
unsigned short ntohs (unsigned short netshort);


inet_addr : "127.0.0.1" ->32비트 정수형으로 변환

inet_ntoa : 32비트 정수형을 dotted decimal("127.0.0.1") 형태로 

htonl : Host(littel endian) TO Network(big endian)  Long

htons : Host(littel endian) TO Network(big endian)  Short

ntohl : Network TO Host Long

ntohs : Network TO Host Short

[출처] Socket 함수 정리|작성자 현님처럼

'Network > Network' 카테고리의 다른 글

IP주소, 서브넷마스크, 네트워크주소, 그리고 브로드캐스트주소  (1) 2011.12.26
소켓 옵션  (0) 2011.12.26
block & non-block  (0) 2011.12.22
socket select/poll  (0) 2011.12.22
IP Subnet  (0) 2011.12.02
:

block & non-block

Network/Network 2011. 12. 22. 10:22
blocking 모드 
  • 어떤 시스템 콜을 호출하였을 때 네트워크 시스템이 동작을 완료할 때까지 그 시스템 콜에서 프로세스가 멈춤
  • 소켓 생성시 디폴트 blocking 모드
  • listen(),connect(), accept(), recv(), send(), read(), write(), recvfrom(), sendto(), close()
  • block 될 수 있는 소켓 시스템 콜
  • I/O시 처리가 될 때까지 기다려야 함. 비 동기적인 작업 수행 불가능
  • 일 대 일 통신을 하거나 프로그램이 한가지 작업만 하면 되는 경우는 blocking 모드로 프로그램을 작성할 수 가능


Non-blocking 모드

  • 소켓 관련 시스템 콜에 대하여 네트워크 시스템이 즉시 처리할 수 없는 경우라도 시스템 콜이 바로 리턴되어 응용 프로그램이 block되지 않게 하는 소켓 모드
  • 통신 상대가 여럿이거나 여러 가지 작업을 병행하려면 nonblocking 또는 비동기 모드를 사용하여야 한다.
  • non-blocking 모드를 사용하는 경우에는 일반적으로 어떤 시스템 콜이 성공적으로 실행될 때까지 계속 루프를 돌면서 확인하는 방법(폴링)을 사용한다. 

'Network > Network' 카테고리의 다른 글

소켓 옵션  (0) 2011.12.26
Socket 함수 정리  (0) 2011.12.22
socket select/poll  (0) 2011.12.22
IP Subnet  (0) 2011.12.02
멀티캐스트 원리  (0) 2011.12.02
:

socket select/poll

Network/Network 2011. 12. 22. 10:11

4.2.2 select/poll 의 이용

select/poll 은 입출력 다중화를 위한 목적으로 주로 사용된다. 그러나 이들 함수의 경우 스스로가 Time out 을 결정하기 위한 방법을 제공함으로 비록 입출력다중화의 목적이 아닌 단순한 Time out 결정을 위해서도 유용하게 사용할수 있다.

#include <unistd.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <sys/socket.h> 
#include <sys/stat.h> 
#include <arpa/inet.h> 
#include <stdio.h> 
#include <string.h> 
#include <sys/time.h> 
#include <sys/types.h> 
 
int main(int argc, char **argv) 
{ 
    int server_sockfd, client_sockfd; 
    int client_len, n; 
    int state; 
    char buf[80]; 
    struct sockaddr_in clientaddr, serveraddr; 
 
    // select time out 설저을 위한 timeval 구조체     
    struct timeval tv; 
    fd_set readfds; 
 
    client_len = sizeof(clientaddr); 
    if ((server_sockfd = socket (AF_INET, SOCK_STREAM, 0)) < 0) 
    { 
        perror("socket error : "); 
        exit(0); 
    } 
    bzero(&serveraddr, sizeof(serveraddr)); 
    serveraddr.sin_family = AF_INET; 
    serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); 
    serveraddr.sin_port = htons(atoi(argv[1])); 
 
    bind (server_sockfd, (struct sockaddr *)&serveraddr, sizeof(serveraddr)); 
    listen(server_sockfd, 5); 
 
    while(1) 
    { 
        memset(buf, 0x00, 80); 
        client_sockfd = accept(server_sockfd, (struct sockaddr *)&clientaddr, 
                            &client_len); 
        // client_sockfd 의 입력검사를 위해서  
        // fd_set 에 등록한다.  
        FD_ZERO(&readfds); 
        FD_SET(client_sockfd, &readfds); 
        // 약 5초간 기다린다.  
        tv.tv_sec = 5; 
        tv.tv_usec = 10; 
 
        // 입력이 있는지 기다린다.  
        state = select(client_sockfd+1, &readfds, 
                        (fd_set *)0, (fd_set *)0, &tv); 
        switch(state) 
        { 
            case -1: 
                perror("select error :"); 
                exit(0); 
            // 만약 5초안에 아무런 입력이 없었다면  
            // Time out 발생상황이다.  
            case 0: 
                printf("Time out error\n"); 
                break; 
            // 5초안에 입력이 들어왔을경우 처리한다.  
            default: 
                if ((n = read(client_sockfd, buf, 80)) <= 0) 
                { 
                    perror("read error : "); 
                    usleep(10); 
                    break; 
                } 
                if (write(client_sockfd, buf, 80) <=0) 
                { 
                    perror("write error : "); 
                    break; 
                } 
                break; 
        } 
        close(client_sockfd); 
    } 
} 
 

여기에서는 select 만을 예로 들었는데 poll 로도 비슷하게 구현 가능하다. select 를 이용할경우 alarm() 에 비해서 신뢰성있게 서버를 구성하는게 가능하다. 그러나 입출력다중화 + time out 검사용으로 사용하기에는 적당하지 가 않다. 위에서의 경우에는 단지 하나의 연결에 대해서만 time out 을 검사했는데, 만약 여러개의 연결을 받아들여서 입출력 다중화를 할경우 select 는 모든 입력에 대한 time out 만을 검사함으로, 각각의 개별적인 입력에 대해서는 time out 결과를 알수 없기 때문이다.

4.3 연결 소켓 Time out 처리

클라이언트에서 서버로 연결 할 때의 Time out 처리에 대해서 알아보자. select함수만을 이용해서 처리할 수는 없다.connect 함수에서 봉쇄되기 때문이다. 결국 소켓을 비 봉쇄로 만든다음 select함수로 기다려야 한다.

다음과 같은 방식으로 connect 타임아웃을 구현할 것이다. fcntl(2) 함수를 이용해서 듣기소켓을 비 봉쇄 소켓으로 만든다.이제 connect함수를 호출하면 바로 리턴될 것이다. select(2)를 이용해서 timeout을 체크하도록 한다. timeout 체크가 끝난 뒤에는 소켓을 원래의 blocking 상태로 되돌린다.

#include <sys/stat.h>  
#include <arpa/inet.h>  
#include <stdio.h>  
#include <string.h>  
#include <unistd.h>  
#include <fcntl.h>  
#include <errno.h>  
  
int ConnectWait(int sockfd, struct sockaddr *saddr, int addrsize, int sec)  
{  
    int newSockStat;  
    int orgSockStat;  
    int res, n;  
    fd_set  rset, wset;  
    struct timeval tval;  
  
    int error = 0;  
    int esize;  
  
    if ( (newSockStat = fcntl(sockfd, F_GETFL, NULL)) < 0 )   
    {  
        perror("F_GETFL error");  
        return -1;  
    }  
  
    orgSockStat = newSockStat;  
    newSockStat |= O_NONBLOCK;  
  
    // Non blocking 상태로 만든다.   
    if(fcntl(sockfd, F_SETFL, newSockStat) < 0)  
    {  
        perror("F_SETLF error");  
        return -1;  
    }  
  
    // 연결을 기다린다.  
    // Non blocking 상태이므로 바로 리턴한다.  
    if((res = connect(sockfd, saddr, addrsize)) < 0)  
    {  
        if (errno != EINPROGRESS)  
            return -1;  
    }  
  
    printf("RES : %d\n", res);  
    // 즉시 연결이 성공했을 경우 소켓을 원래 상태로 되돌리고 리턴한다.   
    if (res == 0)  
    {  
        printf("Connect Success\n");  
        fcntl(sockfd, F_SETFL, orgSockStat);  
        return 1;  
    }  
  
    FD_ZERO(&rset);  
    FD_SET(sockfd, &rset);  
    wset = rset;  
  
    tval.tv_sec        = sec;      
    tval.tv_usec    = 0;  
  
    if ( (n = select(sockfd+1, &rset, &wset, NULL, NULL)) == 0)  
    {  
        // timeout  
        errno = ETIMEDOUT;      
        return -1;  
    }  
  
    // 읽거나 쓴 데이터가 있는지 검사한다.   
    if (FD_ISSET(sockfd, &rset) || FD_ISSET(sockfd, &wset) )  
    {  
        printf("Read data\n");  
        esize = sizeof(int);  
        if ((n = getsockopt(sockfd, SOL_SOCKET, SO_ERROR, &error, (socklen_t *)&esize)) < 0)  
            return -1;  
    }  
    else  
    {  
        perror("Socket Not Set");  
        return -1;  
    }  
  
  
    fcntl(sockfd, F_SETFL, orgSockStat);  
    if(error)  
    {  
        errno = error;  
        perror("Socket");  
        return -1;  
    }  
  
    return 1;  
}  
  
int main(int argc, char **argv)  
{  
    struct sockaddr_in serveraddr;  
    int sockfd;  
    int len;  
  
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )  
    {  
        perror("error");  
        return 1;  
    }  
    serveraddr.sin_family = AF_INET;  
    serveraddr.sin_family = AF_INET;  
    serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");  
    serveraddr.sin_port = htons(atoi(argv[1]));  
  
    len = sizeof(serveraddr);  
  
    if (ConnectWait(sockfd, (struct sockaddr *)&serveraddr, len, 5) < 0)  
    {  
        perror("error");  
    }  
    else  
    {  
        printf("Connect Success\n");  
    }  
    while(1)  
    {  
        sleep(1);  
    }  
    close(sockfd);  
}  
 

'Network > Network' 카테고리의 다른 글

Socket 함수 정리  (0) 2011.12.22
block & non-block  (0) 2011.12.22
IP Subnet  (0) 2011.12.02
멀티캐스트 원리  (0) 2011.12.02
gethostbyname() 도메인 이름으로 hostent 정보를 구함  (0) 2011.12.01
:

IP Subnet

Network/Network 2011. 12. 2. 17:39

1절. IP 번호

sub-networking 을 이해하려면 우선 IP 번호가 어떻게 만들어지고 관리되어지는지 알고 있어야 한다. 이러한 IP 번호에 대해서는TCP/IP 개요(2) 에서 간단하게 알아본적이 있는데 이번장에서는 IP 번호에 대해 좀더 자세한 내용을 알아보도록 할것이다.

이 문서는 IPv4 를 기준으로 설명할것이다.


1.1절. IP 번호는 호스트에 부여되는게 아닌 Interfaces 에 부여되는 것이다.

간혹 혼동할수도 있는데 있는데 IP 번호는 hosts 에 부여되는 것이 아닌, Interfaces(랜카드 혹은 이더넷 카드로 불리워지는)에 부여 되는 것이다. 모든 랜카드는 랜카드 고유의 번호(Ethernet Address) 를 가지고 있으며, 이 이더넷 번호에 IP 번호를 매핑시키는 방식으로 각각의 이더넷에 IP 번호를 부여하게 된다.

이렇게 호스트 기반이 아닌 Interfaces 기반으로 IP 가 부여됨으로, 우리는 하나의 호스트라 할지라고 Interfaces 의 수만충분하다면 여러개의 IP를 가질수 있도록 할수있다 - 물론 하나의 Interfaces 에 여러개의 IP 번호를 부여해줄수도 있겠지만, 이는 일반적인 방법이라고는 할수 없다 -.

보통 우리가 사용하는 호스트(PC)의 경우는 단지 하나의 인터페이스 만으로도 네트웍과 연결해서 대부분의 작업을 하는데 무리가 없겠지만, 라우터 같은경우에는 인접하고 있는 많은 라우터들중 원하는 라우터와 선별적으로 통신을 해야 함으로 당연히 여러개의 인터페이스를 가져야만하고, 각각의 인터페이스에 하나의 IP를 할당해서 사용하게 될것이다.

+------------+ 
| ROUTER  A  | 
|            | 
|     eth0<--|---------------> ROUTER B
|     eth1<--|---------------> ROUTER C
|     eth2<--|---------------> ROUTER D
+------------+

			


1.2절. 점박이 4형제 표기법

아직까지 가장널리 사용되고 있는 IPv4 버젼의 경우 IP 어드레스를 위해서 32bit 주소체계를 나누며, 이것을 다시 8bit 씩 4개 자리로 나누어서 관리한다. 그리고 각각의 자리는 "."을 이용해서 구분한다. 그래서 192.168.182.145 와 같이 표시한다. 그러므로 이론상 0.0.0.0 에서부터 255.255.255.255 까지의 주소할당이 가능할것이다. 대략적으로 계산을 해보면 4294967296 개 만큼의 인터페이스에 IP 주소를 할당해 줄수 있다.

언뜻 생각하기에 40억이란 숫자는 터무니 없이 큰숫자로 보일수도 있으며, 이정도의 숫자라면 모든 PC의 Interface 에 IP 번호를 할당하는데, 문제가 없을 것으로 생각될수도 있지만, 안타깝게도 벌써 부터 인터페이스에 부여할 IP 번호 부족사태가 벌어지고 있다. 이유는 단지 PC 만이 인터넷에 연결되는게 아니기 때문이다. 조만간 냉장고, 세탁기, PDA, 공장자동화기기, 장난감 등 OS를 가질수 있는 모든 소형기기에까지 분명히 인터넷에 연결될것이기 때문이다.

어쨋든간에 우리는 IP 번호를 이용해서 각 인터페이스를 인터넷에서 유일한 것으로 만들어줄수 있다(사실 IP번호가 부족하고 그나마 각나라에 균등하게 분배된것이 아님으로 IP 번호 부족해결을 위한 다른 방법들 - 사설망 구성과 같은 - 을 사용 하지만 이 문제는 논외로 하겠다).

또한 IP 번호는 관리상의 이유로 클래스(Class)로 나누어서 관리되어지고 있다. 다음장에서 이 클래스에 대해서 알아보도록 하겠다.


1.3절. Class

IP 는 크게 3개의 클래스로 나뉜다.

Class 로 IP를 다시 나누는 이유는 몇번말했듯이 관리상의 목적이 가장크다고 할수 있다. 보통의 국가에서도 중앙정부에서 모든 행정을 관리하게 되면 너무 크고 복잡해짐으로 이걸 여러개의 부서로 나누고 다시 부서는 여러개의 과로 나누어서 관리하는데, 마찬가지로 IP 어드래스 역시 하나의 대규모의 IP 어드레스를 가지고 관리하는것보다는 여러개의 적은 개수의 대규모/중간규모의 네트워크로 나누어서 관리하는게 훨씬 편하기 때문이다.

이렇게 해서 IP 어드레스는 A, B, C 클래스로 나누어서 관리하게 된다. 나누는 방법은 간단하다. 위에서 IP 어드래스는 8bit 씩 4개의 영역으로 나뉘어서 계산한다고 했었는데, 이 영역은 다시 네트웍영역과 호스트 영역으로 나뉜다. 네트웍영역은 Internic 등의 기관에서 할당해준 고정된 IP 영역이며, 호스트 영역은 자신이 관리 가능한 IP 영역이 된다. 또한 최상위(네트웍영역)의 3bit 를 이용해서 클래스를 구분한다. 즉 1번째 bit 가 0이라면 A 클래스 2번째 bit 가 0 이라면 B 클래스 3번째 비트가 0 이라면 C 클래스 이런식으로 나누는 것이다.

 01234567012345670123456701234567

     +- NET 영역    +- HOST 영역
     |              |
 |======|-----------------------|
 +------+-------+-------+-------+
 |0     |       |       |       | A Class
 +------+-------+-------+-------+ 

 |==============|---------------|
 +------+-------+-------+-------+
 |10    |       |       |       | B Class
 +------+-------+-------+-------+ 

 |======================|-------| 
 +------+-------+-------+-------+
 |110   |       |       |       | C Class
 +------+-------+-------+-------+ 
			
위의 그림을 가지고 계산 하면 각각의 클래스가 관리할수 있는 IP 영역이 대강 계산이 될것이다. A 클래스에 포함된 IP 를 할당받았다면 나머지 24bit 가 호스트영역이 되고 호스트영역은 자신이 관리 가능한 IP 라고 했음으로 결국 2^24 개 만큼의 IP 를 관리할수 있게 된다.

먼저 A 클래스를 보면 최상위 1개 비트가 이미 예약이 되어 있음으로 실제 IP를 만드는데에는 7개 비트를 사용가능할것이다. 고로 2^7 하면 128 이된다. 그러므로 관리 가능한 IP 범위는 0 - 127 이 될것이다. 그러나 0은 사용할수가 없으며 마찬가지로 127 은 루프백 어드레스로 사용하기 위해서 예약되어 있음으로 사용할수 없다. 그러므로 A 클래스의 IP 영역은 1 - 126 이 될것이다. 또한 A 클래스에 포함된 각각의 IP의 경우 관리할수 있는 호스트의 범위는 2^24 이 될것이다. 이것의 크기는 약 17000000 정도의 상당히 큰크기이므로, 국가등에 부여한다.

B 클래스를 보면 최상위 2개 비트가 예약되어 있음으로 관리 가능한 아이피 범위는 2^6(64) 가 될것이다. 그러므로 A 클래스가 사용하고 있는 1 - 126 이후로 사용이 가능함으로 128 에서 부터 191(128 + 64) 이 될것이다. (흠... 외 128+64 는 192 인데 191 이 되었는지는 설명할 필요가 없겠죠?) 그리고 관리 가능한 호스트는 2^16 개가 될것이다. 지역정부 혹은 꽤 큰규모의 대학교등에 할당해준다.

나머지 192 - 254 까지는 C 클래스가 되며 관리가능한 아이피의 범위는 2^8 개가 될것이다.

표 1. 클래스의 IP 할당범위

네트웍 클래스 관리영역 관리 IP 갯수
A 1-126 2^32
B 128-191 2^16
C 192-254 2^8



1.4절. 예약된 IP

우리는 보통 여러가지 이유로 사설망등을 구성한다. 이러한 사설망에 포함된 컴퓨터들역시 IP 를 가지고 있어야만 서로 통신이 가능할것이다. 이론적으로 봤을때는 사설망에 포함된 컴퓨터들이라면 어차피 내부에서만 서로를 구분해줄수 있으면 됨으로 어떠한 아이피라도 사용이 가능할것이다.

그러나 이렇게 되면 외부 Internet 에 연결된 컴퓨터들과의 IP 가 서로 겹치는 문제가 발생할것이다. 이러한 문제는 발생하면 안될것이다. 이러한 문제를 해결하기 위해서 각 클래스 별로 사설망을 위한 IP 를 별도로 준비해두고 있다. 이들 주소는 오직 사설망구성을 위해서만 사용할수 있으며, Internet 에 연결된 컴퓨터(인터페이스)는 이들 IP 주소 영역내에 있는 IP 번호는 가질수가 없다.

표 2. 사설망용으로 예약된 IP

IP 클래스 예약된 주소
A 10.0.0.0
B 172.16.0.0
C 192.168.0.0


2절. Subnet

서브넷이 사전적 의미는 특정 지역에서 관리되는 IP 영역을 몇개의 영역으로 나누어서 관리하는걸 말한다.

2.1절. 왜 subnetwork 를 하는가?

우리는 이미 앞장에서 IP 영역자체를 관리하기 위한 클래스에 대해서 알아보았다. 그런데 왜 다시 여기에 subnetwork 를 제공하게 되는걸까.

이러한 경우를 한번 생각해 보도록 하자. C 클래스 IP영역을 할당받아서 사용하고 있는데, 이중 하나의 호스트가 지나치게 많은 트래픽을 차지해서 다른 같은 영역의 호스트까지 이에 대한 영향을 심각하게 받을 것이다. 이러한 사이트를 관리하는건 상당히 고달플 것이다. 이럴경우 동일한 C클래스에 있는 호스트들이라 할지라도 관리상의 목적으로 서로 나누어서 관리하게 되면 (트래픽을 유발하는것과 그렇지 않은것을 나누는 식으로) 훨씬 관리가 편할것이다. 어쨋든 커다란 하나의 호스트영역을 관리하는 것 보다는 목적에 따라서 나누어서 관리하는게 여러모로 편할것이다.

이밖에도 몇가지 아래와 같은 이유들 때문에 호스트영역을 몇개의 영역으로 나누는 subnetworking 을 한다.

  • LAN 으로 구성할때 때때로 호스트들이 꽤 넓은 범위에 흩어져 있을수 있다. 그런데 이때 LAN으로 확장할수 있는 길이에는 한계가 있음으로 지역별로 네트웍을 다르게 구성해야 한다. 이럴때 subnetworking 으로 가까운 지역의 호스트끼러 서로 묶어서 관리할수 있다.

    이러한 구성은 ISP 업체에서는 각각의 호스트가 지역적으로 넓게 퍼져 있을수 있음으로 매우 일반적으로 사용한다.

  • 네트웍 트래픽이 너무 높아서 통신속도의 저하를 가져올때, 여러개의 서브네트웍으로 분리함으로써 통신속도를 높일수 있다.

  • 보안이 필요한 호스트와 그렇지 않은 호스트 그룹으로 나누고자 할때, 예를 들어 인터넷 서비스를 해야하는 호스트들은 외부로 노출되어도 되지만 R&D 같은경우에는 중요한 기술적인 내용들을 보호해야함으로 별도로 관리되어야 할것이다.


2.2절. subnetwork 구성하기

다음과 같은 경우를 가정해 보자

       210.211.231.001        .002        .003   
            +--------+  +--------+  +--------+
            | Host 1 |  | Host 2 |  | Host 3 |   Internet Service 
            +--------+  +--------+  +--------+
           -----------------------------------
                    |
                    |
                +--------+
 Internet ----->| Router |  210.211.231.000 
                +--------+
                    | 
                    |
           -----------------------------------
            +--------+  +--------+  +--------+
            | Host 1 |  | Host 2 |  | Host 3 |   R&D 
            +--------+  +--------+  +--------+
       210.211.231.129        .130        .131

			
위의 IP 번호를 보면 위의 구성도는 C 클래스에 기초하고 있음을 알수 있다. Router 은 인터넷으로 연결되어 있으며 모든 패킷을 받아들인다. 라우터는 3개의 인터페이스를 가지고 있다. 하나는 Internet 에 연결된것이며, 나머지 2개는 자신이 관리하는 subnet 로 연결된 인터페이스이다. 위의 그림을 보면 하나의 C 클래스 어드레스를 2개로 분리한걸 볼수있다. 이유는 Internet Service 를 위한 호스트들과 R&D 를 위한 호스트를 서로 분리시키기 위해서이다. 이들이 하나의 네트웍상에 존재한다면, 보안문제, 트래픽문제등이 생길수 있을것이기 때문이다.

그런데 궁금한게 있다. Router 는 그렇다면 어떻게 목적지 IP 를 검사하여서 이걸 원하는 인터페이스로 보낼수 있을까 ? 답은 네트마스트(net mask) 와 서브넷마스트(subnet mask)에 있다.


2.3절. net mask 와 submnet mask

net mask 는 인터넷 상에서 서브넷이 필요로 하지 않는 경우 사용되는 마스크로 어떤 비트들이 NET 영역이며, 어떤 부분이 HOST 영역인지를 계산(해석)하기 위해서 사용된다. 그러므로 각각의 클래스에 대한 넷마스크는 다음과 같이 정의될것이다.

표 3. Net Mask

클래스 넷마스트 비트
A 255.0.0.0 11111111.00000000.00000000.00000000
B 255.255.0.0 11111111.11111111.00000000.00000000
C 255.255.255.0 11111111.11111111.11111111.00000000
서브넷 마스크는 단지 위의 넷 마스크에서 8bit 더 확장한경우로써, 어떠한 서브넷으로 전달되어야하는지를 해석하기 위한 목적으로 사용된다. 예를들어 B 클래스 IP에 대한 서브넷 마스크는 (11111111.11111111.11111111.00000000) 이 될것이다. 서브넷 마스크는 가장마지막의 8bit 의 비트들을 조작함으로써 만들어주게 된다.

위에서 발했듯이 서브넷의 구성은 서브넷마스크의 비트를 어떻게 조작해주느냐로 결정할수 있다. 즉 11111111.11111111.11111111.10000000(255.255.128) 로 서브넷 마스크 비트를 확장시켰다면 2^1(2) 개의 서브네트웍을 구성할수 있을것이다.

예를 들어서 C 클래스 영역을 가지며 Network address가 203.211.5.0 일때 subnetmask 를 255.255.255.128 로 했다면, 각각 사용가능한 host address 의 범위가 203.211.5.1 ~ 203.211.5.128, 203.211.5.129 ~ 203.211.5.254 인 2개의 서브네트웍을 구성할수 있을것이다.

2 개의 서브네트웍으로 구성되었다고 가정을 할때 이것을 라우팅하기 위해서 라우팅 테이블은 대충 다음과 같이 구성되어야 할것이다.

203.211.5.1/127     255.255.255.0          eth0 
203.211.5.128/254   255.255.255.128        eth1 
			
정말로 IP 가 자기가 가야할 서브넷을 향해서 올바로 해석되는지 알아보도록 하겠다. 만약 203.211.5.121 이 도착했다면 이것은 다음과 같이 계산 될것이다.
11001011.11010011.00000101.01111001   IP (203.211.5.121) 
11111111.11111111.11111111.00000000   subnet mask 255.255.255.254
-----------------------------------------------------------------
11001011.11010011.00000101.01111001
			
만약 203.211.5.138 이라면
11001011.11010011.00000101.10001010   IP (203.211.5.138) 
11111111.11111111.11111111.10000000   subnet mask 255.255.255.254
-----------------------------------------------------------------
11001011.11010011.00000101.10001010
			
제대로 해석되고 있는것을 볼수 있을것이다.

4개의 서브네트웍으로 구성하고 싶다면 11111111.11111111.11111111.11000000 으로 해주면 될것이다. 4개의 서브네트웍으로 구성하기로 했다면 범위는 다음과 같을것이다.

203.211.5.1/63      255.255.255.0          eth0 
203.211.5.64/127    255.255.255.64         eth1
203.211.5.128/191   255.255.255.128        eth2
203.211.5.192/254   255.255.255.192        eth3
			
다음은 203.211.5.121 이 어떻게 계산될수 있는지를 보여준다.
11001011.11010011.00000101.01111001   IP (203.211.5.121) 
11111111.11111111.11111111.01000000   subnet mask 255.255.255.64
-----------------------------------------------------------------
11001011.11010011.00000101.01111001
			
다음은 203.211.5.145 가 계산되는 방법을 보여준다.
11001011.11010011.00000101.10010001   IP (203.211.5.145) 
11111111.11111111.11111111.10000000   subnet mask 255.255.255.128
-----------------------------------------------------------------
11001011.11010011.00000101.10010001
			
모든 경우에 대해서 제대로 계산되고 있음을 알수 있다.

보통 서브넷을 나눌때는 4의 배수로 가지고 가는게 일반적이다. 아무래도 계산하기가 좀더 수월하기 때문이다. 보면 알겟지만 서브넷계산하는게 꽤 혼동스럽기 때문이다. (컴퓨터입장에서 봤을때는 별 문제가 없겠지만)

'Network > Network' 카테고리의 다른 글

block & non-block  (0) 2011.12.22
socket select/poll  (0) 2011.12.22
멀티캐스트 원리  (0) 2011.12.02
gethostbyname() 도메인 이름으로 hostent 정보를 구함  (0) 2011.12.01
inet_addr, inet_aton  (1) 2011.12.01
:

멀티캐스트 원리

Network/Network 2011. 12. 2. 17:28

ontents

1 교정과정
2 소개
3 캐스팅 개론
3.1 유니 캐스팅
3.2 브로드 캐스팅
3.3 멀티 캐스팅
4 멀티캐스팅 자세히
4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅
4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신
5 인터넷(IP)환경에서의 멀티 캐스팅
5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움
5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?
5.2.1 MBone망
6 멀티캐스트 소켓 프로그래밍
6.1 멀티캐스트 그룹 가입
7 IPv6와 멀티 캐스팅
7.1 IPv6 멀티 캐스트 주소 영역
8 정리
9 관련 자료들
9.1 데이터 링크
9.2 참고 문서자료

1 교정과정

  1. 2003/12/10 : multicast 주소영역 관련 내용 추가 - yundream 
  2. 2010/7/13 : 내용 좀 수정

2 소개

인터네트 환경이 눈부시게 발전했지만 인터네트를 가로지르는 데이터양은 이에 초과해서 늘어나고 있다. 요즘 대두되고 있는 원격 회상 회의, 원격 교육, 인터넷 대화형 TV등의 서비스는 엄청난 양의 데이터 교환이 필요하며, 인터네트 망의 한계 때문에 특별한 경우를 제외하고 원할한 서비스가 사실상 불가능하다. 혹은 서비스질이 크게 떨어지거나 상당한 비용을 지불해야 한다. 


단순하게 생각하면 돈을 투자해서 네트워크 망 환경을 크게 개선시키면 되긴 하겠지만 엄청난 비용과 시간이 필요한 작업이다. 그렇다면 이러한 망 환경의 개선과 더불어 소프트웨어적인 다른 방법을 동원해서 문제를 해결하는게 더 좋은 방법일 것이다. 이번에는 소프트웨어적인 문제 해결방법중 하나인 멀티캐스팅에 대해서 알아보도록 하겠다. 

3 캐스팅 개론

캐스팅은 "던진다"라는 뜻을 가진다. 여기에서는 정보를 전달하는 행위를 의미한다. 이 캐스팅에는 다양한 방식이 존재한다. TV나 라디오와 같이 모든 임의의 대상에 정보를 전달하는 방식이 있는가 하면, 전화와 같이 특정 상대와 1:1로 정보를 주고 받는 방식이 있다. 또한 두개 방식을 함께 사용하는 정보 전달 방식도 있다. 지휘소로 부터 1:1로 명령을 받은 다음 하위 부대에 방송하는 방식도 있다.


네트워크도 데이터를 전송하는 세가지 캐스팅 기법이 있다. 이 캐스팅 기법은 위에서 설명한 방식과 거의 동일하다. 아래 컴퓨터 네트워크에서 사용하는 캐스트의 종류를 보여주고 있다.
 

3.1 유니 캐스팅

WAN과 LAN상에서 이루어지는 가장 일반적인 방식으로 서버와 클라이언트가 1대 1로 연결되고 데이터를 주고 받는다. 만약 하나의 서버에 100개의 클라이언트가 연결한다면 100개의 연결이 만들어 지고 서버는 동일한 데이터를 100개 복사해서 각각의 클라이언트에게 전송하게 될 것이다. 이 방식은 구현이 간단하고 웹과 같이 각 클라이언트로 다른 데이터를 보내야 하는 분야에서는 쓸만하지만 동일한 데이터를 다수의 유저에게 전달시켜야 하는 실시간 멀티미디어 서비스에는 그리 적합하지 않다. 대량의 동일한 데이터가 유저 수만큼 복사되기 때문이다.

소켓을 통한 일반적은 네트워크 프로그램은 유니캐스트 방식으로 작동한다.

3.2 브로드 캐스팅

브로드캐스팅(boradcasting)는 보내고자 하는 정보를 모든 수신자에게 보내는 방식으로, 서브네트워크에서 하나의 호스트가 데이터를 보내면 서브네트워크의 모든 호스트로 데이터가 전송된다. 데이터를 받을지 아니면 무시할지는 순전히 받는 측에서 결정하게 된다.

브로드 캐스팅은 주로 서브 네트워크 환경에서 주변의 호스트 정보를 알아오기 위한 데이터 교환용으로 널리 사용된다. 가장 대표적인 브로드 캐스팅 데이터는 arp데이터가 될것이다. 스위칭 라우터를 예로 들어서 생각해보도록 하자. 스위칭 라우터는 외부에서 들어온 데이터를 서브네트워크의 적당한 호스트로 보내야 할것이다. 이러한 작업을 위해서 보통 IP를 사용하는데, IP는 논리적인 값으로써 변경될 수 있는 값이므로 IP만 가지고 원하는 호스트와 통신하는건 적절하지 못하다. 이러한 문제를 해결하기 위해서 이더넷카드의 물리적인 번호와 IP번호를 맵핑시키는 방법을 사용하게 된다. 

이더넷카드는 전 세계에서 유일한 48bit의 고유번호를 가지고 있으며 이 정보와 IP주소를 맵핑 시킴으로써 주변의 호스트 정보를 알 수 있게 된다. 라우터는 처음 부팅시 주변 호스트의 물리적 주소와 IP주소를 알아내야 하는데 이때 사용되는 프로토콜이 arp이며, 모든 주변 호스트에 대한 정보를 알아야 되므로 arp 요청을 브로드 캐스팅 하게 된다. 

이는 라우터에만 적용되는게 아닌 서브네트워크의 단일 호스트에도 적용된다. 호스트가 새로 부팅 되었을 경우 이 호스트는 주변 호스트에 대한 아무런 정보도 가지고 있지 않는다. 이 호스트의 주소가 192.168.0.25인데, 192.168.0.26로 데이터를 전송할 일이 생겼다고 가정해 보자. 이 호스트는 192.168.0.26호스트가 어디에 있는지 알지 못한다. 이를 위해서 arp 패킷을 브로드 캐스팅 형식으로 서브네트워크에 있는 모든 호스트에게 보내게 된다. 패킷의 내용은 이를 테면 "192.168.0.26 주소를 가지는 호스트는 MAC주소와 함께 응답을 달라"이다. 일치하는 주소의 호스트는 MAC 정보를 채워 넣어서 192.168.0.25로 패킷을 보내게 된다. 

이 처럼 브로드 캐스팅이 유용하게 사용되는 영역도 있긴 하지만 동일한 데이터가 모든 서브 네트워크로 전송된다는 특징 때문에 네트워크에 과도한 부하를 주는 경우가 발생하기도 한다. 때문에 대부분의 라우터들은 브로드캐스팅을 허용하지 않는다. 서브네트워크에서 제한된 용도로만 사용할 수 있다. 

3.3 멀티 캐스팅

유니캐스트방식은 사용하기 쉽지만 동일한 데이터를 연결갯수 만큼 서버에서 복사해야 한다는 단점이 있다. 100k로 압축된 영상 데이터를 전송한다고 가정해보자. 1000명의 유저가 들을 경우 무려 100M의 데이터를 서버에서 복사해야 한다. 멀티캐스트 방식의 경우에는 데이터 복사가 서버가 아닌 라우터에서 발생하므로 서버의 부하는 없을 것이다. 그러나 데이터를 모든 컴퓨터로 방송하므로 데이터 낭비가 생긴다. 200개의 컴퓨터로 이루어진 서브네트워크가 있다고 가정해 보자. 이중 IPTV방송을 시청하고픈 컴퓨터는 단지 10대이다. 브로드캐스팅을 하게 되면, 200개의 컴퓨터 모두에 데이터가 전달된다. 

유니캐스팅과 멀티캐스팅의 차이 
멀티캐스트 데이터는 라우터와 라우터 사이에는 유니캐스트 방식으로 데이터가 전달되며, 서브 네트워크에서는 멀티캐스트 채널에 참여한 컴퓨터에만 데이터가 전달된다. 200대의 컴퓨터로 이루어진 서브네트워크에서 10대의 컴퓨터가 멀니태스트 채널에 가입해 있다면, 해당 컴퓨터로만 데이터가 복사되어서 전달이 된다. 효율적으로 네트워크 자원을 사용함을 알 수 있다. 

 
멀티캐스트은 일반적으로 UDP를 사용한다. 정해진 채널에 데이터를 일괄적으로 전송하는 것이기 때문에, TCP의 특성이 데이터 재 전송등의 기능이 필요없다. TCP를 사용한다면, 채널에 전송한 데이터의 흐름을 관리해야 할 건데, 이렇게 되면 데이터 전송이 지나치게 복잡해질 것이기 때문이다. UDP만을 사용할 수 있다는 것은 아니다. TCP도 사용할 수 있기는 하다. 하지만 멀티캐스트로 전송되는 데이터의 특성을 감안할 때, 굳이 TCP를 사용해야 할 경우는 그다지 많지 않을 것 같다. 

다음은 지금 까지 다루었던 3가지의 캐스팅 방법을 비교한 그림이다. 

캐스팅의 종류와 차이점

 

4 멀티캐스팅 자세히

그럼 멀티캐스팅에 대해서 좀더 자세히 알아보도록 하겠다. 

4.1 인터넷(IP) 프로토콜차원에서 본 멀티 캐스팅

인터넷 프로토콜(IP)상에서 어떻게 멀티 캐스팅이 이루어질 수 있는가 ? 

우리는 IP프로토콜이 관리등의 이유로 여러개의 클래스(class)로 나뉘어서 관리되고 있다는 것을 알고 있다. [http]subnetworking을 참고하하라. 참고기사를 보면 단지 A, B, C 3개의 클래스만을 생각하고 있으나 이 외에도 D클래스가 사용되고 있다. 위 문서에서는 주제를 설명하는데 있어서 D클래스가 필요 없기 때문에 제외한 것 뿐이다. 

D클래스는 224.0.0.1 에서 239.255.255.254의 범위를 가지며, 멀티캐스팅을 위해서는 이들 주소범위에 있는 주소가 할당되어 있어야 한다. 네트워크 호스트 그룹에 데이터를 전송한다는 멀티캐스팅의 특징으로 보통 라우터에 멀티캐스팅 주소가 할당이 된다.

이렇게 해서 라우터까지 데이터가 도달했다면 라우터는 자신이 관리하는 여러 호스트중 데이터 수신을 원하는 호스트에만 데이터를 전송해야 할 것이다. 어떤 방식으로 원하는 호스트에게만 찝어서 데이터를 보낼 수 있는지 알아 보도록 하자. 

4.2 IGMP 프로토콜을 이용한 멀티캐스팅 데이터 수신

이러한 멀티캐스팅 데이터의 수신을 위해서 IGMP프로토콜을 사용한다. IGMP는 Internet Control Message Protocol의 줄임말로 인터네트 그룹 관리 규약이라고 불리운다. IGMP패킷은 다음과 같은 형식으로 전달된다.

IGMP 패킷구조

 
IGMP 헤더의 구조

 
요청 타입 설명 
Type 설명
1 Create Group Request
2 Create Group Reply
3 Join Group Request
4 Join Group Reply
5 Leave Group Request
6 Leave Group Reply
7 Confirm Group Request
8 Confirm Group Reply

Create Group Request를 이용하면 멀티캐스팅 그룹생성을 요청할수 있는데, 그룹을 생성시킬 때 Code값을 명시함으로써 Public 혹은 Private로 그룹의 성격을 결정할 수 있다.

Cope 설명
Code 설명
0 Public
1 Private

호스트가 Create Group Request를 이용해서 그룹의 생성을 요청하면 요청을 받은 호스트나 라우터는 다음과 같은 응답을 보내게 된다. 

응답의 종류
Code 설명
0 Request Granted
1 Request denied, no resources
2 Request denied, invalid code
3 Request denied, invalid group address
4 Request denied, invalid access key
5 - 255 Request pending

IGMP checksum은 IGMP헤더에 포함된 메시지를 체크하기 위해서 사용되는 값이다. IGMP메시지를 받은 측에서는 checksum값과 IGMP헤더의 메시지와 비교하는 방식으로 잡음등으로 인한 패킷손실이 있었는지를 검사하게 된다. 

Identifier은 현재 사용되어지지 않고 있으며, 0으로 채워져 있다. 

Group Address는 IGMP헤더의 실질적인 핵심으로 라우터와 호스트들은 이 그룹주소에 자신이 받기를 원하는 멀티캐스팅데이터의 주소를 명시해서 라우터에게 전송함으로써 라우터에게 "나는 이 멀티캐스팅 그룹에 join되어 있음"을 알려주게 된다. 예를 들어 225.100.1.5에서 멀티캐스팅 데이터가 225.100.1.6으로 전송된다고 가정해 보자. 225.100.1.6에 있는 호스트들이 이 데이터를 라우터로 부터 받기 위해서는 IGMP패킷에 그룹주소를 225.100.1.5를 명시해서 라우터에 보내면 된다. 그러면 라우터는 멀티캐스팅 라우팅 테이블을 검사해서 어느 호스트로 데이터를 보내야 하는지 알 수 있게 된다. 

참고로 IGMP는 ICMP와 같은 레벨의 프로토콜(인터넷 프로토콜)로 IP+IGMP의 형태로 교환된다. 그러므로 라우터는 들어온 멀티캐스팅 데이터를 어느 호스트 IP로 보내야 할지를 결정할 수 있게 된다. 멀티캐스팅 라우터 테이블은 대충 아래와 같은 정보를 가지고 있다.
192.168.1.50      225.100.1.5 
192.168.1.51      225.100.1.5 
192.168.1.52      225.100.1.5 
192.168.1.85      225.100.2.5 
멀티캐스팅 라우터 테이블이 위와 같다고 할때 225.100.1.5에서의 멀티캐스팅 데이터는 50, 51, 52로 전송되고 225.100.2.5에서의 멀티캐스팅 데이터는 85로 전송될 것이다. 

그룹으로의 멀티캐스팅

 

5 인터넷(IP)환경에서의 멀티 캐스팅

이상으로 멀티 캐스팅에 대한 개략적인 내용들에 대해서 알아보았다. 그렇다면 실제 인터넷 환경에서 멀티캐스팅이 효과적으로 이루어질 수 있는지 만약 그렇지 못하다면 다른 대안들이 있는지에 대해서 알아보도록 하자. 

5.1 인터넷에서의 멀티 캐스팅기술 적용의 어려움

안타깝게도 인터넷상에서 멀티캐스팅 서비스를 하는건 그리 쉬운문제가 아니다. 이 문제에 관해서 irc의 joinc채널에서 minzkn님과 산하님과의 토론이 있었다. 

토론의 결과 인터넷(WAN)환경에서의 멀티캐스팅의 전격적인 적용은 (아직 까지는)사실상 어렵다는 결론에 도달했다. 이유는 경로배정을 위한 라우터의 경우 멀티캐스트 IP를 라우팅 할 수 있어야 하는데, 현재 인터넷 상에는 멀티캐스팅 기능을 가지지 않은 장비가 상당히 존재하기 때문이며, 이 장비들을 모두 교체한다는 것이 사실상 불가능 하기 때문이다. 

또하나 그게 가능한 환경이라고 할 지라도..안되는(어려운) 이유는 멀티캐스팅이 가져올 수 있는 불확실한 네트웍부하때문이다. 멀티캐스팅 IP를 가진 많은 인터넷 방송데이터들이 엄청나게 ISP의 라우터와 스위치로유입될것은 물론이거니와... 자칫 잘못하면.. 갈곳없는 데이터들이 스위치나 네트웍속을 떠돌아다닐 가능성이 존재한다. 결론은 멀티캐스팅은 공중파수준의 인터넷방송을 가능하게 할 수 있는 꿈의 기술인것은 사실이나 이것이 현실화되기위해선 전 라우터의 멀티캐스팅지원과 보다 더 우수하고 내부 대역폭이 더 큰 기가빗스위치들이 갖춰줘야 하며 ISP간의 연동망 및 백본망, 가정의 인터넷대역폭 등이 충분히 갖춰져야 하며-가정의 대역폭은 충분하다고 볼수 있겠군요- 멀티캐스팅 프로그램들이 어떤 문제를 야기시키지 않도록 잘 만들어져야만 한다는것이다-혹은 그런것을 처리해낼수 있는 라우터 내지는 스위치들이 갖춰진다면... 분명코 언젠가는 그런 환경이 될것이다... 대략 한 5년...정도 ? 

사실, 월드컵 경기전에 국내의 유수 ISP 들이 모여 많은 회의를 하였었다. 월드컵 전 경기를 인터넷으로 멀티캐스팅 방송을 할것인가? 말것이가? 과연, 상업적 수익모델이 있나없나..결론은, 엄청난 돈을 들여서 국내의 모든 라우터를 멀티캐스팅이 가능한것으로-두루넷은 제가 알기로 원래부터 모든 라우터가 멀티캐스팅 가능했던걸로...- 교체한다 해봤자 그만한 수익도 없을것 같고 월드컵 이후에 그 장비들을 활용한 계속적인 컨텐츠가 없다란 결론에 도달하고 결국 포기했다. 아무리 꿈의 서비스라 할지라도 기업입장에서는 이윤을 창출 시켜야 하는데 아직은 시기상조 였던 것이다. 

5.2 그럼 멀티캐스팅은 적어도 당분간 쓸모 없는 기술인가 ?

그렇지는 않다. 일단 무선환경에서의 경우 멀티 캐스팅은 필수고(무선의 특성상 원래 멀티캐스팅이 가능한 브로드캐스팅이므로), 특정한 환경(학교/연구소/회사)등에서의 화상회의와 같은 경우에 유용하게 쓰일 수 있을 것이기 때문이다. 

멀티캐스팅이 관심의 대상이 되는 주된이유는,, 인터넷의 수익모델중 가장 크게 기대되는것이 바로 멀티미디어이기때문이다.. 현재 가장 비싼 광고료가 책정되는곳이 어디인가. 바로 TV이다..그만큼 동영상매체가 주는 파급효과는 큰것이다. 인터넷광고는 노출빈도수대 호감도가 반비례한다는 연구결과도 있을정도로 관심잇는 분야가 아니면 전혀 관심을 끌지 못하는것이 현재의 배너광고이다. 때문에, 이메일광고 휴대폰광고, 팝업창, 초기화면 등 여러가지 수익모델을 창출해내기 위한 인터넷기업들의 노력이 거세지고 있는 판국이다... 이러한 시점에서 공중파같은 고해상도에 버퍼링없는 인터넷방송이 가능하다면, 그것은 제 2의 TV시대가 열리는것이라고 볼 수 있겠다..

그리고 인터넷 멀티 캐스팅을 현재 인터넷 전체에 전격적으로 적용할 수 없지만 회사, 연구소, 학교등과 같은 영역에서는 충분히 멀티 캐스팅을 응용할 수 있다. 또한 다음장에 소개할 MBone와 같은 프로젝트를 이용하는등 기존에 구축되어 있는 인터넷 망을 활용하는 방법들도 존재한다. 

5.2.1 MBone망
멀티캐스팅 기술이 매우 훌륭한 기술이긴 하지만 현재 인터네트 환경에 적용하기에는 무리가 따른다. 그래서 생각한 것이 멀티캐스팅 전용망인 MBone망의 구축이다. 

MBone(IP Multicast Backbone on ther Internet)은 Multicast Backbone의 줄임말로 IP 멀티캐스트가 가능한 네트워크들을 상호연결한 광역 네트워크 망이다. 위에서 설명했다시피 인터넷의 모든 백본 라우터들이 IP 멀티캐스트를 지원하는게 아니므로 전체 네트워크 상에서 멀티캐스트를 지원하는건 당분간 힘든일다.

MBone은 멀티캐스팅 기능을 지원하는 백본 라우터들만을 연결해서 광역 네트워크를 가로지르는 네트워크 터널을 만드는 프로젝트이다. 아래 그림은 MBone를 통해서 만들어지는 네트워크 터널에 대한 구조를 나타내고 있다. MBone은 인터넷을 가로지리는 가상 네트워크 계층(layer)이라고 볼수 있다. 네트워크 망에 대한 별도의 확장작업 없이 이미 존재하는 망을 활용할 수 있다는 점에서 (시간적으로나 비용적으로)매력적인 프로젝트이다. 

MBONE

 
위 그림처럼 MBone은 다른 인터넷망과는 분리된 별도의 터널을 가지게 되므로 멀티캐스트에 최적화된 패킷의 구성이 가능하다. 이들 멀티캐스트 IP패킷은 IP해더와는 다른 헤더를 가진다. 즉 출발지 목적지정보에 개별 호스트의 IP가 명시되는게 아니고 각 터널의 종점 IP주소가 명시된다. 이때 사용되는 라우팅 프로토콜로는 DVMRP와 MOSPF(Multicast Open Shortest Path First), PIM(Protocol Independent Multicast)등이 사용되고 있다. 현재는 MOSIPF와 PIM이 널리 사용되고 있다. 

종점라우터에 도착된 데이터는 라우터가 관리하는 호스트중 데이터 요청을 원하는 호스트로 전송된다. 이때 IGMP가 핵심적인 프로토콜로 사용된다.

6 멀티캐스트 소켓 프로그래밍

소켓은 멀티캐스트를 지원한다. 멀티캐스트 데이터는 라우터에서 처리하는 것이기 때문에, 소켓 프로그램 입장에서는 크게 유니캐스트 방식과 크게 다른 점이 없다. 일반 A,B,C 클래스 주소 대신에 
  1. 멀티캐스트 주소를 이용해서 채널에 가입하고
  2. 채널에 가입하고 탈퇴하기 위한 채널 제어 
를 위한 두 가지 사항만 염두에 두고 프로그램을 개발하면 된다.

6.1 멀티캐스트 그룹 가입

소켓은 socket 함수로 만든다. 만든 소켓은 setsockopt함수를 이용해서 멀티캐스트 그룹에 가입하면 된다. 

소켓 옵션 레벨은 IPPROTO_IP이고, 아래의 오션 이름의 값으로 제어할 수 있다.
  • IP_MULTICAST_LOOP : 데이터를 호스트로 루프백 시킬 것인지를 결정한다. 예를들어 멀티캐스트 채널로 자신이 전송한 메시지를 보고 싶다면 활성화 시켜야 한다. 
  • IP_MULTICAST_TTL : 멀티캐스트 데이터를 서브네트워크에서만 확인할 거라면, TTL을 1로 해서 외부로 나가지 않도록 한다. 
  • IP_MULTICAST_IF : 
  • IP_ADD_MEMBERSHIP : 어떤 멀티캐스트 그룹에 참가할지를 알려주기 위해서 사용한다. 멀티캐스트 그룹에 참가한 프로세스로 메시지가 전달된다.
  • IP_DROP_MEMBERSHIP : 어떤 멀티캐스트 그룹에서 탈퇴하기를 위해서 사용한다. 

IP_ADD_MEMBERSHIP를 이용해서 멀티캐스트 그룹에 참가시킬려면 ip_mreq 구조체에, 멀티캐스트 그룹관련 정보를 채워서 setsockopt의 옵션값으로 넘겨야 한다.
struct ip_mreq 
{ 
    struct in_addr imr_multiaddr; 
    struct in_addr imr_interface; 
} 
 
  • imr_multiaddr : 참가할 그룹의 멀티캐스트 주소. 
  • imr_interface : 통신에 참가할 인터페이스 주소. 일반적으로 모든 인터페이스 주소에 대해서 참가하므로 INADDR_ANY를 사용하면 된다. 

예를들어서 멀티캐스트 채널 "239.1.1.1"에 참가하고 싶다면, 다음과 같이 setsockopt를 사용하면 된다.
#!plan
struct ip_mreq mreq;

mreq.imr_multiaddr = inet_addr("239.1.1.1"); 

setsockopt(sock_fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq))

7 IPv6와 멀티 캐스팅


연구에 참고할 문서
[http]INTERNET PROTOCOL VERSION 6 MULTICAST ADDRESS

7.1 IPv6 멀티 캐스트 주소 영역

IPv6 멀티캐스팅 주소는 RFC2373(IP Version 6 Addressing Architecture)에 정의되어 있다. 여기에는 멀티캐스트 주소를 위해서 고정영역(fixed scope)과 변경가능영역(variable)을 정의하고 있다.

IPv6 멀티캐스트 주소는 주소영역의 상위 한바이트(octet)의 값을 이용해서 구분한다. 만약 상위 한바이트의 주소의 값을 0xFF(11111111)로 설정하는 걸로 멀티캐스트 주소임을 명시한다. 이외의 다른 값들은 유니캐스트 주소들을 위한 용도로 사용된다. 

IPv6의 경우 IPv6보다 할당된 주소영역이 매우 크므로 비교적 여유있게 자원을 사용할수 있고, 실제로 다양한 네트워크 환경의 지원이 가능하도록 주소영역들이 정의되어 있다. 다음은 현재 IPv6에서 지원되는 멀티캐스트 주소영역의 목록이다. 

Node-Local Scope
   FF01:0:0:0:0:0:0:1     All Nodes Address                  [RFC2373] 
   FF01:0:0:0:0:0:0:2     All Routers Address                [RFC2373] 
 

Link-Local Scope
   FF02:0:0:0:0:0:0:1     All Nodes Address                  [RFC2373] 
   FF02:0:0:0:0:0:0:2     All Routers Address                [RFC2373] 
   FF02:0:0:0:0:0:0:3     Unassigned                             [JBP] 
   FF02:0:0:0:0:0:0:4     DVMRP Routers                  [RFC1075,JBP] 
   FF02:0:0:0:0:0:0:5     OSPFIGP                        [RFC2328,Moy] 
   FF02:0:0:0:0:0:0:6     OSPFIGP Designated Routers     [RFC2328,Moy] 
   FF02:0:0:0:0:0:0:7     ST Routers                    [RFC1190,KS14] 
   FF02:0:0:0:0:0:0:8     ST Hosts                      [RFC1190,KS14] 
   FF02:0:0:0:0:0:0:9     RIP Routers                        [RFC2080] 
   FF02:0:0:0:0:0:0:A     EIGRP Routers                    [Farinacci] 
   FF02:0:0:0:0:0:0:B     Mobile-Agents                 [Bill Simpson] 
   FF02:0:0:0:0:0:0:C     SSDP                                [Kostic] 
   FF02:0:0:0:0:0:0:D     All PIM Routers                  [Farinacci] 
   FF02:0:0:0:0:0:0:E     RSVP-ENCAPSULATION                  [Braden] 
 
   FF02:0:0:0:0:0:1:1     Link Name                       [Harrington] 
   FF02:0:0:0:0:0:1:2     All-dhcp-agents                    [RFC3315] 
 
   FF02:0:0:0:0:1:FFXX:XXXX     Solicited-Node Address       [RFC2373] 
 

site-Local Scope
   FF05:0:0:0:0:0:0:2       All Routers Address              [RFC2373] 
 
   FF05:0:0:0:0:0:1:3       All-dhcp-servers                 [RFC3315] 
   FF05:0:0:0:0:0:1:4       Deprecated (2003-03-12)     
   FF0X:0:0:0:0:0:1:1000    Service Location, Version 2      [RFC3111] 
    -FF0X:0:0:0:0:0:1:13FF   
 

또한 네트워크 환경 뿐만 아니라 서비스의 종류에 따라서 다양한 주소영역이 준비되어 있다. 이렇게 서비스종류에 따라서 주소영역이 세분화 되어 있으므로, 응용 애플리케이션의 개발이 쉬워지고 Qos보다 현실적으로 적용가능해 질 것이다. 

Variable Scope Multicast Address
   FF0X:0:0:0:0:0:0:0     Reserved Multicast Address         [RFC2373] 
   FF0X:0:0:0:0:0:0:C     SSDP                                [Kostic] 
 
   FF0X:0:0:0:0:0:0:100   VMTP Managers Group           [RFC1045,DRC3] 
   FF0X:0:0:0:0:0:0:101   Network Time Protocol (NTP)   [RFC1119,DLM1] 
   FF0X:0:0:0:0:0:0:102   SGI-Dogfight                           [AXC] 
   FF0X:0:0:0:0:0:0:103   Rwhod                                  [SXD] 
   FF0X:0:0:0:0:0:0:104   VNP                                   [DRC3] 
   FF0X:0:0:0:0:0:0:105   Artificial Horizons - Aviator          [BXF] 
   FF0X:0:0:0:0:0:0:106   NSS - Name Service Server             [BXS2] 
   FF0X:0:0:0:0:0:0:107   AUDIONEWS - Audio News Multicast      [MXF2] 
   FF0X:0:0:0:0:0:0:108   SUN NIS+ Information Service          [CXM3] 
   FF0X:0:0:0:0:0:0:109   MTP Multicast Transport Protocol       [SXA] 
   FF0X:0:0:0:0:0:0:10A   IETF-1-LOW-AUDIO                       [SC3] 
   FF0X:0:0:0:0:0:0:10B   IETF-1-AUDIO                           [SC3] 
   FF0X:0:0:0:0:0:0:10C   IETF-1-VIDEO                           [SC3] 
   FF0X:0:0:0:0:0:0:10D   IETF-2-LOW-AUDIO                       [SC3] 
   FF0X:0:0:0:0:0:0:10E   IETF-2-AUDIO                           [SC3] 
   FF0X:0:0:0:0:0:0:10F   IETF-2-VIDEO                           [SC3] 
 
   FF0X:0:0:0:0:0:0:110   MUSIC-SERVICE             [Guido van Rossum] 
   FF0X:0:0:0:0:0:0:111   SEANET-TELEMETRY             [Andrew Maffei] 
   FF0X:0:0:0:0:0:0:112   SEANET-IMAGE                 [Andrew Maffei] 
   FF0X:0:0:0:0:0:0:113   MLOADD                              [Braden] 
   FF0X:0:0:0:0:0:0:114   any private experiment                 [JBP] 
   FF0X:0:0:0:0:0:0:115   DVMRP on MOSPF                         [Moy] 
   FF0X:0:0:0:0:0:0:116   SVRLOC                             [Guttman] 
   FF0X:0:0:0:0:0:0:117   XINGTV                      <hgxing@aol.com> 
   FF0X:0:0:0:0:0:0:118   microsoft-ds         <arnoldm@microsoft.com> 
   FF0X:0:0:0:0:0:0:119   nbc-pro           <bloomer@birch.crd.ge.com> 
   FF0X:0:0:0:0:0:0:11A   nbc-pfn           <bloomer@birch.crd.ge.com> 
   FF0X:0:0:0:0:0:0:11B   lmsc-calren-1                         [Uang] 
   FF0X:0:0:0:0:0:0:11C   lmsc-calren-2                         [Uang] 
   FF0X:0:0:0:0:0:0:11D   lmsc-calren-3                         [Uang] 
   FF0X:0:0:0:0:0:0:11E   lmsc-calren-4                         [Uang] 
   FF0X:0:0:0:0:0:0:11F   ampr-info                          [Janssen] 
 
   FF0X:0:0:0:0:0:0:120   mtrace                              [Casner] 
   FF0X:0:0:0:0:0:0:121   RSVP-encap-1                        [Braden] 
   FF0X:0:0:0:0:0:0:122   RSVP-encap-2                        [Braden] 
   FF0X:0:0:0:0:0:0:123   SVRLOC-DA                          [Guttman] 
   FF0X:0:0:0:0:0:0:124   rln-server                            [Kean] 
   FF0X:0:0:0:0:0:0:125   proshare-mc                          [Lewis] 
   FF0X:0:0:0:0:0:0:126   dantz                               [Yackle] 
   FF0X:0:0:0:0:0:0:127   cisco-rp-announce                [Farinacci] 
   FF0X:0:0:0:0:0:0:128   cisco-rp-discovery               [Farinacci] 
   FF0X:0:0:0:0:0:0:129   gatekeeper                            [Toga] 
   FF0X:0:0:0:0:0:0:12A   iberiagames                        [Marocho] 
   FF0X:0:0:0:0:0:0:12B   X Display                         [McKernan] 
 
   FF0X:0:0:0:0:0:0:201  "rwho" Group (BSD) (unofficial)         [JBP] 
   FF0X:0:0:0:0:0:0:202   SUN RPC PMAPPROC_CALLIT               [BXE1] 
 
   FF0X:0:0:0:0:0:0:300   Mbus/Ipv6                          [RFC3259] 
 
   FF0X:0:0:0:0:0:2:0000 
    -FF0X:0:0:0:0:0:2:7FFD  Multimedia Conference Calls          [SC3] 
   FF0X:0:0:0:0:0:2:7FFE    SAPv1 Announcements                  [SC3] 
   FF0X:0:0:0:0:0:2:7FFF    SAPv0 Announcements (deprecated)     [SC3] 
   FF0X:0:0:0:0:0:2:8000 
    -FF0X:0:0:0:0:0:2:FFFF  SAP Dynamic Assignments              [SC3] 
 
멀티캐스팅의 특성에 맞게 멀티미디어와 관려된 많은 서비스들이 존재하고 있음을 알 수 있다. 멀티미디어 서비스 외에도 NIS, NTP, NSS와 같이 동일한 정보를 여러개의 서버로 배포하는 인터넷 서비스를 위한 주소영역도 예약되어 있음을 확인할 수 있다. X Display를 위한 서비스가 있는게 개인적으로 유독 눈에 띈다.

8 정리

'Network > Network' 카테고리의 다른 글

socket select/poll  (0) 2011.12.22
IP Subnet  (0) 2011.12.02
gethostbyname() 도메인 이름으로 hostent 정보를 구함  (0) 2011.12.01
inet_addr, inet_aton  (1) 2011.12.01
언제 shutdown()를 써야 하는가?  (0) 2011.11.23
: