07. 네트워크 프로그래밍 기초 01. 소켓이란

1. 소켓의 세 가지 형식

SOCK_STREAM, SOCK_DGRAM, SOCK_RAW가 있다. 이 중에서 SOCK_RAW는 자바에서 보안상 지원하지 않는다.

SOCK_STREAM : 바이트를 주고 받을 수 있는 스트림(Stream) 통신을 구현할 수 있게 해주는 소켓으로 양방향 통신이 가능하다. SOCK_DGRAM : 데이터그램 통신용 소켓으로 SOCK_STREAM과 마찬가지로 양방향 통신이 가능하다. SOCK_RAW : RAW 방법을 이용하는 대표적인 프로그램으로는 핑(PING)이 있다. 핑은 내부적으로 ICMP(Internet Control Message Protocol)을 사용하는데, ICMP 패킷은 SOCK_RAW 형식의 소켓만을 지원한다. 이런 이유로 자바에서는 제대로 된 핑 프로그램을 구현할 수 없다. 대부분의 자바 기반 핑 프로그램은 흉내 내기일 뿐이다. SOCK_RAW의 경우 좀더 높은 수준의 제어를 하고 싶은 사용자를 위한 것으로, 패킷(Packet)을 전달할 때 패킷이 지나갈 경로까지도 지정할 수 있다. 이는 패킷을 받는 쪽에서 잘못된 경로의 패킷을 전송할 수도 있다는 것을 의미한다. 마치, 이미 접근을 허락 받은 클라이언트인 것처럼 잘못된 내용을 담아서 전송할 수 있다는 것이다. 이러한 이유로 보안상 문제가 발생할 수 있기 때문에 자바에서는 SOCK_RAW를 지원하지 않는다.

SOCK_STREAM 형식을 이용하는 통신 방법을 다른 말로 TCP(Transfer Control Protocol)이라고 한다.

SOCK_DGRAM 형식을 이용하는 통신 방법은 UDP(User Datagram Protocol)이라고 한다.

2. 인터넷 주소와 포트

02. InetAddress 클래스를 활용한 도메인과 IP 변환

java.net 패키지에는 IP와 관련된 중요한 클래스가 있다. InetAddress는 도메인 주소를 IP 주소를 변환하거나 반대로 IP 주소를 도메인 주소를 변경할 수 있으며, 문자열이나 바이트 배열 형태로 IP 주소에 대한 정보를 얻을 수도 있다. 또한 현재 컴퓨터의 이름도 구할 수 있다.

1. InetAddress 클래스를 이용한 nslookup 명령 구현

import java.net.*;

public class NSLookup
{
    public static void main(String[] args)
    {
        if(args.length != 1)
        {
            System.out.println("IP address or Host name is input args");
            System.exit(0);
        }

        InetAddress inetaddr[] = null;

        try{
            inetaddr = InetAddress.getAllByName(args[0]);
        }catch(UnknownHostException e){
            e.printStackTrace();
        }
        for(int i = 0 ; i < inetaddr.length ; i ++)
        {
            System.out.println(inetaddr[i].getHostName());
            System.out.println(inetaddr[i].getHostAddress());
            System.out.println(inetaddr[i].toString());
            System.out.println("--------------------------");
        }
    }
}

2. InetAddress 클래스를 이용한 로컬 컴퓨터명과 IP 구하기

import java.net.*;

public class NSLookupLocal
{
    public static void main(String[] args)
    {
        InetAddress inetaddr = null;
        try{
            inetaddr = InetAddress.getLocalHost();
        }catch (UnknownHostException e){
            e.printStackTrace();
        }

        System.out.println(inetaddr.getHostName());
        System.out.println(inetaddr.getHostAddress());

        System.out.println("byte[] ip print");
        byte[] ip = inetaddr.getAddress();
        for(int i = 0; i < ip.length; i++)
        {
            System.out.print((int)ip[i]);
            if(i != ip.length -1)
                System.out.print(".");
        }
    }
}

출처 : 김성박 송지훈 공저, 『 자바 IO & NIO 네트워크 프로그래밍』, 한빛미디어(2004.9.30), 7장 인용.