자바의정석 ch16

soso·2023년 3월 5일
0
post-thumbnail

Chapter16 네트워킹

네트워킹(networking)이란?

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

초기의 네트워크는 단 몇 대의 컴퓨터로 구성되었으나 지금은 전 세계의 셀 수도 없을 만큼 많은 수의 컴퓨터가 인터넷이라는 하나의 거대한 네트워크를 구성하고 있으며, 인터넷을 통해 다양하고 방대한 양의 데이터를 공유하는 것이 가능해졌다.

클라리언트와 서버(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주소는 4 byte(32 bit)의 정수로 구성되어 있으며, 4개의 정수가 마침표를 구분자로 'a.b.c.d'와 같은 형식으로 표현된다.

IP주소는 다시 네트워크주소와 호스트주소로 나눌 수 있는데, 32 bit(4 byte)의 IP주소 중에서 네트워크주소와 호스트주소가 각각몇 bit를 차지하는 지는 네트워크를 어떻게 구성하 였는지에 따라 달라진다.

그리고 서로 다른 두 호스트의 IP주소의 네트워크주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미한다.

InetAddress클래스

URL(Uniform Resource Locator)

URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것으로 프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조'의 형태로 이루 어져 있다.

http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
프로토콜 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약(http)
호스트명 자원을 제공하는 서버의 이름(www.codechobo.com)
포트번호 통신에 사용되는 서버의 포트번호(80)
경로명 접근하려는 자원이 저장된 서버상의 위치(/sample/)
파일명 접근하려는 자원의 이름(hello.html)
쿼리(query) URL에서 '?'이후의 부분(referer=codechobo)
참조(anchor) URL에서 '#이후의 부분(index1)

URL클래스

URLConnection클래스

URLConnection은 어플리케이션과 URL간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상클래스이다.
URLConnection을 상속받아 구현한 클래스로는 HttpURLConnection과 JarURLConnection이 있으며 URL의 프로토콜이 http프로토콜이라면 openConnection()은 HttpURLConnection을 반환한다.

URLConnection을 사용해서 연결하고자하는 자원에 접근하고 읽고 쓰기를 할 수 있다.

그 외에 관련된 정보를 읽고 쓸 수 있는 메서드가 제공된다.

소켓(socket) 프로그래밍

소켓 프로그래밍은 소켓을 이용한 통신 프로그래밍을 뜻하는데,
소켓(socket)이란 프로세스 간의 통신에 사용되는 양쪽 끝단(endpoint)을 의미한다.

프로세스간의 통신을 위해서는 무언가가 필요하고 그 것이 바로 소켓이다.
자바에서는 java.net패키지를 통해 소켓 프로그래밍을 지원하는데, 소켓통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다.

TCP와 UDP

TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다.
TCP와 UDP 모두 TCP/IP 프로토콜(TCP/IP protocol suites)에 포함되어 있으며, OSI 7계 층의 전송계층(transport layer)에 해당하는 프로토콜이다.

TCP와 UDP는 전송 방식이 다르며, 각 방식에 따른 장단점이 있다.
TCP는 데이터를 전송하기 전에 먼저 상대편과 연결을 한 후에 데이터를 전송하며 잘 전송되었는지 확인하고 전 송에 실패했다면 해당 데이터를 재전송하기 때문에 신뢰 있는 데이터의 전송이 요구되는 통 신에 적합하다.

UDP는 상대편과 연결하지 않고 데이터를 전송하며, 데이터를 전송하지만 데이터가 바르게 수신되었는지 확인하지 않기 때문에 데이터가 전송되었는지 확인할 길이 없고 데이터를 보낸 순서대로 수신한다는 보장이 없다.
대신 이러한 확인과정이 필요하지 않기 때문에 TCP에 비해 빠른 전송이 가능하다.

TCP소켓 프로그래밍

TCP소켓 프로그래밍은 클라이언트와 서버간의 일대일 통신이다.
서버 프로그램과 클라이언트 프로그램간의 통신과정을 단계별로 보면 다음과 같다

  1. 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결요청을 처리할 준비를 한다.
  2. 클라이언트 프로그램은 접속할 서버의 IP주소와 포트 정보를 가지고 소켓을 생성해서 서버에 연결을 요청한다.
  3. 서버소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해서 클라이언트의 소켓과 연결되도록 한다.
  4. 이제 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버소켓과 관계없이 일대일 통신을 한다.

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

실제적인 데이터 통신은 서버소켓과 관계없이 소켓과 소켓간에 이루어진다.

여러 개의 소켓이 하나의 포트를 공유해서 사용할 수 있지만, 서버소켓은 다르다. 서버소켓은 포트를 독점한다.

만일 한 포트를 둘 이상의 서버소켓과 연결하는 것이 가능하다면 클라이 언트 프로그램이 어떤 서버소켓과 연결되어야하는지 알 수 없을 것이다.

Socket와 ServerSocket

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

소켓들이 데이터를 주고받는 연결통로는 바로 입출력스트림이다.
소켓은 두 개의 스트림, 입력스트림과 출력스트림을 가지고 있으며, 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결된다.

한 소켓의 입력스트림은 상대편 소켓의 출력스트림 과 연결되고, 출력스트림은 입력스트림과 연결된다. 그래서 한 소켓에서 출력스트림으로 데 이터를 보내면 상대편 소켓에서는 입력스트림으로 받게 된다.

Socket 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있다.
이 두 스트림을 통해 프로세스간의 통신(입출력) 이 이루어진다.
ServerSocket
포트와 연결(bind) 되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해서 소켓과 소켓간의 통신이 이루어지도록 한다.
한 포트에 하나의 ServerSocket만 연결할 수 있다.
(프로토콜이 다르면 같은 포트를 공유할 수 있다.)

UDP소켓 프로그래밍 -Client

UDP소켓 프로그래 밍에서는 DatagramSocket과 DatagramPacket을 사용한다. UDP는 연결지향적인 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않다.

UDP통신에서 사용하는 소켓은 DatagramSocket이며 데이터를 Data gramPacket에 담아서 전송한다.
DatagramPacket은 헤더와 데이터로 구성되어 있으며, 헤더에는 수신할 호스트의 정보(호스트의 주소와 포트)가 저장되어 있다.

그래서 DatagramPacket을 전송하면 DatagramPacket에 지정된 주소(호스트의 포트)의 DatagramSocket에 도착한다.

profile
오늘의 기록

0개의 댓글