본문 바로가기

개인참고자료/자바(네트워크)

소켓

소켓

네트워크 프로그래밍에서 소켓이란 "사용자에게 네트워크에 접근할 수 있는 인터페이스를 제공해준다"라는 의미가 있다.

소켓을 사용하려면 소켓 생성(소켓 열기), 소켓을 통한 송신과 수신, 소켓 소멸(소켓 닫기)의 세가지 과정을 이해해야 한다.

소켓은 TCP와 UDP를 이용한 두가지 방법이 있으며 세가지 소켓 형식이 있다.

소켓은 유닉스 시스템에서 파일 입출려과 같은 방식으로 사용되도록 만들어져 있다. 유닉스 시스템은 파일을 입출력하기 위해서 다음과 같은 과정을 거친다.

파일 열기 → 파일 읽기/쓰기 → 파일 닫기

소켓도 위의 방식을 그대로 받아들여 다음과 같이 같은 방식으로 통신하도록 설계도었다.

소켓 열기 → 소켓을 통한 읽기/쓰기 → 소켓 닫기

소켓의 세 가지 형식

소켓의 세 가지 형식에는 SOCK_STREAM, SOCK_DGRAM, SOCK_RAW가 있다. 이중에서 SOCK_RAW는 자바에서 보안상 지원하지 않는다.

SOCK_STREAM : 바이트를 주고받을 수 있는 스트림(Stream) 통신을 구현할 수 있게 해주는 소켓으로 양방향 통신 가능하다.

SOCK_DGRAM : 데이터그램 통신용 소켓으로 SOCK_STREAM과 마찬가지로 양방향 통신이 가능하다.

SOCK_RAW를 이용하는 대표적인 프로그램으로 핑(Ping) 프로그램이 있다. 핑 프로그램은 주로 시스템이 존재하는지 알아내기 위한 목적으로 사용된다. 핑 프로그램은 ICMP(Internet Control Message Protocol)를 사용하는데, ICMP 패킷은 SOCK_RAW 형식의 소켓만 지원한다. 이런 이유로 자바에서는 제대로 된 핑 프로그램을 구현 할 수 없다.

SOCK_RAW의 경우는 좀더 높은 수준의 제어를 하고 싶은 사용자를 위한 것으로, 패킷(packet)을 전달할 때 패킷이 지나갈 경로까지도 지정할 수 있다. 이는 패킷을 받는 쪽에게 잘못된 경로의 패킷을 전송할 수도 있다는 것을 의미한다. 마치, 이미 접근을 허락 받는 클라이언트인 것처럼 잘못된 내용을 담아서 전송할 수 있다는 것이다. 이러한 이유로 보안상 문제가 발생할 수 있기 때문에 자바 언어 에서는 SOCK_RAW를 지원하지 않는다.

SOCK_STREAM 형식을 이용하는 통신 방법을 다른 말로 TCP(Tansfer Control Protocol)라고 하며, SOCK_DGRAM 형식을 이용하는 통신 방법은 UDP(User Datagram Protocol)라고 한다.

인터넷 주소와 포트

네트워크를 통해서 정보를 전송하고 수신하려면 소켓이 필요하다.

인터넷에서 유일한 컴퓨터를 구분하는 것은 인터넷 주소, 즉 IP다. IP를 이용하면 원하는 컴퓨터를 찾을 수 있다. 그렇지만 컴퓨터를 찾았다고 해서 올바른 통신을 할 수 있는 것은 아니다. 컴퓨터 안에는 프로세스 여러 개가 각자의 포트를 가지고 접속을 기다리고 있거나, 이미 통신을 하고 있기 때문이다.

하나의 컴퓨터에는 프로세스 여러 개들이 소켓으로 통신한다. 이때 각각의 소켓을 구분하기 위해서 포트를 사용하게 된다. 포트는 정수 값으로 되어 있는데, 0부터 1023까지의 숫자는 잘 알려진 포트(wellknown port)라고 해서 유명 프로그램(ftp, www 등)이 사용되도록 이미 정해진 포트며 일반 사용자는 1023포트를 이용하게 되어 있다.