Internet Address
노드 / 호스트
IP 주소
- 각각의 노드나 호스트를 구분하는 고유한 숫자
- IP 주소로 인터넷 호스트 구별, 인터넷 주소, 호스트 주소라고도 함
IPv4
- 4개의 Unsigned Byte (0~255) 로 이루어짐
- 4바이트 32비트
- 예 : 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) 하지만, 그 이상은 매우 어렵다.
- 문자는 길어도 잘 기억함
- Host Name
DNS (Domain Name Service)
java.net.InetAddress
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
예제 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 을 발생시킴
- 존재하는 주소인가 확인할 때 유용