InetAddress_Java

koeyhoyh·2021년 12월 8일
0
post-thumbnail

Internet Address

노드 / 호스트

  • 노드 (Node) : 인터넷에 연결되어 있는 장치

  • 호스트 (Host) : 장치 중 컴퓨터를 의미

IP 주소

  • 각각의 노드나 호스트를 구분하는 고유한 숫자
  • IP 주소로 인터넷 호스트 구별, 인터넷 주소, 호스트 주소라고도 함

IPv4

  • 4개의 Unsigned Byte (0~255) 로 이루어짐
    - 4바이트 32비트
    • 각 바이트는 점(.) 으로 구별
      • Dotted Quad address
  • 예 : 152.19.132.145

IPv6

  • 16바이트 128비트
    - IPv4 의 4배의 길이

  • 8개의 블록으로 구성
    - 한 블록은 2 바이트

    • 4자리 Hexadecimal (16진수) 숫자
  • 블록은 Colon: 로 구분

  • 예 : 2400:cb00:2048:0001:0000:0000:6ca2:c524

  • Leading Zero 생략 가능
    - 2400:cb00:2048:0001:0000:0000:6ca2:c665 -> 2400:cb00:2048:1:0:0:6ca2:c665

  • :: (Double Colon) 은 복수의 Zero block
    - 2001:4860:4860:0000:0000:0000:0000:8888 -> 2001:4860:4860::8888

  • 마지막 4바이트를 Dotted Quad address로
    - FEDC:BA98:7654:3210:FEDC:BA98:7654:3210 -> FEDC:BA98:7654:3210:FEDC:BA98:118.84.50.16

Host Name

  • 제한된 인간 기억
    - 사람은 7개 숫자까지는 잘 기억 (+- 2) 하지만, 그 이상은 매우 어렵다.
    • IP Address 는 인간이 기억하기 불편
  • 문자는 길어도 잘 기억함
    - Host Name
    • 예 : "www.jnu.ac.kr"

DNS (Domain Name Service)

  • Host Name 을 IP Address 로 변환해 주는 서비스

  • 하나의 Host Name 에 여러 개의 IP Address 매핑 가능

  • Multi-homed Host

java.net.InetAddress

  • 자바 네트워크 프로그램에서 IP 주소를 표현하는 클래스
    - public final class InetAddress extends Object implements Serializable{}

    	- 자바에서 사용할 수 있도록 IP 주소를 캡슐화 한 것으로 대부분의 자바 네트워크 관련 클래스는 주소로서 이 객체를 사용
    • 인터넷 주소를 나타내는 2개의 내장 필드에 의해 주소 관리 그러나 non-public
      • hostName -> www.jnu.ac.kr 과 같이 호스트 이름을 저장
        • address -> 32 비트 IP 주소를 저장

InetAddress 객체 만들기

  • InetAddress 클래스에는 public 생성자가 없다.
    - InetAddress address = new InetAddress(); // X

getByName()

  • 정적 Factory 메소드
  • public static InetAddress getByName(String hostName) throws UnknownHostException
    - 인자가 문자열로 된 호스트 이름
    • 사용 방법 :
      • java.net.InetAddress addr = java.net.InetAddress.getByName("www.oreilly.com");
  • 이 메소드는 실제로 네트워크를 통해 로컬 DNS 서버와 연결되어 호스트명에 해당하는 숫자 주소를 가져온다.
    - DNS 서비스를 받아 해당 호스트의 IP 주소를 찾아 객체를 만들어 반환
  • 이에 따라 다음과 같은 예외 상황이 발생할 수 있다.
    - DNS 의 연결 거절
    • DNS 서버가 주소를 찾지 못하면 UnknownHostException 발생
    • PPP 나 SLIP dial-up 을 통해 네트워크 연결을 확보하는 호스트일 경우 아직 연결이 확보되지 않은 상황에서 이 메소드가 호출되면 네트워크 연결을 시도하게 됨

예제 4-1

  • getByName() 메소드를 호출하고 리턴 받은 객체를 인쇄
    - 즉 toString() 호출
    • Host name/ip addr 형식으로 인쇄됨
import java.net.*;

public class OReillyByName {

  public static void main (String[] args) {
    try {
      InetAddress address = InetAddress.getByName("www.jnu.ac.kr");
      System.out.println(address);
    } catch (UnknownHostException ex) {
      System.out.println("Could not find www.jnu.ac.kr");
    }
  }
}

인자로 Dotted IP address 를 사용하는 getByName()

  • IP 주소를 인자로 getByName() 호출
  • IP 주소로 호스트명 검색 가능

  • - InetAddress address = InetAddress.getByName("208.201.239.100");
    • System.out.println(address.getHostName());
    • 그렇지만 dotted quad string 으로 호스트 이름이 찾아지지 않는 경우 호스트 이름은 그냥 dotted quad string 이 되고 UnknownHostException 도 발생하지 않는다.

getAllByName()

  • public static InetAddress[] getAllByName(String hostName) throws UnknownHostException
    - 호스트의 이름을 인자로 받아 들여 대응하는 모든 주소로 이루어진 배열을 리턴
    • www.microsoft.com 처럼 하나의 도메인 이름에 여러 개의 IP 주소를 가진 사이트를 처리할 때 사용
    • 사용 방법
      • InetAddress[] addresses = InetAddress.getAllByName("www.apple.com");
        • 하나의 호스트 이름에 여러 개의 IP가 있을 경우 모두 찾음
    • 호스트를 찾을 수 없을 경우 UnknownHostException 발생

예 :

try {
	InetAddress[] addresses = InetAddress.getAllByName("www.oreilly.com");
	for (InetAddress address: addresses) {
		System.out.println(address);
	}
} catch (UnknownHostException e) {
	System.out.println("Could not find www.oreilly.com");
}

결과 :

www.oreilly.com/114.108.166.66
www.oreilly.com/114.108.166.35

getLocalHost

  • public static InetAddress InetAddress.getLocalHost() throws UnknownHostException

    	- 현재 이 메소드가 실행되고 있는 호스트에 대한 InetAddress 객체를 리턴
    • DNS 연결 처리

예제 4-2

import java.net.*;

public class MyAddress {

	public static void main (String [] args) {
    try {
    	InetAddress address = InetAddress.getLocalHost();
        System.out.println(address);
        } catch (UnknownHostException ex) {
        System.out.println("Could not find this computer's address.");
        }
    }
}
  • 네트워크가 연결되어 있지 않고 IP 주소가 없으면 Loopback 주소가 리턴됨
    - Host Name = localhost
    • IP Address = 127.0.0.1
      • 컴퓨터의 네트워크 입출력 기능을 시험하기 위하여 가상으로 할당한 인터넷 주소
        • 실제로는 외부 네트워크에 연결되어 있지 않은 소프트웨어적 입출력 주소로서 이 주소로 발송된 데이터들은 되돌아서 다시 이 주소에서 수신된 것처럼 동작한다.
        • 웹 서버나 인터넷 소프트웨어의 네트워크 동작 기능을 시험하는 데 사용된다.

참고

  • 다음 두 명령의 차이점은?
    - System.out.println(InetAddress.getLocalHost());
    • System.out.println(InetAddress.getByName("localhost"));
  • 처리 결과
    - InetAddress.getLocalHost() 에 의해서는 user-PC/168.131.151.61 출력
    • InetAddress.getByName("localhost") 에 의해서는 localhost/127.0.0.1 출력

getByAddress()

  • 숫자로 IP 주소를 알고 있으면 DNS 에 의존하지 않고 InetAddress 객체를 생성할 수 있다.
    - public static InetAddress InetAddress.getByAddress(byte[] addr) throws UnknownHostException
    • public static InetAddress InetAddress.getByAddress(String host byte[] addr) throws UnknownHostException
  • 이 메소드들을 이용하여 존재하지 않거나 검색될 수 없는 호스트에 대한 InetAddress 객체를 생성할 수 있다.
    - 첫 메소드는 인자로 제시된 IP 주소를 가지고 호스트명은 가지지 않은 InetAddress 객체 생성
    • 두 번째 메소드는 인자로 제시된 IP 주소와 호스트명을 가진 InetAddress 객체 생성

예 : getByAddress() 호출

  • 주소 107.23.216.197 으로 InetAddress 를 생성
    - byte[] address = {107, 23, (byte)216, (byte)196};
    • InetAddress lessWrong = InetAddress.getByAddress(address);
    • InetAddress lessWrongWithName = InetAddress.getByAddress("lessWrong.com", address);
    • 이 메소드는 그런 호스트가 존재하는가 보장하지 않음
    • 단순히 바이트 배열이 4 또는 16 바이트 길이인가 확인하여 아니면 UnknownHostException 을 발생시킴
    • 존재하는 주소인가 확인할 때 유용
profile
내가 만들어낸 것들로 세계에 많은 가치를 창출해내고 싶어요.

0개의 댓글