SlideShare una empresa de Scribd logo
1 de 63
Descargar para leer sin conexión
IPv6 이롞과 소켓 프로그래밍



    마이에트 엔터테읶먼트 건즈팀
        서버 프로그래머
             최흥배
      MS Visual C++ MVP
      Twitter : @jacking75
목차
• IPv6 이롞 정리

• IPv6 소켓 프로그래밍
IPv6 이롞 정리
IPv6 이란?

 IPv6 이란 ‘Internet Protocol Version 6’의 줄임 말.

 현재 사용하고 있는 것은 IPv4 이다.

 이미 맋은 통싞 관련 제품들은 IPv6 지웎을 하고 있음.

 일본의 경우는 일반 유저를 대상으로 IPv6 서비스(유료)를 제공하고 있음.
OSI 7 Layer과 TCP/IP에서의 IPv6의 위치




          출처: http://isecure-public.blogspot.com/2009/07/osi-7-layer-tcpip-suite.html
왜 IPv6을 사용해야 하나?

 부족
 - IPv4로 할당할 수 있는 IP가 부족함.
  - IPv4로는 42억 개의 IP를 사용할 수 있음
  - 부족을 해결하기 위해 NAT를 이용하기도 함
 - 2011년 2웏3일로 남은 것이 모두 고갈.
왜 IPv6을 사용해야 하나?

 풍족
 - 지구상의 모듞 모래까지도 IP를 부여할 수 있음
 - 128bit 주소 지정
 - 340282366920938463463374607431768211456개
 맊큼 사용할 수 있음
왜 IPv6을 사용해야 하나?

 보안
    IPv4는 보안을 싞경 쓰지 않고 맊들어서 쉽게 패킷을 캡쳐 하여 붂석할
    수 있음.

   성능
    - IPv6의 헤더 크기는 40byte로 IPv4의 두 배의 크기지맊 단순해져서 처
    리가 빨라짐

 IP 주소 자동 설정. DHCP 불필요

 프로토콜 차웎에서 QoS 지웎
IPv4과 IPv6의 헤더 포맷




    출처 : Joinc http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Intro
IPv6을 사용하기 위해 필요한 것


 OS
 - Windows XP, Windows Server 2003 이후 가능
   - 완젂한 대응은 Windows Vista, Windows Server 2008 이후

 - Mac OS는 10.2(Jaguar)부터 대응

 - Linux나 FreeBSD는 USAGI나 THAI 프로젝트에서 IPv6 대응 프로토콜 스택
 을 개발하였으므로 이것을 사용하면 된다.
IPv6을 사용하기 위해 필요한 것

 하드웨어
 - 스위치 허브와 같은 레이어2에서 사용하는 기기는 IPv6과 상관 없음.
 - 라우터, 레이어 3 스위치는 네트워크 계층이므로 IPv6을 지웎해야 한다.




   I-O Data WN-GDN/RS Wi-Fi g/n Router   Cisco Catalyst 3750-E Series Switch
IPv6을 사용하기 위해 필요한 것

 기졲 시스템과 호환
 - 앞으로 당붂갂 IPv4와 같이 사용해야 하므로 IPv4와 IPv6 둘 다 사용할 수
 있는 Dual Stack으로 구성해야 한다.
 - Windows Vista에서는 IPv6 통신을 먼저 시도하고 실패하면 IPv4를 사용한
 다.




   출처 : http://www.dbguide.net/knowledge.db?cmd=view&boardUid=126274&boardConfigUid=19&boardStep=0
Dual Stack이란?

 IPv4와 IPv6 양쪽 모두를 지웎하는 것을 말한다.
  - 현재와 같이 IPv4에서 IPv6 이행기에 꼭 필요
  - 대부붂의 OS에서 지웎하고 있음
출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6은 이미 사용 중

 IPv6 관련 기술을 개발하기 위해 실험적인 목적으로 1996년에 실험 네트워
  크 6Bone 싞설.

 1998년 10웏에는 6REN(IPv6 Research and Education Networks Initiative)
  발족.

 미굮(美軍)에서는 GIG(Global Information Grid)라고 하는 세계 규모의 정보
  통싞망을 구축 운용하고 있는데 2003년 6웏에 IPv6으로 이행을 발표. 2008
  년에는 젂면적으로 IPv6 베이스로 이행.

 2003년 이후 미굮이 조달하는 네트워크 기기는 모두 IPv6 대응이 필수이다.

 일본의 경우 이미 일반 유저들을 대상으로 IPv6 서비스를 제공하고 있음.
IPv6 Address(주소)

 IPv4의 주소 길이는 32비트, IPv6의 주소 길이는 128비트


 IPv4의 주소는 10진수로 0~255 사이의 숫자를 사용
  IPv6의 주소는 16진수를 사용하고 블록 수는 8개.
  블록 구붂은 ‘:’ 사용
  fe80:1234:5678:9abc:def0:1234
  하나의 블록에서 표현할 수 있는 수의 범위는 0000~ffff
IPv6 주소 단축 표기 법 – 방법 1

- 0 생략
- 블록의 첫 숫자가 0 으로 시작하는 경우맊 생략할 수 있다.




      f0f0:0100:0020:0003:1000:0100:0020:0003



            f0f0:100:20:3:1000:100:20:3
IPv6 주소 단축 표기 법 – 방법 2

- 0 압축. 모두 0으로 되는 블록은 생략한다.

           1234:5678:0000:9abc:def0:1234:5678:9abc

              1234:5678::9abc:def0:1234:5678:9abc

- 생략되는 부붂에 대해서는 :을 연속으로 붙임 ::

           1234:0000:0000:0000:5678:9abc:def0:1234

                     1234::5678:9abc:def0:1234

- 생략은 하나의 주소에서 한번맊 가능
 1234:0000:0000:5678:9abc:0000:0000:def0 -> 1234::5678:9abc::def0
                                         -> 1234::5678:9abc:0:0:def0
IPv6 주소 단축 표기 법 – 방법 2

 ‘0’ 압축 복웎
  - 단순히 ‘::’ 부붂을 ‘0000’으로 하는 것으로는 웎래 주소로 복웎할 수 없다.

 - 공식
   - (8 - 압축 후의 IPv6 주소 블록 수)×16
   - ‘ff02::2’ -> (8-2)×16 = 96. (16X6=96)이므로 6 블록의 ‘0000’이 필요


                            ff02::2


         ff02:0000:0000:0000:0000:0000:0000:0002
출처 : http://blog.daum.net/ipv6/30
LINKLOCAL 주소

 IPv4에서는 APIPA의 사양으로 DHCP 서버에서 IP 주소를 받을 수 없을 때 대
  용으로 LINKLOCAL 주소를 이용한다.
  - 169.254.*.*/16 범위에서 IP 주소를 자동으로 할당 받음

 IPV6에서도 같은 사양으로 지웎하고 있다.
  - fe80::/64 범위를 사용한다.
익명(혹은 임시) 주소

 LINKLOCAL 주소 방식에는 개인 보안에 문제가 있음
  MAC 주소는 LAN 어댑터를 바꾸지 않는 한 바뀌지 않으므로 IPv6 주소의 인
  터페이스 ID를 개인정보와 연결 지을 수 있으므로 개인 추적을 할 수도 있다




           출처: http://journal.mycom.co.jp/photo/series/ipv6/006/images/001l.jpg
IPv6의 특별한 주소

 0:0:0:0:0:0:0:0
  - 미 지정 주소. 줄여서 ‘0::0’이나 ‘::’로도 표기
  - 노드에 주소가 할당되어 있지 않고, 할당 할 수도 없음을 나타냄

 0:0:0:0:0:0:0:1
  - 루프백 주소. IPv4의 127.0.0.1에 해당
  - IPv4에서는 12.0.0.0/8 범위의 주소를 사용할 수 있지맊 IPv6에서는 이
  주소맊 사용할 수 있다
  - 줄여서 ‘0::1’ 또는 ‘::1’

 2001:db8::/32
  - 문서 작성용 주소 공갂

 2001: 로 시작하는 것(sTLA 주소)
  - 상용 서비스에 할당되고 있는 주소

 2002:: 로 시작하는 것(6to4 주소)
  - IPv6 over IPv4 터널링의 6to4에서 사용하는 주소. 2002: 에 연속해서
  32비트 부붂에 IPv4 글로벌 주소를 넣는다. IPv6을 지웎하지 않는 ISP의
  유저 등에 사용된다
IPv6의 특별한 주소

 3ffe: 로 시작하는 것(pTLA 주소)
  - 비 상용 실험 프로젝트에서 배포 되고 있는 주소

 ff00::/8 시작하는 주소
  - 멀티캐스트

 fe80::/10
  - 로컬 유니캐스트(링크)
  - 단일 링크상에 라우터가 없는 경우에 사용
IPv6과 IPv4 간의 접속(Dual Stack 지웎하지 않는 경우)




        IPv4(서버)                     IPv6(클라이얶트)




        IPv6(서버)                      IPv4(클라이얶트)


IPv4가 Ipv6에 접속할 수 있는 이유는 IPv4는 32비트인데 비해 IPv6은 128비
트로 크rh 16짂수 표기로 16비트 단위로 ‘:’로 나누고 생략할 수도 있다. 그리
고 특별한 표기 방법도 있어서 하위 32비트에 IPv4의 주소를 넣을 수 있다.
이 때문에 IPv4와 호환성이 생겨서 IPv4와도 통싞할 수 있다.
예) ffff::10.1.2.3
IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버




    출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6/IPv4 클라이언트 -> IPv6만 지웎 IPv6 서버




    출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6/IPv4 클라이언트 -> Dual Stack IPv4 서버




     출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6/IPv4 클라이언트 -> Dual Stack IPv6 서버




     출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6/IPv4 클라이언트 -> Separated Stack IPv6-only,
IPv4-only 서버




     출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버




    출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
IPv6과 IPv4 전환 기술

 듀얼 스택
  - 운영체제, 응용 프로그램에서 IPv4와 IPv6을 모두 사용할 수 있게 지웎
  - IPv6 젂환 시 가장 일반적인 방식

 터널링
  - 양 끝단에 단말이 있고 중갂 경로상에 IPv4 망이 있는 경우




 변환
  - IPv6 to IPv4 또는 IPv4 to IPv6으로 패킷을 재조합 하는 방식




                      출처: http://blog.daum.net/ipv6/24
IPv5는 어디에?

 1970년대 말 비디오/오디오 스트리밍 젂송을 위해 Streaming Protocol(ST)

 ST의 IP 패킷의 버젂 번호로 ‘5’를 사용하여 IPv5 라고 부르기도 하였다

 1990년대 초 ST를 개선하여 ST-II를 개발. IPv5의 패킷 구조를 그대로 사용
  IP 주소 부족 문제 해결은 그대로 안고 감

 이후 ST-II 이외에 다양한 비디오/오디오 스트리밍 관련 기술이 개발되면서
  ST-II는 사장. 동시에 IPv5도 사장 됨
IPv6과 Windows OS

 MSR(Microsoft Research)는 1996년부터 2002년까지 IETF의 IPv6 표준화 작업
  에 기여

 MSR은 Windows NT/2000 용으로 1998년에 프로토타입인 MSRIPv6 1.0을 개
  발하여 공개

 2001년 10웏 Windows XP에 IPv6을 기본으로 탑재. 기본적인 것맊 구현

 Windows Server 2003에 상용 수준의 IPv6 스택이 탑재

 Windows Visata에서 IPv4/IPv6이 통합된 짂정한 듀얼스택을 개발하여 탑재.
  드디어 IPv6을 완벽하게 구현

 IE에서는 버젂 4에서 부터 IPv6을 지웎했음
IP 주소 할당 체계


                          ICANN
                       (국제 읶터넷 주소 관리 기구)




대륙 별 주소 관리 기구


  APNIC      ARIN       LACNIC RIPE-NCC AfrNIC
   (아태 지역)   (북미 지역)      (남미 지역)          (유럽 지역)   (아프리카 지역)
2웏3읷 기자 회견에서의 IPv4 주소 고갈의 의미

 ICANN은 2웏 3일 기자 회견을 통해 IPv4 주소가 고갈 되었다고 보도

 이 때의 고갈의 의미는 ICANN에서 각 대륙 별 주소 관리 기구에 주소 할당을
  다했다는 의미로 지금 IPv4 주소가 더 이상 없다는 뜻이 아니다

 ICANN은 대륙 별 주소 관리 기구에 인터넷 주소를 줄 때 큰 하나의 덩어리를
  주는데 이 덩어리의 크기는 약 1700만개 정도의 읶터넷 주소이다.

 2웏3일의 고갈은 마지막 남은 덩어리를 하나씩 각 대륙 별 주소 관리 기구에
  다 주었다는 뜻이다.

 그러나 APNIC의 경우 이번에 받은 덩어리를 약 4~6개웏 사이에 다 소짂고,
  인터넷 인프라가 거의 없는 AfrNIC가 가장 오래 동안 사용할 수 있을 것으로
  예측하고 있다.
IPv6과 NAT

 IPv4에서 주소 부족 문제를 해결하기 위해서 NAT(Network Address
  Translation) 기술을 사용

 NAT은 주소 부족 문제를 해결해 주지맊 P2P 통싞에 문제가 있음

 UPnP나 NAT Traversal 등으로 이 문제를 회피하지맊 완벽하지 않음

 또 관리자 중 NAT을 내부와 외부 네트워크를 붂리하는 보안 기술이라는 생각
  을 가지고 있음

 특히 최근의 CGN, LSN 등의 3중 NAT는 어뷰즈 로깅, 위치 추적, NAT
  Traversal 기능도 못 쓰게 맊듬

 NAT은 웹브라우징 이나 이메일 등의 일반 웹 서비스에는 문제가 없지맊 온라
  인 P2P 게임, 비드오 스트리밍, 웹갬, 터널링, VPn, VoIP에서 품질 저하나 서비
  스가 불가능 하는 경우가 있다

 IPv6이 도입되면서 자연스럽게 NAT에서 IPv6으로 젂환하는 것이 좋음
IPv6과 보안

 IPv4는 연구실에서 사용할 목적으로 맊듞 프로토콜로 설계 시에 보안은 거의
  고려하지 않았음

 IPv6은 처음 설계 시부터 보안을 고려해서 맊듞

 IPv6은 IPv4 보다 보안이 더 뛰어나지맊 아직 보급된 시장이 작아서 IPv4에 비
  해 보안 관련 장비가 부족함

 IPv6 젂환기 동안에는 네트웍 관리자는 IPv4와 IPv6을 같이 관리해야 하므로
  관리 비용이 2배로 늘었다고도 할 수 있음
World IPv6 Day

 2011년 6웏 8일에 Internet Sociey(ISOC) 주최로 ‘World IPv6 Day’ 행사 개최

 이 행사의 목적은 24시갂 동안 IPv6 웹 사이트를 올려서 젂 세계에서 접속이
  가능한지 테스트 및 운영, 또 IPv4 주소가 부족하다는 것을 알리고 IPv6 도입
  을 촉짂 시키기 위해서이다

 구글을 시작으로 야후, 페이스북, Bing 및 미국 최대 케이블 회사인 comcast와
  Time Warner cable나 시스코와 같은 기업들이 참가하기로 함
IPv6 사용 가능 여부 테스트 방법

 http://test-ipv6.com/ 에 접속하면 알 수 있다
Big Game의 IPv6 지웎

 MMORPG인 WOW의 PTR 패치에서 환경 설정에서 IPv6을 지웎(2011.03.17)
  http://www.fix6.net/archives/2011/03/17/latest-world-of-warcraft-ptr-patch-
  brings-ipv6-support/
프로그래밍
API - IPv6 관련 구조체

#include <netinet/in.h>
struct sockaddr_in
{


                                                                                   IPv4
   in_port_t sin_port; // Port 번호 struct
   in_addr sin_addr; // 인터넷 주소 구조체
}

struct in_addr {
   in_addr_t s_addr; // 32bit 크기의 인터넷주소
}




#include <netinet/in.h>
struct sockaddr_in6



                                                                                   IPv6
{
  u_int16m_t sin6_family;    // AF_INET6
  u_int16m_t sin6_port;      // Port 번호
  u_int32m_t sin6_flowinfo; // IPv6 flow information
  struct in6_addr sin6_addr;// IPv6 주소
  u_long sin6_scope_id;     // 읶터페이스 읶덱스 아이디
}


           출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
API - socket



         IPv4                                                                       IPv6
s = socket(PF_INET, SOCK_STREAM, 0);                            s = socket(PF_INET6, SOCK_STREAM, 0);
s = socket(PF_INET, SOCK_DGRAM, 0);                             s = socket(PF_INET6, SOCK_DGRAM, 0);




         출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
API – bind (IPv6)



        struct sockaddr_in6 sin6;
        ....
        sin6.sin6_family = AF_INET6;
        sin6.sin6_flowinfo = 0;
        sin6_sin6_port = htons(23);
        sin6.sin6_addr = in6addr_any;
        sin6.sin6_addr = in6addr_any;
        sin6.sin6_scope_id = if_nametoindex("eth0");
        ....
        if (bind(s, (struct sockaddr *)&sin6, sizeof(sin6)) == -1)
        {
             // 에러처리
        }
        ....



      출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
API – listen, accept (IPv6)



         listen
         변환 없음




         accept
         struct sockaddr_in6 clisin6;
         clisockfd = accept(sockfd, (struct sockaddr *)&clisin6,
                               (socklen_t *)&clilen);




       출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
API – inet_addr, inet_ntoa




       inet_addr                    inet_pton

       inet_ntoa                    inet_ntop

        WSAAddressToString
            inet_addr는 32비트, inet_pton는 128비트
            그러나 C++에서의 최대 정수의 크기는 64비트 !!!

            inet_pton, inet_ntop는 Windows Vista부터 지웎
코드- IPv6 주소 얻기 (Win32 API)
#include ‹winsock2.h›
#include ‹ws2tcpip.h›
#include ‹stdio.h›

int main(int argc, char *argv[])
{
   char *nodename;
   WSADATA wsaData;
   ADDRINFO hints;
   LPADDRINFO ai, ai0;
   int e;

    if (argc != 2) {
       fprintf(stderr, "syntax: getv6addr HOSTNAMEn");
       exit(1);
    }
    nodename = argv[1];

    WSAStartup(MAKEWORD(2, 2), &wsaData);

    /* resolving "www.ipv6style.jp" */
    memset(&hints, 0, sizeof(hints));
    hints.ai_family = AF_INET6;
    if (e = getaddrinfo(nodename, NULL, &hints, &ai0)) {
       fprintf(stderr, "%s: %sn", nodename, gai_strerror(e));
       WSACleanup(); exit(1);
    }

    for (ai = ai0; ai; ai = ai->ai_next) {
       char v6addrstr[NI_MAXHOST];
       getnameinfo(ai->ai_addr, ai->ai_addrlen, v6addrstr, sizeof(v6addrstr), NULL, 0, NI_NUMERICHOST);
       printf("%s IPv6 address: %sn", nodename, v6addrstr);
     }

    freeaddrinfo(ai0);
    WSACleanup();
}                                        출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
코드- IPv6 주소 얻기 (Win32 API)
#include ‹winsock2.h›
#include ‹ws2tcpip.h›
#include ‹stdio.h›

int main(int argc, char *argv[])
{
    PHOSTENT pHostInfo = NULL;
    char szHostName[255] = {0, };
    if (gethostname(szHostName, 255) == 0)
    {
        /// Windows XP1 이상
        DWORD        dwSize;
        LPADDRINFO lpAddrInfo;
        ADDRINFO addrHints;
        ZeroMemory(&addrHints, sizeof(addrinfo));

        if( bUseIPv6Address ) {
                  addrHints.ai_family = AF_INET6;
        } else {
                  addrHints.ai_family = AF_INET;
        }

        if (getaddrinfo(szHostName, NULL, &addrHints, &lpAddrInfo) != 0) {
                 return false;
        }

        dwSize = MAX_IP_STRING_LENGTH;
        if( 0 != WSAAddressToString(lpAddrInfo->ai_addr, (DWORD)lpAddrInfo->ai_addrlen, NULL, szIP, &dwSize) ) {
                  return false;
        }
    }
}




                                        출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
접속할 곳이 IPv6 지웎을 하는지 어떻게 알 수 있을까?

 보통 어느 노드에 접근할 때는 FQDN(Fully Qualified Domain Name.인터
  넷 상에서 단말을 식별하기 위한 이름)을 기초로 하여 DNS 서버에 질문
  한다. 듀얼 스택은 바로 이것을 활용한다.

 IPv4맊 대응하는 경우 보통 IPv4 주소를 기록한 A 레코드맊 DNS 서버에
  등록. 듀얼 스택의 경우 여기에 IPv6 주소를 기록한 AAAA 레코드를 기록.

 IPv4와 IPv6 둘 다 대응하는 프로그램은
  - AAAA 레코드에 등록된 IPv6 주소 접근을 시도
  - AAAA 레코드 접속이 실패하면 A 레코드 주소로 접근

 IPv4, IPv6, 이 후의 프로토콜에 비 의졲적인 네트웍 프로그래밍을 위해서
  는 gethostbyname 대싞 getaddrinfo, getnameinfo를 사용해야 한다.
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
int sock,err;
struct addrinfo hints, *res0, *res;

memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

/* getaddrinfo로 AAAA 및 A 레코드 획득*/
err = getaddrinfo("www.linux-ipv6.org", "http", &hints, &res0);

if (err) {
   fprintf(stderr, "error : %s", gai_strerror(err));
   freeaddrinfo(res0);
   exit(1);
}

/* getaddrinfo의 결과를 이용하여 접속이 성공할 때까지 시도한다 */
for (res = res0; res; res = res->ai_next) {
   sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol);
   if (sock < 0)
      continue;

  if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) {
     close (sock);
     continue;
  }
  break;
}
freeaddrinfo(res0);
・・・
                          출처: http://www.ipv6style.jp/jp/apps/20030617/index.shtml
코드- IPv6 서버 (Win32 API)
#include   ‹winsock2.h›
#include   ‹ws2tcpip.h›
#include   ‹stdio.h›
#include   ‹process.h›

void tcp_echo_io(void *arg);

int main(int argc, char *argv[])
{
   WSADATA wsaData;
   int i;
   char *servname = "echo";
   ADDRINFO hints;
   LPADDRINFO ai, ai0;
   int e;
   SOCKET s[64];
   int nsocks;
   fd_set rfd0;

  if (WSAStartup(MAKEWORD(2, 2), &wsaData)) {
     fprintf(stderr, "can not initilize WinSockn");
     exit(1);
  }

  memset(&hints, 0, sizeof(hints));
  hints.ai_family = AF_UNSPEC;
  hints.ai_socktype = SOCK_STREAM;
  hints.ai_flags = AI_PASSIVE;
  if (e = getaddrinfo(NULL, servname, &hints, &ai0)) {
     fprintf(stderr, "%sn", gai_strerror(e));
     exit(1);
  }
for (nsocks = 0, ai = ai0; ai; ai = ai->ai_next)
{
  s[nsocks] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
  if (s[nsocks] == INVALID_SOCKET)
     continue;

    if (bind(s[nsocks], ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) {
       closesocket(s[nsocks]);
       s[nsocks] = INVALID_SOCKET;
       continue;
    }

    if (listen(s[nsocks], 5) == SOCKET_ERROR) {
       closesocket(s[nsocks]);
       s[nsocks] = INVALID_SOCKET;
       continue;
     }

    nsocks++;

    printf("create %s listen socketn",
           (ai->ai_family == AF_INET) ? "IPv4" :
           (ai->ai_family == AF_INET6) ? "IPv6" : "Unknown");
}


if (nsocks == 0) {
   fprintf(stderr, "can not create listen socket with any protocoln");
   exit(1);
}
FD_ZERO(&rfd0);
for (i = 0; i < nsocks; ++i)
  FD_SET(s[i], &rfd0);

while (1) {
  fd_set rfd;
  SOCKET iosock;
  SOCKADDR_STORAGE ss;
  int sslen;

    rfd = rfd0;
    if (select(FD_SETSIZE, &rfd, NULL, NULL, NULL) == SOCKET_ERROR) {
       fprintf(stderr, "select errorn");
       exit(1);
    }

    for (i = 0; i < nsocks; ++i) {
      if (FD_ISSET(s[i], &rfd)) {
          sslen = sizeof(ss);
          iosock = accept(s[i], (LPSOCKADDR)&ss, &sslen);
          if(iosock == INVALID_SOCKET) {
              fprintf(stderr, "accept errorn");
              exit(1);
          }

            if (_beginthread(tcp_echo_io, 0, &iosock) == -1) {
                fprintf(stderr, "can not create threadn");
                exit(1);
            }
        }
    }
}
void tcp_echo_io(void *arg)
{
  SOCKET s;
  char buf[BUFSIZ];
  int bufsiz;

    printf("start threadn");

    s = *(SOCKET *)arg;

    while ((bufsiz = recv(s, buf, sizeof(buf) - 1, 0)) != 0) {
      if (bufsiz == SOCKET_ERROR )
          break;

        buf[bufsiz] = '0';
        printf("recv string: %sn", buf);

        if (send(s, buf, bufsiz, 0) == SOCKET_ERROR)
            break;

        printf("send string: %sn", buf);
    }

    printf("end threadn");

    closesocket(s);
    _endthread();
}



                                   출처: http://www.ipv6style.jp/jp/apps/20051128/index.shtml
코드- IPv6 클라이언트 (Win32 API)

#include ‹winsock2.h›
#include ‹ws2tcpip.h›
#include ‹stdio.h›

int main(int argc, char *argv[])
{
   WSADATA wsaData;
   char *nodename;
   char *servname = "echo";
   ADDRINFO hints;
   LPADDRINFO ai, ai0;
   int e;
   SOCKET s;
   char linebuf[BUFSIZ];

  if (argc != 2) {
     fprintf(stderr, "syntax: tcp-echo-client servername¥n");
     exit(1);
  }
  nodename = argv[1];


  if (WSAStartup(MAKEWORD(2, 2), &wsaData)) {
     fprintf(stderr, "can not initilize WinSock¥n");
     exit(1);
  }
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;

if (e = getaddrinfo(nodename, servname, &hints, &ai0)) {
   fprintf(stderr, "%s¥n", gai_strerror(e));
   exit(1);
}


for (ai = ai0; ai; ai = ai->ai_next) {
  s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol);
  if (s == INVALID_SOCKET)
      continue;

    if (connect(s, ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) {
       closesocket(s);
       s = INVALID_SOCKET;
       continue;
    }

    printf("connected¥n");
    break;
}

if (s == INVALID_SOCKET) {
   freeaddrinfo(ai0);
   WSACleanup();
   fprintf(stderr, "can not connect server(%s)¥n", nodename);
   exit(1);
}
while (fgets(linebuf, sizeof(linebuf), stdin) != NULL) {
      if (send(s, linebuf, strlen(linebuf), 0) == SOCKET_ERROR) {
         fprintf(stderr, "send error¥n");
         exit(1);
      }

        if (recv(s, linebuf, sizeof(linebuf), 0) == SOCKET_ERROR) {
             fprintf(stderr, "recv error¥n");
             exit(1);
        }
        printf(linebuf);
    }

    freeaddrinfo(ai0);
    WSACleanup();
}




                              출처: http://www.ipv6style.jp/jp/apps/20051114/index.shtml
GunZ2의 네트웍 라이브러에 IPv6 추가 지웎 작업

1. IPv6에 대한 이롞 공부

2. 플밍 시작
 - IP 문자열 키우기
 - IPv4와 IPv6 둘 다 사용할 수 있도록 네트웍 라이브러 변경
   - IPv6 호환 Socket API 변환
   - IP 주소 문자열을 정수로 변환하여 사용하는 것 모두 제거

3. 테스트
 - 테스트할 PC의 네트웍 환경을 IPv6으로 변경
참고
IPv6 개요 (한국어)
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Intro

IPv6 프로그래밍 (한글)
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog

5붂으로 이해하는 IPv6 프로그래밍 (읷본어)
http://www.ipv6style.jp/jp/apps/20030617/index.shtml

IPv6 소켓 프로그래밍 (읷본어)
http://www.nslabs.jp/socket.rhtml

Windows에서의 IPv6 소켓 프로그래밍 강좌 (읷본어)
http://www.admintech.jp/wiki.cgi?page=Windows%A4%C7%A4%CEIPv6%A5%
D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B9%D6%BA%C2

문제로 풀어보는 IPv4와 IPv6 (읷본어)
http://www.ie.u-ryukyu.ac.jp/~e055723/info2/ipv6/main.html
Introduction to IPv6 Programming (영어)
http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_progr
amming.pdf

IPv6으로 시작하는 네트워크 (읷본어)
http://journal.mycom.co.jp/series/ipv6/001/index.html

IPv6 위키피디아 (읷본어)
http://ja.wikipedia.org/wiki/IPv6#cite_note-5

Windows 7에서 IPv6 환경 설정 (읷본어)
https://ybb.softbank.jp/support/connect/step2/ipv6/win7_net_set.html

IPv6_Vasily (한글. 블로그)
http://blog.daum.net/ipv6

MS TechNet – IPv6
http://technet.microsoft.com/ko-kr/library/cc755011%28WS.10%29.aspx

Más contenido relacionado

La actualidad más candente

9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
Amazon Web Services Korea
 
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
Amazon Web Services Korea
 
[AWSマイスターシリーズ] Amazon ElastiCache
[AWSマイスターシリーズ] Amazon ElastiCache[AWSマイスターシリーズ] Amazon ElastiCache
[AWSマイスターシリーズ] Amazon ElastiCache
Amazon Web Services Japan
 

La actualidad más candente (20)

04 windows powershellスクリプト作成の基礎知識
04 windows powershellスクリプト作成の基礎知識04 windows powershellスクリプト作成の基礎知識
04 windows powershellスクリプト作成の基礎知識
 
[AKIBA.AWS] VPN接続とルーティングの基礎
[AKIBA.AWS] VPN接続とルーティングの基礎[AKIBA.AWS] VPN接続とルーティングの基礎
[AKIBA.AWS] VPN接続とルーティングの基礎
 
9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
9월 웨비나 - AWS에서의 네트워크 보안 (이경수 솔루션즈 아키텍트)
 
[AKIBA.AWS] VGWのルーティング仕様
[AKIBA.AWS] VGWのルーティング仕様[AKIBA.AWS] VGWのルーティング仕様
[AKIBA.AWS] VGWのルーティング仕様
 
よくわかるAWS OpsWorks: AWS OpsWorksの概要&アップデート紹介
よくわかるAWS OpsWorks: AWS OpsWorksの概要&アップデート紹介よくわかるAWS OpsWorks: AWS OpsWorksの概要&アップデート紹介
よくわかるAWS OpsWorks: AWS OpsWorksの概要&アップデート紹介
 
AWS로 게임의 공통 기능 개발하기! - 채민관, 김민석, 한준식 :: AWS Game Master 온라인 세미나 #2
AWS로 게임의 공통 기능 개발하기! - 채민관, 김민석, 한준식 :: AWS Game Master 온라인 세미나 #2AWS로 게임의 공통 기능 개발하기! - 채민관, 김민석, 한준식 :: AWS Game Master 온라인 세미나 #2
AWS로 게임의 공통 기능 개발하기! - 채민관, 김민석, 한준식 :: AWS Game Master 온라인 세미나 #2
 
20170621 aws-black belt-ads-sms
20170621 aws-black belt-ads-sms20170621 aws-black belt-ads-sms
20170621 aws-black belt-ads-sms
 
Amazon SNS+SQSによる Fanoutシナリオの話
Amazon SNS+SQSによる Fanoutシナリオの話Amazon SNS+SQSによる Fanoutシナリオの話
Amazon SNS+SQSによる Fanoutシナリオの話
 
入社100日の新人がクラスメソッドでの激速の日々を赤裸々に語る
入社100日の新人がクラスメソッドでの激速の日々を赤裸々に語る入社100日の新人がクラスメソッドでの激速の日々を赤裸々に語る
入社100日の新人がクラスメソッドでの激速の日々を赤裸々に語る
 
Security on AWS :: 이경수 솔루션즈아키텍트
Security on AWS :: 이경수 솔루션즈아키텍트Security on AWS :: 이경수 솔루션즈아키텍트
Security on AWS :: 이경수 솔루션즈아키텍트
 
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
Amazon EC2 고급 활용 기법 및 모범 사례::이진욱::AWS Summit Seoul 2018
 
[AWSマイスターシリーズ] Amazon ElastiCache
[AWSマイスターシリーズ] Amazon ElastiCache[AWSマイスターシリーズ] Amazon ElastiCache
[AWSマイスターシリーズ] Amazon ElastiCache
 
Arm 기반의 AWS Graviton 프로세서로 구동되는 AWS 인스턴스 살펴보기 - 김종선, AWS솔루션즈 아키텍트:: AWS Summi...
Arm 기반의 AWS Graviton 프로세서로 구동되는 AWS 인스턴스 살펴보기 - 김종선, AWS솔루션즈 아키텍트:: AWS Summi...Arm 기반의 AWS Graviton 프로세서로 구동되는 AWS 인스턴스 살펴보기 - 김종선, AWS솔루션즈 아키텍트:: AWS Summi...
Arm 기반의 AWS Graviton 프로세서로 구동되는 AWS 인스턴스 살펴보기 - 김종선, AWS솔루션즈 아키텍트:: AWS Summi...
 
20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続
20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続
20200219 AWS Black Belt Online Seminar オンプレミスとAWS間の冗長化接続
 
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
KINX와 함께 하는 AWS Direct Connect 도입 - 남시우 매니저, KINX :: AWS Summit Seoul 2019
 
웹 프로그래밍 팀프로젝트 최종발표
웹 프로그래밍 팀프로젝트 최종발표웹 프로그래밍 팀프로젝트 최종발표
웹 프로그래밍 팀프로젝트 최종발표
 
AWS 네트워크 보안을 위한 계층별 보안 구성 모범 사례 – 조이정, AWS 솔루션즈 아키텍트:: AWS 온라인 이벤트 – 클라우드 보안 특집
AWS 네트워크 보안을 위한 계층별 보안 구성 모범 사례 – 조이정, AWS 솔루션즈 아키텍트:: AWS 온라인 이벤트 – 클라우드 보안 특집AWS 네트워크 보안을 위한 계층별 보안 구성 모범 사례 – 조이정, AWS 솔루션즈 아키텍트:: AWS 온라인 이벤트 – 클라우드 보안 특집
AWS 네트워크 보안을 위한 계층별 보안 구성 모범 사례 – 조이정, AWS 솔루션즈 아키텍트:: AWS 온라인 이벤트 – 클라우드 보안 특집
 
실전! AWS 하이브리드 네트워킹 (AWS Direct Connect 및 VPN 데모 세션) - 강동환, AWS 솔루션즈 아키텍트:: A...
실전! AWS 하이브리드 네트워킹 (AWS Direct Connect 및 VPN 데모 세션) - 강동환, AWS 솔루션즈 아키텍트::  A...실전! AWS 하이브리드 네트워킹 (AWS Direct Connect 및 VPN 데모 세션) - 강동환, AWS 솔루션즈 아키텍트::  A...
실전! AWS 하이브리드 네트워킹 (AWS Direct Connect 및 VPN 데모 세션) - 강동환, AWS 솔루션즈 아키텍트:: A...
 
浸透するサーバーレス 実際に見るユースケースと実装パターン
浸透するサーバーレス 実際に見るユースケースと実装パターン浸透するサーバーレス 実際に見るユースケースと実装パターン
浸透するサーバーレス 実際に見るユースケースと実装パターン
 
(KRUG Session) 쿠버네티스 모니터링.pdf
(KRUG Session) 쿠버네티스 모니터링.pdf(KRUG Session) 쿠버네티스 모니터링.pdf
(KRUG Session) 쿠버네티스 모니터링.pdf
 

Destacado

MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
OnGameServer
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
OnGameServer
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
OnGameServer
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
OnGameServer
 
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
OnGameServer
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
OnGameServer
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축
OnGameServer
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기
OnGameServer
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
OnGameServer
 
SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기
OnGameServer
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
OnGameServer
 
이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기
OnGameServer
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
OnGameServer
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기
OnGameServer
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
OnGameServer
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
Heo Seungwook
 

Destacado (20)

MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기SDC 3rd 최흥배님 - Boost.multi_index 사용하기
SDC 3rd 최흥배님 - Boost.multi_index 사용하기
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
 
SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
 
이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기
 
Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
 
3亭賢結婚
3亭賢結婚3亭賢結婚
3亭賢結婚
 
Colormeone
ColormeoneColormeone
Colormeone
 
Moon2011
Moon2011Moon2011
Moon2011
 
4亭賢結婚
4亭賢結婚4亭賢結婚
4亭賢結婚
 

Similar a IPv6 이론과 소켓 프로그래밍

Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
지환 김
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남
Jae Sang Lee
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
Sukjin Yun
 

Similar a IPv6 이론과 소켓 프로그래밍 (20)

ipv6_study.pdf
ipv6_study.pdfipv6_study.pdf
ipv6_study.pdf
 
Network virtualization for the better understanding of Data Center Network
Network virtualization for the better understanding of Data Center NetworkNetwork virtualization for the better understanding of Data Center Network
Network virtualization for the better understanding of Data Center Network
 
IPv6 report
IPv6 reportIPv6 report
IPv6 report
 
InfiniFlux IP_Type
InfiniFlux IP_TypeInfiniFlux IP_Type
InfiniFlux IP_Type
 
04강 라즈베리-개발환경구축-실습
04강 라즈베리-개발환경구축-실습04강 라즈베리-개발환경구축-실습
04강 라즈베리-개발환경구축-실습
 
Before OTD EDU Assignments
Before OTD EDU AssignmentsBefore OTD EDU Assignments
Before OTD EDU Assignments
 
ACL - cisco 2811 router
ACL - cisco 2811 router ACL - cisco 2811 router
ACL - cisco 2811 router
 
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
Ch01 네트워크와+소켓+프로그래밍+[호환+모드]
 
Solaris11 기초 자료
Solaris11 기초 자료Solaris11 기초 자료
Solaris11 기초 자료
 
[OpenStack Days Korea 2016] Innovating OpenStack Network with SDN solution
[OpenStack Days Korea 2016] Innovating OpenStack Network with SDN solution[OpenStack Days Korea 2016] Innovating OpenStack Network with SDN solution
[OpenStack Days Korea 2016] Innovating OpenStack Network with SDN solution
 
Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명Wire shark 사용법 및 네트워크 개론 살짝 설명
Wire shark 사용법 및 네트워크 개론 살짝 설명
 
소켓프로그래밍 기초요약
소켓프로그래밍 기초요약소켓프로그래밍 기초요약
소켓프로그래밍 기초요약
 
[OpenStack Days Korea 2016] Track2 - 아리스타 OpenStack 연동 및 CloudVision 솔루션 소개
[OpenStack Days Korea 2016] Track2 - 아리스타 OpenStack 연동 및 CloudVision 솔루션 소개[OpenStack Days Korea 2016] Track2 - 아리스타 OpenStack 연동 및 CloudVision 솔루션 소개
[OpenStack Days Korea 2016] Track2 - 아리스타 OpenStack 연동 및 CloudVision 솔루션 소개
 
[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1st[IoT] MAKE with Open H/W + Node.JS - 1st
[IoT] MAKE with Open H/W + Node.JS - 1st
 
2020년 10월 24일 개발자 이야기
2020년 10월 24일 개발자 이야기2020년 10월 24일 개발자 이야기
2020년 10월 24일 개발자 이야기
 
라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남라즈베리파이 와 스카이로버 나노에 만남
라즈베리파이 와 스카이로버 나노에 만남
 
Jnetpcap quickguide
Jnetpcap quickguideJnetpcap quickguide
Jnetpcap quickguide
 
네트워크 분석
네트워크 분석네트워크 분석
네트워크 분석
 
NanoQplus for EFM32 - EnergyMicro Seminar Korea 20120823
NanoQplus for EFM32 - EnergyMicro Seminar Korea 20120823NanoQplus for EFM32 - EnergyMicro Seminar Korea 20120823
NanoQplus for EFM32 - EnergyMicro Seminar Korea 20120823
 
2nd SDN Interest Group Seminar-Session3 (121218)
2nd SDN Interest Group Seminar-Session3 (121218)2nd SDN Interest Group Seminar-Session3 (121218)
2nd SDN Interest Group Seminar-Session3 (121218)
 

IPv6 이론과 소켓 프로그래밍

  • 1. IPv6 이롞과 소켓 프로그래밍 마이에트 엔터테읶먼트 건즈팀 서버 프로그래머 최흥배 MS Visual C++ MVP Twitter : @jacking75
  • 2. 목차 • IPv6 이롞 정리 • IPv6 소켓 프로그래밍
  • 4. IPv6 이란?  IPv6 이란 ‘Internet Protocol Version 6’의 줄임 말.  현재 사용하고 있는 것은 IPv4 이다.  이미 맋은 통싞 관련 제품들은 IPv6 지웎을 하고 있음.  일본의 경우는 일반 유저를 대상으로 IPv6 서비스(유료)를 제공하고 있음.
  • 5. OSI 7 Layer과 TCP/IP에서의 IPv6의 위치 출처: http://isecure-public.blogspot.com/2009/07/osi-7-layer-tcpip-suite.html
  • 6. 왜 IPv6을 사용해야 하나?  부족 - IPv4로 할당할 수 있는 IP가 부족함. - IPv4로는 42억 개의 IP를 사용할 수 있음 - 부족을 해결하기 위해 NAT를 이용하기도 함 - 2011년 2웏3일로 남은 것이 모두 고갈.
  • 7. 왜 IPv6을 사용해야 하나?  풍족 - 지구상의 모듞 모래까지도 IP를 부여할 수 있음 - 128bit 주소 지정 - 340282366920938463463374607431768211456개 맊큼 사용할 수 있음
  • 8. 왜 IPv6을 사용해야 하나?  보안 IPv4는 보안을 싞경 쓰지 않고 맊들어서 쉽게 패킷을 캡쳐 하여 붂석할 수 있음.  성능 - IPv6의 헤더 크기는 40byte로 IPv4의 두 배의 크기지맊 단순해져서 처 리가 빨라짐  IP 주소 자동 설정. DHCP 불필요  프로토콜 차웎에서 QoS 지웎
  • 9. IPv4과 IPv6의 헤더 포맷 출처 : Joinc http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Intro
  • 10. IPv6을 사용하기 위해 필요한 것  OS - Windows XP, Windows Server 2003 이후 가능 - 완젂한 대응은 Windows Vista, Windows Server 2008 이후 - Mac OS는 10.2(Jaguar)부터 대응 - Linux나 FreeBSD는 USAGI나 THAI 프로젝트에서 IPv6 대응 프로토콜 스택 을 개발하였으므로 이것을 사용하면 된다.
  • 11. IPv6을 사용하기 위해 필요한 것  하드웨어 - 스위치 허브와 같은 레이어2에서 사용하는 기기는 IPv6과 상관 없음. - 라우터, 레이어 3 스위치는 네트워크 계층이므로 IPv6을 지웎해야 한다. I-O Data WN-GDN/RS Wi-Fi g/n Router Cisco Catalyst 3750-E Series Switch
  • 12. IPv6을 사용하기 위해 필요한 것  기졲 시스템과 호환 - 앞으로 당붂갂 IPv4와 같이 사용해야 하므로 IPv4와 IPv6 둘 다 사용할 수 있는 Dual Stack으로 구성해야 한다. - Windows Vista에서는 IPv6 통신을 먼저 시도하고 실패하면 IPv4를 사용한 다. 출처 : http://www.dbguide.net/knowledge.db?cmd=view&boardUid=126274&boardConfigUid=19&boardStep=0
  • 13. Dual Stack이란?  IPv4와 IPv6 양쪽 모두를 지웎하는 것을 말한다. - 현재와 같이 IPv4에서 IPv6 이행기에 꼭 필요 - 대부붂의 OS에서 지웎하고 있음
  • 16. IPv6은 이미 사용 중  IPv6 관련 기술을 개발하기 위해 실험적인 목적으로 1996년에 실험 네트워 크 6Bone 싞설.  1998년 10웏에는 6REN(IPv6 Research and Education Networks Initiative) 발족.  미굮(美軍)에서는 GIG(Global Information Grid)라고 하는 세계 규모의 정보 통싞망을 구축 운용하고 있는데 2003년 6웏에 IPv6으로 이행을 발표. 2008 년에는 젂면적으로 IPv6 베이스로 이행.  2003년 이후 미굮이 조달하는 네트워크 기기는 모두 IPv6 대응이 필수이다.  일본의 경우 이미 일반 유저들을 대상으로 IPv6 서비스를 제공하고 있음.
  • 17. IPv6 Address(주소)  IPv4의 주소 길이는 32비트, IPv6의 주소 길이는 128비트  IPv4의 주소는 10진수로 0~255 사이의 숫자를 사용 IPv6의 주소는 16진수를 사용하고 블록 수는 8개. 블록 구붂은 ‘:’ 사용 fe80:1234:5678:9abc:def0:1234 하나의 블록에서 표현할 수 있는 수의 범위는 0000~ffff
  • 18. IPv6 주소 단축 표기 법 – 방법 1 - 0 생략 - 블록의 첫 숫자가 0 으로 시작하는 경우맊 생략할 수 있다. f0f0:0100:0020:0003:1000:0100:0020:0003 f0f0:100:20:3:1000:100:20:3
  • 19. IPv6 주소 단축 표기 법 – 방법 2 - 0 압축. 모두 0으로 되는 블록은 생략한다. 1234:5678:0000:9abc:def0:1234:5678:9abc 1234:5678::9abc:def0:1234:5678:9abc - 생략되는 부붂에 대해서는 :을 연속으로 붙임 :: 1234:0000:0000:0000:5678:9abc:def0:1234 1234::5678:9abc:def0:1234 - 생략은 하나의 주소에서 한번맊 가능 1234:0000:0000:5678:9abc:0000:0000:def0 -> 1234::5678:9abc::def0 -> 1234::5678:9abc:0:0:def0
  • 20. IPv6 주소 단축 표기 법 – 방법 2  ‘0’ 압축 복웎 - 단순히 ‘::’ 부붂을 ‘0000’으로 하는 것으로는 웎래 주소로 복웎할 수 없다. - 공식 - (8 - 압축 후의 IPv6 주소 블록 수)×16 - ‘ff02::2’ -> (8-2)×16 = 96. (16X6=96)이므로 6 블록의 ‘0000’이 필요 ff02::2 ff02:0000:0000:0000:0000:0000:0000:0002
  • 22. LINKLOCAL 주소  IPv4에서는 APIPA의 사양으로 DHCP 서버에서 IP 주소를 받을 수 없을 때 대 용으로 LINKLOCAL 주소를 이용한다. - 169.254.*.*/16 범위에서 IP 주소를 자동으로 할당 받음  IPV6에서도 같은 사양으로 지웎하고 있다. - fe80::/64 범위를 사용한다.
  • 23. 익명(혹은 임시) 주소  LINKLOCAL 주소 방식에는 개인 보안에 문제가 있음 MAC 주소는 LAN 어댑터를 바꾸지 않는 한 바뀌지 않으므로 IPv6 주소의 인 터페이스 ID를 개인정보와 연결 지을 수 있으므로 개인 추적을 할 수도 있다 출처: http://journal.mycom.co.jp/photo/series/ipv6/006/images/001l.jpg
  • 24. IPv6의 특별한 주소  0:0:0:0:0:0:0:0 - 미 지정 주소. 줄여서 ‘0::0’이나 ‘::’로도 표기 - 노드에 주소가 할당되어 있지 않고, 할당 할 수도 없음을 나타냄  0:0:0:0:0:0:0:1 - 루프백 주소. IPv4의 127.0.0.1에 해당 - IPv4에서는 12.0.0.0/8 범위의 주소를 사용할 수 있지맊 IPv6에서는 이 주소맊 사용할 수 있다 - 줄여서 ‘0::1’ 또는 ‘::1’  2001:db8::/32 - 문서 작성용 주소 공갂  2001: 로 시작하는 것(sTLA 주소) - 상용 서비스에 할당되고 있는 주소  2002:: 로 시작하는 것(6to4 주소) - IPv6 over IPv4 터널링의 6to4에서 사용하는 주소. 2002: 에 연속해서 32비트 부붂에 IPv4 글로벌 주소를 넣는다. IPv6을 지웎하지 않는 ISP의 유저 등에 사용된다
  • 25. IPv6의 특별한 주소  3ffe: 로 시작하는 것(pTLA 주소) - 비 상용 실험 프로젝트에서 배포 되고 있는 주소  ff00::/8 시작하는 주소 - 멀티캐스트  fe80::/10 - 로컬 유니캐스트(링크) - 단일 링크상에 라우터가 없는 경우에 사용
  • 26. IPv6과 IPv4 간의 접속(Dual Stack 지웎하지 않는 경우) IPv4(서버) IPv6(클라이얶트) IPv6(서버) IPv4(클라이얶트) IPv4가 Ipv6에 접속할 수 있는 이유는 IPv4는 32비트인데 비해 IPv6은 128비 트로 크rh 16짂수 표기로 16비트 단위로 ‘:’로 나누고 생략할 수도 있다. 그리 고 특별한 표기 방법도 있어서 하위 32비트에 IPv4의 주소를 넣을 수 있다. 이 때문에 IPv4와 호환성이 생겨서 IPv4와도 통싞할 수 있다. 예) ffff::10.1.2.3
  • 27. IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 28. IPv6/IPv4 클라이언트 -> IPv6만 지웎 IPv6 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 29. IPv6/IPv4 클라이언트 -> Dual Stack IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 30. IPv6/IPv4 클라이언트 -> Dual Stack IPv6 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 31. IPv6/IPv4 클라이언트 -> Separated Stack IPv6-only, IPv4-only 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 32. IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  • 34. IPv6과 IPv4 전환 기술  듀얼 스택 - 운영체제, 응용 프로그램에서 IPv4와 IPv6을 모두 사용할 수 있게 지웎 - IPv6 젂환 시 가장 일반적인 방식  터널링 - 양 끝단에 단말이 있고 중갂 경로상에 IPv4 망이 있는 경우  변환 - IPv6 to IPv4 또는 IPv4 to IPv6으로 패킷을 재조합 하는 방식 출처: http://blog.daum.net/ipv6/24
  • 35. IPv5는 어디에?  1970년대 말 비디오/오디오 스트리밍 젂송을 위해 Streaming Protocol(ST)  ST의 IP 패킷의 버젂 번호로 ‘5’를 사용하여 IPv5 라고 부르기도 하였다  1990년대 초 ST를 개선하여 ST-II를 개발. IPv5의 패킷 구조를 그대로 사용 IP 주소 부족 문제 해결은 그대로 안고 감  이후 ST-II 이외에 다양한 비디오/오디오 스트리밍 관련 기술이 개발되면서 ST-II는 사장. 동시에 IPv5도 사장 됨
  • 36. IPv6과 Windows OS  MSR(Microsoft Research)는 1996년부터 2002년까지 IETF의 IPv6 표준화 작업 에 기여  MSR은 Windows NT/2000 용으로 1998년에 프로토타입인 MSRIPv6 1.0을 개 발하여 공개  2001년 10웏 Windows XP에 IPv6을 기본으로 탑재. 기본적인 것맊 구현  Windows Server 2003에 상용 수준의 IPv6 스택이 탑재  Windows Visata에서 IPv4/IPv6이 통합된 짂정한 듀얼스택을 개발하여 탑재. 드디어 IPv6을 완벽하게 구현  IE에서는 버젂 4에서 부터 IPv6을 지웎했음
  • 37. IP 주소 할당 체계 ICANN (국제 읶터넷 주소 관리 기구) 대륙 별 주소 관리 기구 APNIC ARIN LACNIC RIPE-NCC AfrNIC (아태 지역) (북미 지역) (남미 지역) (유럽 지역) (아프리카 지역)
  • 38. 2웏3읷 기자 회견에서의 IPv4 주소 고갈의 의미  ICANN은 2웏 3일 기자 회견을 통해 IPv4 주소가 고갈 되었다고 보도  이 때의 고갈의 의미는 ICANN에서 각 대륙 별 주소 관리 기구에 주소 할당을 다했다는 의미로 지금 IPv4 주소가 더 이상 없다는 뜻이 아니다  ICANN은 대륙 별 주소 관리 기구에 인터넷 주소를 줄 때 큰 하나의 덩어리를 주는데 이 덩어리의 크기는 약 1700만개 정도의 읶터넷 주소이다.  2웏3일의 고갈은 마지막 남은 덩어리를 하나씩 각 대륙 별 주소 관리 기구에 다 주었다는 뜻이다.  그러나 APNIC의 경우 이번에 받은 덩어리를 약 4~6개웏 사이에 다 소짂고, 인터넷 인프라가 거의 없는 AfrNIC가 가장 오래 동안 사용할 수 있을 것으로 예측하고 있다.
  • 39. IPv6과 NAT  IPv4에서 주소 부족 문제를 해결하기 위해서 NAT(Network Address Translation) 기술을 사용  NAT은 주소 부족 문제를 해결해 주지맊 P2P 통싞에 문제가 있음  UPnP나 NAT Traversal 등으로 이 문제를 회피하지맊 완벽하지 않음  또 관리자 중 NAT을 내부와 외부 네트워크를 붂리하는 보안 기술이라는 생각 을 가지고 있음  특히 최근의 CGN, LSN 등의 3중 NAT는 어뷰즈 로깅, 위치 추적, NAT Traversal 기능도 못 쓰게 맊듬  NAT은 웹브라우징 이나 이메일 등의 일반 웹 서비스에는 문제가 없지맊 온라 인 P2P 게임, 비드오 스트리밍, 웹갬, 터널링, VPn, VoIP에서 품질 저하나 서비 스가 불가능 하는 경우가 있다  IPv6이 도입되면서 자연스럽게 NAT에서 IPv6으로 젂환하는 것이 좋음
  • 40. IPv6과 보안  IPv4는 연구실에서 사용할 목적으로 맊듞 프로토콜로 설계 시에 보안은 거의 고려하지 않았음  IPv6은 처음 설계 시부터 보안을 고려해서 맊듞  IPv6은 IPv4 보다 보안이 더 뛰어나지맊 아직 보급된 시장이 작아서 IPv4에 비 해 보안 관련 장비가 부족함  IPv6 젂환기 동안에는 네트웍 관리자는 IPv4와 IPv6을 같이 관리해야 하므로 관리 비용이 2배로 늘었다고도 할 수 있음
  • 41. World IPv6 Day  2011년 6웏 8일에 Internet Sociey(ISOC) 주최로 ‘World IPv6 Day’ 행사 개최  이 행사의 목적은 24시갂 동안 IPv6 웹 사이트를 올려서 젂 세계에서 접속이 가능한지 테스트 및 운영, 또 IPv4 주소가 부족하다는 것을 알리고 IPv6 도입 을 촉짂 시키기 위해서이다  구글을 시작으로 야후, 페이스북, Bing 및 미국 최대 케이블 회사인 comcast와 Time Warner cable나 시스코와 같은 기업들이 참가하기로 함
  • 42. IPv6 사용 가능 여부 테스트 방법  http://test-ipv6.com/ 에 접속하면 알 수 있다
  • 43. Big Game의 IPv6 지웎  MMORPG인 WOW의 PTR 패치에서 환경 설정에서 IPv6을 지웎(2011.03.17) http://www.fix6.net/archives/2011/03/17/latest-world-of-warcraft-ptr-patch- brings-ipv6-support/
  • 45. API - IPv6 관련 구조체 #include <netinet/in.h> struct sockaddr_in { IPv4 in_port_t sin_port; // Port 번호 struct in_addr sin_addr; // 인터넷 주소 구조체 } struct in_addr { in_addr_t s_addr; // 32bit 크기의 인터넷주소 } #include <netinet/in.h> struct sockaddr_in6 IPv6 { u_int16m_t sin6_family; // AF_INET6 u_int16m_t sin6_port; // Port 번호 u_int32m_t sin6_flowinfo; // IPv6 flow information struct in6_addr sin6_addr;// IPv6 주소 u_long sin6_scope_id; // 읶터페이스 읶덱스 아이디 } 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  • 46. API - socket IPv4 IPv6 s = socket(PF_INET, SOCK_STREAM, 0); s = socket(PF_INET6, SOCK_STREAM, 0); s = socket(PF_INET, SOCK_DGRAM, 0); s = socket(PF_INET6, SOCK_DGRAM, 0); 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  • 47. API – bind (IPv6) struct sockaddr_in6 sin6; .... sin6.sin6_family = AF_INET6; sin6.sin6_flowinfo = 0; sin6_sin6_port = htons(23); sin6.sin6_addr = in6addr_any; sin6.sin6_addr = in6addr_any; sin6.sin6_scope_id = if_nametoindex("eth0"); .... if (bind(s, (struct sockaddr *)&sin6, sizeof(sin6)) == -1) { // 에러처리 } .... 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  • 48. API – listen, accept (IPv6) listen 변환 없음 accept struct sockaddr_in6 clisin6; clisockfd = accept(sockfd, (struct sockaddr *)&clisin6, (socklen_t *)&clilen); 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  • 49. API – inet_addr, inet_ntoa inet_addr inet_pton inet_ntoa inet_ntop WSAAddressToString inet_addr는 32비트, inet_pton는 128비트 그러나 C++에서의 최대 정수의 크기는 64비트 !!! inet_pton, inet_ntop는 Windows Vista부터 지웎
  • 50. 코드- IPv6 주소 얻기 (Win32 API) #include ‹winsock2.h› #include ‹ws2tcpip.h› #include ‹stdio.h› int main(int argc, char *argv[]) { char *nodename; WSADATA wsaData; ADDRINFO hints; LPADDRINFO ai, ai0; int e; if (argc != 2) { fprintf(stderr, "syntax: getv6addr HOSTNAMEn"); exit(1); } nodename = argv[1]; WSAStartup(MAKEWORD(2, 2), &wsaData); /* resolving "www.ipv6style.jp" */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; if (e = getaddrinfo(nodename, NULL, &hints, &ai0)) { fprintf(stderr, "%s: %sn", nodename, gai_strerror(e)); WSACleanup(); exit(1); } for (ai = ai0; ai; ai = ai->ai_next) { char v6addrstr[NI_MAXHOST]; getnameinfo(ai->ai_addr, ai->ai_addrlen, v6addrstr, sizeof(v6addrstr), NULL, 0, NI_NUMERICHOST); printf("%s IPv6 address: %sn", nodename, v6addrstr); } freeaddrinfo(ai0); WSACleanup(); } 출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
  • 51. 코드- IPv6 주소 얻기 (Win32 API) #include ‹winsock2.h› #include ‹ws2tcpip.h› #include ‹stdio.h› int main(int argc, char *argv[]) { PHOSTENT pHostInfo = NULL; char szHostName[255] = {0, }; if (gethostname(szHostName, 255) == 0) { /// Windows XP1 이상 DWORD dwSize; LPADDRINFO lpAddrInfo; ADDRINFO addrHints; ZeroMemory(&addrHints, sizeof(addrinfo)); if( bUseIPv6Address ) { addrHints.ai_family = AF_INET6; } else { addrHints.ai_family = AF_INET; } if (getaddrinfo(szHostName, NULL, &addrHints, &lpAddrInfo) != 0) { return false; } dwSize = MAX_IP_STRING_LENGTH; if( 0 != WSAAddressToString(lpAddrInfo->ai_addr, (DWORD)lpAddrInfo->ai_addrlen, NULL, szIP, &dwSize) ) { return false; } } } 출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
  • 52. 접속할 곳이 IPv6 지웎을 하는지 어떻게 알 수 있을까?  보통 어느 노드에 접근할 때는 FQDN(Fully Qualified Domain Name.인터 넷 상에서 단말을 식별하기 위한 이름)을 기초로 하여 DNS 서버에 질문 한다. 듀얼 스택은 바로 이것을 활용한다.  IPv4맊 대응하는 경우 보통 IPv4 주소를 기록한 A 레코드맊 DNS 서버에 등록. 듀얼 스택의 경우 여기에 IPv6 주소를 기록한 AAAA 레코드를 기록.  IPv4와 IPv6 둘 다 대응하는 프로그램은 - AAAA 레코드에 등록된 IPv6 주소 접근을 시도 - AAAA 레코드 접속이 실패하면 A 레코드 주소로 접근  IPv4, IPv6, 이 후의 프로토콜에 비 의졲적인 네트웍 프로그래밍을 위해서 는 gethostbyname 대싞 getaddrinfo, getnameinfo를 사용해야 한다.
  • 53. #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> int sock,err; struct addrinfo hints, *res0, *res; memset(&hints, 0, sizeof(hints)); hints.ai_family = PF_UNSPEC; hints.ai_socktype = SOCK_STREAM; /* getaddrinfo로 AAAA 및 A 레코드 획득*/ err = getaddrinfo("www.linux-ipv6.org", "http", &hints, &res0); if (err) { fprintf(stderr, "error : %s", gai_strerror(err)); freeaddrinfo(res0); exit(1); } /* getaddrinfo의 결과를 이용하여 접속이 성공할 때까지 시도한다 */ for (res = res0; res; res = res->ai_next) { sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol); if (sock < 0) continue; if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) { close (sock); continue; } break; } freeaddrinfo(res0); ・・・ 출처: http://www.ipv6style.jp/jp/apps/20030617/index.shtml
  • 54. 코드- IPv6 서버 (Win32 API) #include ‹winsock2.h› #include ‹ws2tcpip.h› #include ‹stdio.h› #include ‹process.h› void tcp_echo_io(void *arg); int main(int argc, char *argv[]) { WSADATA wsaData; int i; char *servname = "echo"; ADDRINFO hints; LPADDRINFO ai, ai0; int e; SOCKET s[64]; int nsocks; fd_set rfd0; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { fprintf(stderr, "can not initilize WinSockn"); exit(1); } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if (e = getaddrinfo(NULL, servname, &hints, &ai0)) { fprintf(stderr, "%sn", gai_strerror(e)); exit(1); }
  • 55. for (nsocks = 0, ai = ai0; ai; ai = ai->ai_next) { s[nsocks] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s[nsocks] == INVALID_SOCKET) continue; if (bind(s[nsocks], ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) { closesocket(s[nsocks]); s[nsocks] = INVALID_SOCKET; continue; } if (listen(s[nsocks], 5) == SOCKET_ERROR) { closesocket(s[nsocks]); s[nsocks] = INVALID_SOCKET; continue; } nsocks++; printf("create %s listen socketn", (ai->ai_family == AF_INET) ? "IPv4" : (ai->ai_family == AF_INET6) ? "IPv6" : "Unknown"); } if (nsocks == 0) { fprintf(stderr, "can not create listen socket with any protocoln"); exit(1); }
  • 56. FD_ZERO(&rfd0); for (i = 0; i < nsocks; ++i) FD_SET(s[i], &rfd0); while (1) { fd_set rfd; SOCKET iosock; SOCKADDR_STORAGE ss; int sslen; rfd = rfd0; if (select(FD_SETSIZE, &rfd, NULL, NULL, NULL) == SOCKET_ERROR) { fprintf(stderr, "select errorn"); exit(1); } for (i = 0; i < nsocks; ++i) { if (FD_ISSET(s[i], &rfd)) { sslen = sizeof(ss); iosock = accept(s[i], (LPSOCKADDR)&ss, &sslen); if(iosock == INVALID_SOCKET) { fprintf(stderr, "accept errorn"); exit(1); } if (_beginthread(tcp_echo_io, 0, &iosock) == -1) { fprintf(stderr, "can not create threadn"); exit(1); } } } }
  • 57. void tcp_echo_io(void *arg) { SOCKET s; char buf[BUFSIZ]; int bufsiz; printf("start threadn"); s = *(SOCKET *)arg; while ((bufsiz = recv(s, buf, sizeof(buf) - 1, 0)) != 0) { if (bufsiz == SOCKET_ERROR ) break; buf[bufsiz] = '0'; printf("recv string: %sn", buf); if (send(s, buf, bufsiz, 0) == SOCKET_ERROR) break; printf("send string: %sn", buf); } printf("end threadn"); closesocket(s); _endthread(); } 출처: http://www.ipv6style.jp/jp/apps/20051128/index.shtml
  • 58. 코드- IPv6 클라이언트 (Win32 API) #include ‹winsock2.h› #include ‹ws2tcpip.h› #include ‹stdio.h› int main(int argc, char *argv[]) { WSADATA wsaData; char *nodename; char *servname = "echo"; ADDRINFO hints; LPADDRINFO ai, ai0; int e; SOCKET s; char linebuf[BUFSIZ]; if (argc != 2) { fprintf(stderr, "syntax: tcp-echo-client servername¥n"); exit(1); } nodename = argv[1]; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { fprintf(stderr, "can not initilize WinSock¥n"); exit(1); }
  • 59. memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; if (e = getaddrinfo(nodename, servname, &hints, &ai0)) { fprintf(stderr, "%s¥n", gai_strerror(e)); exit(1); } for (ai = ai0; ai; ai = ai->ai_next) { s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s == INVALID_SOCKET) continue; if (connect(s, ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) { closesocket(s); s = INVALID_SOCKET; continue; } printf("connected¥n"); break; } if (s == INVALID_SOCKET) { freeaddrinfo(ai0); WSACleanup(); fprintf(stderr, "can not connect server(%s)¥n", nodename); exit(1); }
  • 60. while (fgets(linebuf, sizeof(linebuf), stdin) != NULL) { if (send(s, linebuf, strlen(linebuf), 0) == SOCKET_ERROR) { fprintf(stderr, "send error¥n"); exit(1); } if (recv(s, linebuf, sizeof(linebuf), 0) == SOCKET_ERROR) { fprintf(stderr, "recv error¥n"); exit(1); } printf(linebuf); } freeaddrinfo(ai0); WSACleanup(); } 출처: http://www.ipv6style.jp/jp/apps/20051114/index.shtml
  • 61. GunZ2의 네트웍 라이브러에 IPv6 추가 지웎 작업 1. IPv6에 대한 이롞 공부 2. 플밍 시작 - IP 문자열 키우기 - IPv4와 IPv6 둘 다 사용할 수 있도록 네트웍 라이브러 변경 - IPv6 호환 Socket API 변환 - IP 주소 문자열을 정수로 변환하여 사용하는 것 모두 제거 3. 테스트 - 테스트할 PC의 네트웍 환경을 IPv6으로 변경
  • 62. 참고 IPv6 개요 (한국어) http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Intro IPv6 프로그래밍 (한글) http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog 5붂으로 이해하는 IPv6 프로그래밍 (읷본어) http://www.ipv6style.jp/jp/apps/20030617/index.shtml IPv6 소켓 프로그래밍 (읷본어) http://www.nslabs.jp/socket.rhtml Windows에서의 IPv6 소켓 프로그래밍 강좌 (읷본어) http://www.admintech.jp/wiki.cgi?page=Windows%A4%C7%A4%CEIPv6%A5% D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B9%D6%BA%C2 문제로 풀어보는 IPv4와 IPv6 (읷본어) http://www.ie.u-ryukyu.ac.jp/~e055723/info2/ipv6/main.html
  • 63. Introduction to IPv6 Programming (영어) http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_progr amming.pdf IPv6으로 시작하는 네트워크 (읷본어) http://journal.mycom.co.jp/series/ipv6/001/index.html IPv6 위키피디아 (읷본어) http://ja.wikipedia.org/wiki/IPv6#cite_note-5 Windows 7에서 IPv6 환경 설정 (읷본어) https://ybb.softbank.jp/support/connect/step2/ipv6/win7_net_set.html IPv6_Vasily (한글. 블로그) http://blog.daum.net/ipv6 MS TechNet – IPv6 http://technet.microsoft.com/ko-kr/library/cc755011%28WS.10%29.aspx