iOS2015.08.31 14:53



호스트 연결전에 DNS Name resolving피하기


호스트에 접속하는 적절한 방법은 DNS 명을 받는 CFHost나 CFNetService같은 API가 있다. 앱에서 DNS name으로 리졸브된 ip주소로 접속을 한다고 해도 이 방법은 피해야 한다. DNS lookup은 보통 여러개의 IP주소를 반환하며 어떤 IP주소가 가장 좋은 연결을 제공하는지 알 수 없다.

최근의 대부분의 컴퓨터나 모바일디바이스들은 멀티홈을 가진다. 즉 WiFi + Ethernet이거나 3G + WiFi이거나 하는 환경이 많다. 하지만 모든 호스트가 모든 컨넥션에서 유효한것은 아니다. 예를 들어 iPhone으로 Apple TV를 제어하려고 하는 경우 App TV는 Wifi망에 있고 폰은 3G망에 있다면 이는 연결이 불가하다.

디바이스와 서버가 모두 멀티IP주소를 가지고 있다면 서버에 연결할 가장 좋은 IP주소는 어떤 네트웍에 연결되어 있느냐에 따라 결정된다. 예를 들어 가정의 멀티미디어 서버가 LAN과 WiFi IP주소를 모두 가지고 있다면 OS에서 더 빠른 네트웍을 감지할 수 있을것이며 프로그램이 이 주소를 통해 연결가능할것이다.

서버가 IPv4와 IPv6를 모두 지원하면 두 프로토콜을 사용함으로 인해 도달하지 못할 수 있다. host-name-basedAPI를 사용하여 OS는 동시에 시도를 할 수 있고 첫번째것으로 성공시킬수 있다. 앱이 먼저 찾아낸 IP주소가 어떤 주소냐에 따라서 연결이 안될 가능성 도 있다.

구형 서버로  IPv6를 지원하지 않는 경우에 AAAA형식의 IPv6주소로 접을을 요청하면 동기로 호출되는 DNS조회는 요청시간내내 블럭될것이다.(디폴트는 30초) . 만일 호스트명을 취하는 API를 사용하면 OS는 IPv4와 IPv6요청이 동시에 수행되는지 사용자가 알수 없게 할것이고 내부적으로 IPv4연결이 완성되면 IPv6연결시도는 취소할것이다.

Bonjours를 사용해서 서비스를 게시하는 경우(DHCP는 동작하지 않음) 앱이 해당서비스를 찾아서 IP주소를 얻어내었다면 해당 디바이스가 IP주소를 유지하는 동안에는 유효하다. 하지만 DHCP서비스가 다시 온라인이 되게 되면 IP주소는 변경되고 이전 IP주소는 더이상 유효하지 않게 된다. 만일 게시이름으로 연결을 시도하게 된다면 앱에서는 서버가 최종적으로 언어진 IP주소로 계속 연결을 할 수 있게 될것이다.

DNS Name 해결하기를 직접 피할수 없다면 먼저 CFHost API가 요구사항에 만족하는지 확인해보아야 한다. 이는 싱글주소 대신에 호스트에 주어진 모든 주소목록을 제공한다. CFHost가 만족시키지 못한다면 DNS Service Discovery API를 사용하라.



Posted by 삼스