본문 바로가기

프로그래밍/JAVA

[JAVA 이론] 네트워킹

네트워킹

네트워킹이란?

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

 

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

서버       - 서비스를 제공하는 컴퓨터
클라이언트 - 서비스를 사용하는 컴퓨터
서비스     - 서버가 클라이언트로부터 요청받은 작업을 처리하여 그 결과를 제공하는 것
            ex) 파일서버, 메일서버, 어플리케이션서버

서버에 접속하는 클라이언트의 수에 따라 하나의 서버가 여러 가지 서비스를 제공하기도 하고 하나의 서비스를 여러대의 서버로 제공하기도 한다.

  • 서버가 서비스를 제공하기 위해서는 양쪽 모두 프로그램이 있어야한다.
    ex) 웹서버 - 웹브라우저, 알FTP - FTP클라이언트
  • 일반 PC도 FTP서버프로그램이나 Tomcat과 같은 웹서버프로그램을 설치하면 서버역할도 수행할 수 있다.
  • 클라이언트/서버 프로그램을 하나로 합쳐 클라이언트와 동시에 서버가 될 수 있다.
서버기반 모델(server-based model) P2P 모델(peer-to-peer model)
- 안정적인 서비스의 제공이 가능하다.
- 공유 데이터의 관리와 보안이 용이하다.
- 서버구축비용과 관리비용이 든다
- 서버구축 및 운영비용을 절감할 수 있다.
- 자원의 활용을 극대화 할 수 있다.
- 자원의 관리가 어렵다.
- 보안이 취약하다.

 

2. IP주소(IP address)

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

  • IP주소는 4 byte(32 bit)의 정수로 구성되어 있다.
  • 4개의 정수가 마침표를 구분자로 'a.b.c.d'와 같은 형식으로 표현한다.
  • 여기서 a, b, c, d는 부호없는 1 byte값(0~255사이의 정수)이다.
  • IP주소는 네트워크주소와 호스트주소로 나뉘며 네트워크 주소가 같으면 같은 호스트가 같은 네트워크에 포함된 것
    ex) 987.654.32.100 - 네트워크주소(987.654.32), 호스트주소(100)

3. InetAddress

자바에서는 IP주소를 다루기 위한 클래스로 InetAddress를 제공한다.

- InetAddress의 메서드

메서드 설명
byte[] getAddress() IP주소를 byte배열로 반환한다.
static InetAddress[] getAllByName(String host) 도메인명(host)에 지정된 모든 호스트의 IP주소를 배열에 담아 반환한다.
static InetAddress getByAddress(byte[] addr) byte배열을 통해 IP주소를 얻는다.
static InetAddress getByName(String host) 도메인명(host)을 통해 IP주소를 얻는다.
String getCanonicalHostName() FQDN(fully qualified domain name)을 반환한다.
String getHostAddress() 호스트의 IP주소를 반환한다.
String getHostName() 호스트의 이름을 반환한다.
static InetAddress getLocalHost() 지역호스트의 IP주소를 반환한다.
boolean isMulticastAddress() IP주소가 멀티캐스트 주소인지 알려준다.
boolean isLoopbackAddress() IP주소가 loopback 주소(127.0.0.1)인지 알려준다.

 

4. URL(Uniform Resource Locator)

URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다.

'프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조'

http://www.java.com:80/sample/test.html?referer=javatest#index1

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

- URL의 메서드

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

 

5. URLConnection

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

 

- URLConnection 메서드

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

 

소켓 프로그래밍

소켓(socket)이란?

프로세스간의 통신에 사용되는 양쪽 끝단을 의미한다.

 

1. TCP와 UDP

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

항목 TCP UDP
연결방식 연결기반(connection-oriented)
   - 연결 후 통신(전화기)
   - 1:1 통신방식
비연결기반(connectionless-oriented)
   - 연결없이 통신(소포)
   - 1:1, 1:n, n:n 통신방식
특징 데이터의 경계를 구분안함 (byte-stream)
신뢰성 있는 데이터 전송
   - 데이터의 전송순서가 보장됨
   - 데이터의 수신여부를 확인함
     (데이터가 손실되면 재전송됨)
   - 패킷을 관리할 필요가 없음
 UDP보다 전송속도가 느림
데이터의 경계를 구분함 (datagram)
신뢰성 없는 데이터 전송
   - 데이터의 전송순서가 바뀔 수 있음
   - 데이터의 수신여부를 확인안함
     (데이터가 손실되어도 알 수 없음)
   - 패킷을 관리해주어야 함
TCP보다 전송속도가 빠름
관련 클래스 Socket
SeverSocket
DatagramSocket
DatagramPacket
MulticastSocket

2. TCP소켓 프로그래밍

TCP소켓 프로그래밍은 클라이언트와 서버간의 일대일 통신이다. 

- 서버 프로그램과 클라이언트 프로그램간의 통신과정

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

Socket

프로세스간의 통신을 담당하며, InputStream과 OutputStream을 가지고 있다. 이 두 스트림을 통해 프로세스간의 통신(입출력)이 이루어진다.

 

ServerSocket

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

(프로토콜이 다르면 같은 포트를 공유할 수 있다.)

 

3. UDP소켓 프로그래밍

  • TCP소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만, UDP소켓 프로그래밍에서는 DatagramSocket과 DatagramPacket을 사용한다.
  • UDP는 연결지향적인 프로토콜이 아니기 때문에 ServerSocket이 필요하지 않다. UDP통신에서 사용하는 소켓은 DatagramSocket이며 데이터를 DatagramPacket에 담아서 전송한다.
  • DatagramPacket은 헤더와 데이터로 구성되어 있으며, 헤더는 DatagramPacket을 수신할 호스트의 정보(호스트의 주소와 포트)가 저장되어 있다.
  • 소포(packet)에 수신할 상대편의 주소를 적어서 보내는 것과 같다.
  • DatagramPacket을 전송하면 DatagramPacket에 지정된 주소(호스트의 포트)의 DatagramSocket에 도착한다.

'프로그래밍 > JAVA' 카테고리의 다른 글

[JAVA 이론] 입출력 I/O  (0) 2022.07.16
[JAVA 이론] 람다와 스트림  (0) 2022.06.22
[JAVA 이론] 쓰레드  (0) 2022.03.16
[JAVA 이론] Generics, Enumeration, Annotation  (0) 2022.03.13
[JAVA 이론] Collections Framework  (0) 2022.02.27