Chapter 16. 네트워킹
05 Feb 2022 | 자바의 정석 JAVA1. 네트워킹(Networking)
- 네트워킹(networking): 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 의미
- java.net 패키지를 사용하면 네트워크 어플리케이션의 데이터 통신 부분을 쉽게 작성 가능
1.1 클라이언트/서버(client/server)
-
서버는 서비스를 제공하는 컴퓨터이고, 클라이언트는 서비스를 사용하는 컴퓨터를 의미
-
서비스는 서버가 클라이언트로부터 요청받은 작업을 처리하여 그 결과를 제공하는 것을 의미
- 서버가 제공하는 서비스의 종류에 따라 파일 서버(file server), 메일서버(mail server), 어플리케이션 서버(application server) 등이 있음
-
서버에 접속하는 클라이언트의 수에 따라 하나의 서버가 여러 가지 서비스를 제공하기도 하고 하나의 서비스를 여러 대의 서버로 제공하기도 함
-
서버가 서비스를 제공하기 위해선 서버 프로그램이 있어야 하고 클라이언트가 서비스를 제공받기 위해서는 서버 프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 함
- 웹섭버에 접속하여 정보를 얻기 위해서는 웹브라우저(클라이언트 프로그램)가 있어야 하고, FTP 서버에 접속해 파일을 전송받기 위해서는 알FTP와 같은 FTP 클라이언트 프로그램이 필요
-
네트워크를 구성할 때 전용서버를 두는 것을 서버기반모델(server-based model)이라하고 별도의 전용서버없이 각 클라이언트가 서버 역할을 동시에 수행하는 것을 P2P(peer-to-peer) 모델이라고 함
서버기반 모델 P2P 모델 - 안정적인 서비스 제공이 가능
- 공유 데이터의 관리와 보안이 용이
- 서버구축비용과 관리비용이 듦- 서버구축 및 운용비용 절감 가능
- 자원의 활용을 극대화할 수 있음
- 자원의 관리가 어려움
- 보안이 취약함
1.2 IP 주소 (IP address)
- 컴퓨터(호스트. host)를 구별하는데 사용되는 고유한 값으로 인터넷에 연결된 모든 컴퓨터는 IP 주소를 가짐
- 4byte의 정수로 구성되어 있으며, 4개의 정수가 마침표를 구분자로 표현됨
- 네트워크 주소와 호스트 주소로 나눌 수 있음
- 네트워크 주소와 호스트 주소가 각각 몇 bit를 차지하는지는 네트워크를 어떻게 구헝하였는지에 따라 달라짐
- 서로 다른 두 호스트의 IP 주소의 네트워크 주소가 같다는 것은 두 호스트가 같은 네트워크에 포함되어 있다는 것을 의미
- IP 주소에서 네트워크 주소가 차지하는 자리수가 많을수록 호스트 주소의 범위가 줄어들기 때문에 네트워크의 규모가 작아짐
- 호스트 주소가 0인 것은 네트워크 자신을 나타내고, 255는 브로드캐스트 주소로 사용되기 때문에 실제로 네트워크에 포함 가능한 호스트 개수는 254개
- IP 주소와 서브넷 마스크를 ‘&’ 연산을ㄹ 수행하면 네트워크 주소를 얻어낼 수 있어 서로 다른 두 호스트의 IP 주소를 서브넷 마스크로 ‘&’ 연산을 수행해 비교하면 두 호스트가 같은 네트워크 상에 존재하는지를 쉽게 확인할 수 있음
InetAddress
- IP 주소를 다루기 위한 클래스
1.4 URL(Uniform Resource Locator)
-
인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것
-
‘프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조‘의 형태로 구성됨
http://www.codechobo.com:80/sample/hello.html?referer=codechobo#index1
프로토콜 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약 (http)
호스트명 자원을 제공하는 서버의 이름 (www.codechobo.com)
포트번호 통신에 사용되는 서버의 포트번호 (80)
경로명 접근하려는 자원이 저장된 서버상의 위치 (/sample/)
파일명 접근하려는 자원의 이름 (hello.html)
쿼리(query) URL에서 ‘?’이후의 부분 (refer = codechobo)
참조(anchor) URL에서 ‘#’이후의 부분 (index)
-
URL을 다루기 위한 클래스로 URL 클래스를 제공
URLConnection
- 어플리케이션과 URL 간의 통신연결을 나타내는 클래스의 최상위 클래스로 추상 클래스임
- URLConnection을 상속받아 구현한 클래스로는 HttpURLConnection과 JarURLConnection이 있음
- URL 프로토콜이 http 프로토콜이라면 openConnection()은 Http URLConnection을 반환
- URLConnection을 사용해 연결하고자하는 자원에 접근하고 읽고 쓰기를 할 수 있음
2. 소켓 프로그래밍
- 소켓(socket): 프로세스간의 통신에 사용되는 양쪽 끝단(endpoint)을 의미
- java.net 패키지를 통해 소켓 프로그래밍을 지원. 소켓통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현해 제공
2.1 TCP와 UDP
-
TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합
-
TCP와 UDP 모두 TCP/IP 프로토콜에 포함되어 있으며, OSI 7계층의 전송계층에 해당하는 프로토콜
-
TCP와 UDP는 전송 방식이 다름
출처: https://shjz.tistory.com/98
-
TCP를 이용한 통신은 전화에, UDP를 이용한 통신은 소포에 비유됨
- TCP는 데이터를 전송하기 전에 먼저 상대편과 연결을 한 후에 데이터를 전송하며 잘 정송되었는지 확인하고 전송에 실패했다면 해당 데이터를 재전송하기 때문에 신회있는 데이터의 전송이 요구되는 통신에 적합 (EX. 파일을 주고받는 경우)
- UDP는 상대편과 연결하지 않고 데이터를 전송하며, 데이터를 전송하지만 데이터가 바르게 수신되었는지 확인하지 않기 때문에 데이터가 전송되었는지 확인할 길이 없음. 또한 데이터를 보낸 순서대로 수신한다는 보장이 없음. 하지만 확인 과정이 필요하지 않기 때문에 TCP에 비해 빠른 전송이 가능 (EX. 게임이나 동영상의 데이터를 전송하는 경우, 데이터가 중간에 손실되어 좀 끊기더라도 빠른 전송이 필요한 경우)
2.2 TCP 소켓 프로그래밍
-
TCP 소켓 프로그래밍은 클라이언트와 서버 간의 일대일 통신
-
서버 프로그램이 실행되어 클라이언트 프로그램의 연결 요청을 기다리고 있어야 함
-
서버 프로그램과 클라이언트 프로그램간의 통신 과정
- 서버 프로그램에서는 서버소켓을 사용해서 서버 컴퓨터의 특정 포트에서 클라이언트의 연결 요청을 처리할 준비를 함
- 클라이언트 프로그램은 접속할 서버의 IP 주소와 포트 정보를 가지고 소켓을 생성해 서버에 연결을 요청
- 서버 소켓은 클라이언트의 연결요청을 받으면 서버에 새로운 소켓을 생성해 클라이언트의 소켓과 연결되도로 ㄱ함
- 클라이언트의 소켓과 새로 생성된 서버의 소켓은 서버 소켓과 관계없이 일대일 통신을 함
- 서버소켓은 포트와 결합되어 포트를 통해 원격 사용자의 연결요청을 기다리다 연결요청이 올 때마다 새로운 소켓을 생성해 상대편 소켓과 통신할 수 있도록 연결함
- 실질적인 데이터 통신은 서버소켓과 관계없이 소켓과 소켓 간에 이루어짐
-
여러 개의 소켓이 하나의 포트를 공유해서 사용할 수 있지만, 서버소켓은 포트를 독점
- 한 포트를 둘 이상의 서버소켓과 연결하는 것이 가능하다면 클라이언트 프로그램이 어떤 서버소켓과 연결되어야 하는지 알 수 없을 것
-
포트는호스트가 외부와 통신을 하기 위한 통로로 하나의 호스트가 65536개의 포트를 가지고 있으며 포트는 번호로 구별됨
- 포트의 번호는 0 ~ 65535의 범위에 속하는 값
- 일반적으로 1023번 이하의 포트는 FTP나 Telnet과 같은 기존의 통신 프로그램들에 의해 사용되는 경우가 많아 1023번 이상의 번호 중 사용하지 않는 포트를 골라서 사용해야 함
-
서버소켓은 소켓간의 연결만 처리하고 실제 데이터는 소켓들끼리 서로 주고 받음. 소켓들이 데이터를 주고받는 연결 통로가 입출력 스트림
-
소켓은 두 개의 스트림(입력 스트림, 출력 스트림)을 가지고 있으며, 이 스트림들은 연결된 상대편 소켓의 스트림들과 교차연결됨
-
한 소켓에서 출력스트림으로 데이터를 보내면 상대편 소켓에서는 입력스트림으로 받게 됨
-
-
TCP를 이용한 소켓프로그래밍을 위해 Socket과 ServerSocket 클래스를 제공
- Socket: 프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가짐. 두 스트림을 통해 프로세스간의 통신이 이루어짐
- ServerSocket: 포트와 연결되어 외부의 연결요청을 기다리다 연결요청이 들어오면, Socket을 생성해 소켓과 소켓간의 통신이 이루어지도록 함. 한 포트에 하나의 ServerSocket만 연결 가능(프로토콜이 다르면 같은 포트를 공유할 수 있음)
2.3 UDP 소켓 프로그래밍
- UDP 소켓 프로그래밍에서는 DatagramSockt과 DatagramPacket을 사용
- UDP는 연결지향적인 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않음
- UDP 통신에서 사용하는 소켓은 DatagramSocket이며 데이터를 DatagramPacket에 담아서 전송
- DatagramPacket은 헤더와 데이터로 구성되어 있으며, 헤더에는 DatagramPacket을 수신할 호스트의 정보(호스트의 주소와 포트)가 저장되어 있음
- DatagramPacket을 전송하면 DatagramPacket에 지정된 주소(호스트의 포트)의 DatagramSocket에 도착
Chapter 16 끝!!!