4. Internet Address

인터넷 주소

  • 인터넷에 연결된 장치 : 노드(node), 노드가 컴퓨터인 경우 해당 노드 : 호스트 각 노드나 호스트는 인터넷 주소 또는 IP 주소라고 불리는 최 소 하나의 고유한 숫자에 의해 식별됨.

  • IPv4

    • 0에서 255까지의 범위를 표현할 수 있음.

    • 각 바이트는 마침표로 구분됨(ex : 152.19.134.132) → 4자리 표기법(dotted quad format)

  • IPv6

    • 4자리 16진수의 8개의 블록으로 구성됨.

    • 콜론에 의해 구분됨. ex) 2400:cb00:2048:0001:0000:0000:6ca2:c665

  • DNS(Domain Name System)

    • 사람들이 쉽게 기억할 수 있는 호스트네임(hostname)을 컴퓨터가 기억하는 152.19.134.132와 같은 주소로 연결

InetAddress 클래스

  • IPv4, IPv6 주소에 대한 자바의 고수준 표현 방식.

  • Socket, ServerSocket, URL, DatagramSocket, DatagramPacket 등을 포함한 대부분의 다른 네트워킹 클래스에 의해 사용됨. hostname과 IP address를 모두 포함하고 있음.

  • InetAddress 객체 생성하기

    • getByName() 메서드

      • 도메인 주소로 IP검색

      • IP주소로 호스트네임 검색

      @Test
          void InetAddress_test() throws UnknownHostException {
              InetAddress res1 = InetAddress.getByName("<https://www.jungsuri.site>");
              InetAddress res2 = InetAddress.getByName("43.202.139.42");
      
              log.info("InetAddress1 : " + res1);
              log.info("InetAddress2 : " + res2.getHostName());
          }
      
      //InetAddress1 : <https://www.jungsuri.site/43.202.139.42>
      //InetAddress2 : ec2-43-202-139-42.ap-northeast-2.compute.amazonaws.com
    • getLocalHost() 메서드

      InetAddress res3 = InetAddress.getLocalHost();
      log.info("InetAddress3 : " + res3);
      
      //InetAddress3 : MacBook-Pro.local/127.0.0.1
    • getAllByName() 메서드

      • 호스트에 대한 정보가 모두 필요하면 getByName()(여러개중 어느것을 반환할지 모름)이 아닌 getAllByName()을 사용

      InetAddress[] res4 = InetAddress.getAllByName("www.naver.com");
      for (int i = 0; i < res4.length; i++) {
                  log.info("InetAddress4 : " + res4[i]);
      }
      
      //InetAddress4 : www.naver.com/223.130.195.95
      //InetAddress4 : www.naver.com/223.130.200.104

  • 캐시

    DNS(lookup)검색은 최종 쿼리 서버에 도착하기까지 여러 서버를 거쳐야하고 손실이 될 수 있어 비용이 많이 드는 명령에 해당함. 그래서 cache하여 저장함

    InetAddress클래스는 특정 호스트에 대한 주소를 검색하여 저장한 다음에는 추가 요청에 대해서 다시 검색하지 않는다.

    만약 처음에 호스트를 찾지 못해 에러가 발생하는 등 타임아웃으로 인해 검색에 실패하면 두번째에는 캐시에 저장된 값을 이용한다.

    • networkaddress.cache.ttl : 성공한 DNS 쿼리에 대해 자바가 저장할 시간을 초단위로 설정

    • networkaddress.cache.negative.ttl : 실패한 DNS 쿼리에 대해 자바가 저장할 시간을 초단위로 설정

    • 저장 시간 내에 같은 호스트에 대해 검색을 다시 시도할 경우 항상 같은 값이 반환 (캐시에 저장된 값이 계속 반환 되는 것)

    • networkaddress.cache.negative.ttl에 -1 을 설정하면 time-out 없이 영원히 저장.

  • IP 주소로 검색하기

    InetAddress.*getByName*("43.202.139.42") 는 InetAddress 객체를 생성할 뿐이다. 실제 hostname을 얻기위한 DNS 검색은 res2.getHostName() 을 요청할 때만 수행된다.

    또한 hostname 을 사용하는 것이 IP 를 직접 사용하는 것보다 좀 더 안정적이다. 일반적인 서비스들은 서비스를 제공하는 동안 hostname 이 변경되는 일은 잘 발생하지 않지만 그에 비해 서비스 중에 IP가 변경되는 일은 드물지 않게 발생한다고 한다.

  • 보안 이슈

    hostname 으로부터 새로운 InetAddress객체를 생성하는 일은 DNS검색(lookup)을 필요로 하기 때문에 잠재적인 보안 문제에 노출되어 있다.

    SecurityManagerpublic void checkConnect(String host, int port)

    • port 에 0이상의 숫자를 입력하면 해당 포트에 접속이 가능한지 체크

    • port = -1 을 넣으면 DNS 검색이 가능한지 체크

  • Get 메서드

    • hostname을 문자열로 반환하고 IP 주소를 문자열과 바이트 배열로 반환하는 네개의 Get 메서드를 제공한다.

    • byte 배열에서 127보다 큰 값은 음수로 다뤄짐. 바이트 배열로 어떤 작업을 해야할 경우 byte를 int로 늘린 후 처리해야함

    int unsignedByte = signedByte < 0 ? signedByte + 256 : signedByte;

  • 주소 타입

    몇몇 IP 주소와 몇몇 주소 패턴은 특별한 의미를 가지고 있음.

    ex)

    • 127.0.0.1 : 로컬 루프백 주소,

    • 224.0.0.0 ~ 239.255.255.255 : 몇몇 등록된 호스트에게 동시에 전송하기 위한 멀티캐스트 주소로 사용

    InetAddress 객체가 어느 타입의 주소에 속하는지 검사하기 위한 10개의 메서드를 제공함.

Last updated