Skill/Programming - Network

8.인터넷 주소 클래스 (InetAddress Class)

gyulee0220 2019. 6. 2. 15:00

  인터넷 주소에 대해 모르는 사람은 거의 없을 것이다. 이 인터넷 주소라는 것은 웹 브라우저를 통해 특정 사이트에 접근 할 때 사용한다. 그리고 이 사이트는 특정 서버에 위치하고 있다. 인터넷 환경을 사용하는 서버는 고유의 IP주소를 가지고 있다. 하지만, 우리는 숫자 정보를 활용하기 어렵기에 IP주소가 아닌 도메인 주소를 사용하게 되는 것이다. 결국 우리는 웹 브라우저에서 사이트 접속을 위해 도메인 주소를 입력해야하고 네트워크 상에서 이를 DNS(Domain Name System) 프로토콜로 제공하고 있다.


1. DNS (Domain Name System) 

  우리는 전세계 어디에 위치해있든, 어느 디바이스를 통하든 "www.google.co.kr"을 입력하면 동일한 화면이 출력 되어야 한다. 그래서 DNS는 전세계 인터넷 모든 사용자가 동일한 내용을 공유하고 있어야 한다. 사람마다 다른 DNS를 구축하고 있으면 같은 주소로 서로 다른 사이트를 보게되는 일이 발생한다. 그래서 DNS는 주로 네트워크 제공자인 통신사에서 제공하고, 신뢰성이 떨어지는 DNS를 사용하고 있다면 당장 버리는 것을 추천한다. 


  우리가 만약 네트워크 연결이 가능한 장비를 구매하게 된다면 통신사에서 알아서 DNS를 정해주기에 DNS 설정을 크게 신경 쓸 필요가 없다. 하지만, 우리가 필요에 따라 우리가 원하는 DNS로 바꿀 수도 있다. 


  [제어판] - [네크워크 및 공유 센터] - [어댑터 설정 변경]으로 들어가게 되면 이더넷이 기본적으로 나오고, Wi-Fi에 연결되어 있다면 무선 랜 정보도 나올 곳이다. 설정을 변경하기 원하는 인터넷 속성을 선택한다. 이더넷 기준으로 설명한다면 목록 중에서 '인터넷 프로토콜 버전 4(TCP/IPv4)의 속성을 선택한다면 임의로 DNS 설정을 바꿀 수 있다.


<Window 8 기준>





  만약 DNS 서버가 다운된다면 우리는 인터넷을 사용할 수 없게 된다. 이런 경우 해당 사이트의 IP 주소를 외우고 있어야 접속이 가능한데, 문제는 우리가 주로 접속하는 사이트의 대부분은 보안 문제로 인해 IP Direct Access를 막아놓았다. 그래서 DNS 서버가 나가면 실질적인 인터넷 사용은 불가능하다고 생각하면 된다.


  아래 주소는 구글의 DNS 서버 정보를 알 수 있는 주소다. 사이트 내용을 보면 나와있듯이 8.8.8.8 을 입력하면 구글 DNS를 사용할 수 있다.


구글 DNShttps://developers.google.com/speed/public-dns/


2. InetAddress 클래스

  Java에서 인터넷 주소를 담는 클래스는 InetAddress이다. 해당 클래스의 경우 Socket, ServerSocket, URL, DatagramSocket을 포함한 네트워킹 클래스에 모두 사용된다. 위의 개념들은 추후에 다시 설명할 기회가 있을 것이다.

  InetAddress 클래스의 가장 큰 특징은 생성자가 존재하지 않는다. 대신 URL을 IP주소로 변한하기 위해 DNS 서버에 연결을 하게 되는데, 정적 팩토리 메소드를 사용한다. 

  간단한 주소를 호출하는 InetAddress 클래스를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class MainClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try{
            InetAddress domain = InetAddress.getByName("www.google.com");
            System.out.println(domain);
 
        } catch (UnknownHostException e){
            System.out.println("Domain Missing");
        }
    }
 
}
 
cs



  언급했듯이 InetAddress Class는 생성자(Constructor)없이 바로 메소드를 사용하게 된다. 위 클래스는 도메인 주소를 입력해서 DNS를 통해 IP주소를 나타내는 방식이다. 


  


  반대로 IP주소를 입력해서 도메인을 얻을 수도 있다. 이때도 같은 getByName 메소드를 사용한다. 다만 이 경우 도메인 값을 출력하기 위해 getHosetName 메소드를 사용한다.


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class MainClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try{
            InetAddress ip = InetAddress.getByName("211.172.254.152");
            System.out.println(ip.getHostName());
 
        } catch (UnknownHostException e){
            System.out.println("IP Missing");
        }
    }
 
}
 
cs



  - InetAddress 메소드


 getByName()

  Parameter에 해당되는 InetAddress 클래스 리턴

 getHostName()

  InetAddress의 호스트 주소 리턴 (String)  

 getLocalHost()

  현재 실행중인 컴퓨터의 InetAddress 객체 리턴 

 getAddress()

  주소를 나타내는 4바이트 배열 리턴

 getHostAddress()

  IP주소를 마침표로 구분된 4자리 형식의 문자열로 반환 (String)

 getAllbyName()

  Parameter에 해당되는 모든 InetAddress 클래스 리턴



3. Get 메소드

  InetAddress에는 인터넷 주소를 반환하는 get 메소드가 존재한다 각각의 메소드를 어떻게 활용할 수 있는지 살펴보자.

3.1 getCanonicalHostName()

  getCanonicalHostName() 메소드는 DNS 자체에 대한 정보를 집중한다. 물론 getHostName() 메소드 역시 DNS의 정보를 출력하지만, 이 메소드는 좀더 DNS 자체가 가지고 있는 정보에 집중을 한다. 실제로 우리가 웹 브라우저를 통해 보는 DNS에는 프로토콜과 같은 고급 정보들이 존재하는데 getCanonicalHostName()로는 DNS가 가진 호스트 자체의 정보를 받고 싶을 떄 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class MainClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try{
            InetAddress ip = InetAddress.getByName("157.55.39.29");
            System.out.println(ip.getCanonicalHostName());
 
        } catch (UnknownHostException e){
            System.out.println("IP Missing");
        }
    }
 
}
 
cs


  위 코드의 실행결과는 다음과 같다.



3.2 getHostName()

  위 메소드는 현재 사용하고 있는 장바의 IP 주소 정보를 반환 한다. 해당 코드를 구동되고 있는 장비의 주소를 의미한다. 즉, 현재 필자가 사용하는 컴퓨터에서 저 코드를 실행하면 필자의 컴퓨터의 IP주소를 반환하고 다른 컴퓨터에서 실행하면 해당 컴퓨터의 IP 주소를 반환한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class MainClass {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        try{
            InetAddress LocalHost = InetAddress.getLocalHost();
            System.out.println(LocalHost.getHostAddress());
 
        } catch (UnknownHostException e){
            System.out.println("IP Missing");
        }
    }
 
}
 
 
cs

  보안상의 이유로 해당 코드의 결과값은 보여주지 않으니, 직접 자신의 장비의 IP 주소를 확인해 보는 것도 좋다. 내가 현재 접속하고 있는 네트워크의 주소를 나타내므로 만약 무선 인터넷을 사용하고 있다면 (Wi-Fi) 장소마다 값이 달라질 것이다.


4. 도달 가능성 검사하기

  Window 명령어에선 ping을 이용해 도달 가능성을 검사한다. 그렇다면 Java에서는 도메인 도달 가능성을 어떻게 구현하는지 알아보자. 


  해당 기능을 수행하는 메소드로는 isReachable()이 존재한다. 이 메소드를 사용하면 쉽게 도달 가능성을 검사할 수 있다. 하지만, 실제로 구현하면 원하는 결과가 잘 출력되지 않는데, 그 이유는 보안 문제가 발생하면서 라우터 작동, 프록시 서버, 방화벽, IP 접근 차단 등 변수가 너무 많다. 서버 IP까지 도달하는데 우린 거쳐가는 네트워크와 라우터가 무수히 많아서 그렇다.


  public boolean isReachable(int timeout) throws IOException


  public boolean isReachable(NetworkInterface interface, int ttl, int timeout) throws IOException


  

  isReachable 메소드는 Boolean으로 도달 가능성이 있다면 true를 반환하고 그렇지 않으면 false를 반환한다. timeout은 도달 가능성을 조사하는 시간이다. 해당 시간내에 IP에 도달하지 못하면 false를 반환한다.


  TTL (Time to Live)은 네트워크 용어중 하나로 Server 도달을 위한 최대 Hop을 의미한다. 홉이란 우리가 거쳐가야 할 네트워크 노드 수를 의미한다. 네트워크 전환이 일어날 떄마나 ttl값이 0으로 줄어들 것이고, 0이 된다면 도달 실패다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
 
public class MainClass {
 
    public static void main(String[] args) throws IOException {
        // TODO Auto-generated method stub
        
        try{
            InetAddress server = InetAddress.getByName("www.google.co.kr");
            System.out.println(server.isReachable(200));
 
        } catch (UnknownHostException e){
            System.out.println("Network Missing");
        }
    }
 
}
cs


  위 프로그램을 실행하면 True를 반환한다.