[자바의 정석] Chapter15. 네트워킹(Networking)

개발자/자바 | 2015. 7. 26. 13:13

네트워킹(networking) 이란

두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다.

java.net 패키지를 사용하면 이러한 네트워크 어플리케이션의 데이터 통신 부분을 쉽게 작성할 수 있다.

간단한 네트워크 어플리케이션은 단 몇줄의 자바코드 만으로 작성 가능하다.


클라이언트/서버(client/server)

컴퓨터간의 관계를 역할로 구분하는 개념.

서버(server)는 서비스를 제공하는 컴퓨터 (service provider)

클라이언트(client)는 서비스를 사용하는 컴퓨터(service user)가 된다.

file server, mail server, application server 등..


네트워크를 구성할 때 전용서버를 두는 것을 서버기반모델(server-based model)이라고 하고, 

별도의 전용서버 없이 각 클라이언트가 서버역할을 동시에 수행하는것을  P2P모델 (peer-to-peer)이라 한다.


IP주소(IP address)

IP주소는 컴퓨터(호스트,host)를 구별하는데 사용되는 고유한 값으로 인터넷에 연결된 모든 컴퓨터는 IP주소를 갖는다.

IP주소는 4byte(32bit)의 정수로 구성되어 있으며, 4개의 정수가 마침표를 구분자로 표현된다.

네트워크 주소와 호스트 주소로 나눌수있는데,

32bit의  아이피 주소 중에 네트워크 주소와 호스트 주소가 각각 몇 bit를 차지하는 지는 네트워크를 어떻게 구성했는지에 따라 달라진다.


InetAddress

자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공하며, 다음과 같은 메소드가 정의되어있다.


URL이 유효하지 않으면 Malformed-URLException이 발생한다.

읽어올 데이터가 문자데이터이기 때문에 BufferedReader를 사용하였다.

openStream()을 호출해서 URL의  InputStream을 얻은 이후로는 파일로 부터 데이터를 읽는 것과 다르지 않다.

openStream()은 openConnection()을 호출해서  URLConnection을 얻은 다음 여기에 다시 getInputStream()을 호출한 것과 같다.


InputStream in = url.openStream();  


URLConnection conn = url.openConnection();

InputStream in = conn.getInputStream();



소켓 프로그래밍

소켓(socket)이란 프로세스 간의 통신에 사용되는 양쪽 끝단(endpoint)을 의미한다. 

서로 멀리 떨어진 두 사람이 통신하기 위해서 전화기가 필요한 것처럼, 프로세스간의 통신을 위해서느 그 무언가가 필요하고 그것이 바로 소켓이다.

자바에서는 java.net 패키지를 통해 소켓 프로그래밍을 지원하는데, 소켓 통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다.


TCP와 UDP

TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다.

TCP와 UDP 모두 TCP/IP 프로토콜에 포함되어 있으며 OSI 7계층의 전송계층(Transport layer)에 해당하는 프로토콜이다.


TCP (관련 클래스 : Socket, ServerSocket)

: 연결기반 (Connection-oriented)

- 연결 후 통신 (전화기)

- 1:1 통신방식

: 데이터의 경계를 구분안함(byte-stream)

: 신뢰성 있는 데이터 전송

- 데이터의 전송순서가 보장됨.

- 데이터의 수신여부를 확인함. (데이터가 손실되면 재전송됨)

- 패킷을 관리할 필요가 없음.

: UDP보다 전송속도가 느림.


UDP (관련클래스: DatagramSocket, DatagramPacket, MulticastSocket)

: 비연결 기반

- 연결없이 통신(소포)

- 1:1, 1:n, n:n 통신방식

: 데이터의 경계를 구분함(datagram)

: 신뢰성 없는 데이터 전송

- 데이터의 전송순서가 바뀔수 있음.

- 데이터의 수신여부를 확인안함. (데이터가 손실되어도 알 수 없음)

- 패킷을 관리해주어야 함.

: TCP 보다 전송속도가 빠름.


TCP 소켓 프로그래밍

1. 서버프로그램은 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다.

2. 클라이언트 프로그램은 접속한 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다.

3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.

4. 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다.


서버소켓(ServerSocket)은 포트와 결합(bind)되어 포트를 통해 원격 사용자의 연결요청을 기다리다가 연결요청이 올 때마다 새로운 소켓을 생성하여 상대편 소켓과 통신할 수 있도록 연결된다.

서버소켓은 포트를 독점한다.


포트(port)는 호스트(컴퓨터)가 외부와 통신하기 위한 통로로 하나의 호스트가 65536개의 포트를 가지고 있으며 포트는 번호로 구별된다.

1023번 이하 포트는 기존 다른 통신 프로그램들에 의해 사용되는 경우가 많다. 


서버소켓은은 소켓간의 연결만 처리, 실제 데이터는 소켓들끼리 서로 주고 받는다.

소켓들이 데이터를 주고 받는 연결통로는 바로 입출력스트림이다.


소켓은 2개의 스트림, 입력스트림과 출력스트림을 가지고 있으며, 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결된다.


: Socket - 프로세스간의 통신을 담당하며, InputStreamOutputStream을 가지고 있다.

: ServerSocket - 포트와 연결(bind)되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다. 

한 포트에 하나의 ServerSocket만 연결할 수 있다. (프로토콜이 다르면 같은 포트를 공유할 수 있다.)








,