새해 복 많이 받으세요.
그나저나 애플은 신년 첫날부터 테러 들어갑니다... 작년에 이미 예고한 테러지만요...
뭐냐면... "니네 앱이 IPv6 지원 안하면 리젝될거임 ㅋㅋ"입니다.
거두절미하고, 리젝 안당하려면 이렇게 해야 합니다.
1. 네트워킹 프레임워크를 사용할 것
2. IPv4 전용 API를 쓰지 말 것
3. 하드코딩 주소를 쓰지 말 것
각 설명을 들어가 보겠습니다.
----------------
1. 네트워킹 프레임워크를 사용할 것
iOS SDK 자체에 있는, 소켓 윗단에 구현되어 있는 네트웍 프레임워크라던지, 혹은 제3의 네트워크 프레임워크를 쓰는 것을 권장한다는 뜻입니다. 네트웍 프레임웍을 쓰신다면 위 2는 웬만하면 고려 안하셔도 될 것입니다. 만약 써드파티 네트웍 프레임웍을 쓰시고 있으시면, 해당 프레임웍 개발자에게 이 질문을 꼭 하셔야 하겠습니다. "IPv6 지원하나요?"
네트웍 프레임웍의 일종인 프라우드넷은 IPv6에 대응되어 있습니다. 2015년 12월 업그레이드 릴리즈에서 대응했습니다. 프라우드넷을 쓰시는 분은 IPv6 지원을 원하시면 2015년 12월 업그레이드 혹은 이후 릴리즈를 적용하셔야 합니다.
----------------
2. IPv4 전용 API를 쓰지 말 것
직접 소켓 프로그래밍을 하신다면, IPv4 전용 API를 쓰시면 안됩니다. 가령 이런 함수들을 쓰시면 안됩니다. (이런 함수들을 쓰는 것 자체가 애플에서 리젝되는지는 확인되지는 않았습니다만, 아무튼 프라우드넷에서는 이들 함수들을 전혀 쓰지 않습니다.)
inet_addr()
inet_aton()
inet_lnaof()
inet_makeaddr()
inet_netof()
inet_network()
inet_ntoa()
inet_ntoa_r()
bindresvport()
getipv4sourcefilter()
setipv4sourcefilter()
IPv6에서 잘 작동하는지 테스트하려면, IPv6 주소만 있는 네트워크 환경을 만들어야 합니다. 여러가지 방법이 있는데요, 저희의 경우 맥 기기를 이용해서 만들었습니다.
----------------
3. 하드코딩 주소를 쓰지 말 것
애플에서는 '하드코드 주소'라고 표현했는데요, 이는 대중들에게 쉽게 의미를 전달하려고 일부러 저렇게 표현한 것 같습니다.
정확한 명칭은 IP literal입니다. 가령, "11.22.33.44"입니다.
한편 우리가 흔히 말하는 '호스트 네임' 가령 "server1.mygame.com" 같은 것은 FQDN(fully qualified domain name)이라고 부릅니다.
만약 하드코드 주소 즉 IP literal을 직접 이용해서 서버에 접속하면 어떻게 되냐고요? 일부 IPv6 네트워크의 클라이언트가 IPv4 네트워크의 서버에 접속을 못하는 경우가 발생할 수 있습니다. (iOS 9.2 이후부터는 이 문제가 일부 해결되긴 합니다만 이 또한 모든 IPv6 네트워크에서 된다는 보장도 없습니다.)
이 반대도 마찬가지입니다. 클라이언트는 IPv4인데 서버가 IPv6인 경우요.
접속을 왜 못하는지는, NAT64/DNS64의 작동 얼개로 설명됩니다. 내용이 길기 때문에 일단 논외 하겠습니다.
그럼 어떻게 해야 하느냐? 애플이 지령(?)한대로 따라야 합니다. 서버는 IPv4 literal 대신 FQDN으로 접근 가능해야 합니다. 클라이언트는 서버에 접속할 때 FQDN을 써야 하고요.
위 내용을 예로 들어 설명하자면,
- 11.22.33.44 ==> 애플에서 밴 먹임
- server.mygame.com ==> Ok
- 11:22:33:44:55:66:77:88 ==> 애플에서 밴 먹임
서버 세팅을 하시는 분들은, 각 서버에 대한 DNS 세팅을 모두 해주어서 각 서버가 FQDN을 가지게 해주어야 하죠. 그리고 클라이언트는 각 서버에의 접속을 할 때 IP literal이 아니라 FQDN으로 서버에 접속을 해야 하겠죠.
만약 각 서버에 대해 지금 당장 FQDN을 배정하기 힘들 때를 위해, 프라우드넷에는 응급처치 방법을 제공합니다.
프라우드넷 기반 서버에 접속하는 IP literal을 입력하되, IPv4에 물려있는 다른 서버 X의 FQDN도 추가로 입력하면 됩니다. X는 실제로 접속은 안하니 걱정 마시고요, 그저 DNS 검색 대상만 될 뿐입니다. 이것이 있으면, 100% 보장하지는 않습니다만, [1] IPv4 literal만 갖고도 서버에 접속을 할 수 있습니다.
CNetClient* nc = CNetClient::Create();
p.m_serverIP = "11.22.33.44";
p.m_publicDomainName1 = "www.nettention.com";
p.m_publicDomainName2 = "www.nts.go.kr"; // 네 그렇습니다. 국세청입니다. -_-;;;
nc->Connect(p);
(C#도 가능하나 일단 생략)
어떻게 IPv4 literal만 갖고 접속을 할 수 있냐면... NAT64의 '주소조합 알고리즘'을 구현했기 때문입니다. 이 또한 내용이 기므로 일단은 생략 ^^
아무튼 위 API를 쓰는 것은 어디까지나 응급처치 방법입니다. 완전한 해결을 하려면 애플의 지시(?) 사항 "FQDN으로 서버에 접속해라"를 따라 주어야 합니다.
---------------------
논외: IPv6 주소가 쫙 퍼지면 인터넷 공유기는 사라지지 않을까?
IPv6 주소가 쫙 퍼지면 인터넷 공유기는 "이론상으로" 사라져도 됩니다. 인터넷 공유기 자체가 모자란 인터넷 주소 갯수를 해결하기 위한 방법 중 하나니까요.
그러나, IP 주소당 가격을 매기는 인터넷 상품을 파는 업체가 IPv6라 하더라도 IP 주소를호락호락 추가 비용 없이 뿌리지는 않을 것입니다. 그렇다면 얄짤없이 인터넷 공유기를 갖다 붙이는 노력을 안할래야 안할 수 없죠. 인터넷 공유기에 강한 프라우드넷도 IPv6 세상에서 여전히 존재 필요성이 있을 것입니다.
-----------------------
즐코딩 하세요~
-------------------
[1]: 맥 기기를 포함해서 일부 클라이언트 사이드 IPv6 인터넷 공유기에서는 정상 작동합니다.
출처 : http://lab.gamecodi.com/board/zboard.php?id=GAMECODILAB_Lecture&no=458&z=4