Ipv6 소켓프로그래밍

10,739 views

Published on

0 Comments
19 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
10,739
On SlideShare
0
From Embeds
0
Number of Embeds
375
Actions
Shares
0
Downloads
156
Comments
0
Likes
19
Embeds 0
No embeds

No notes for slide

Ipv6 소켓프로그래밍

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

×