총 10분 중 11분
2001
시즌 2개, 그리고 영화
시즌 2: 5화 “아일랜드”
출연: 이나영, 김민준, 김민정, 현빈
장르: 애초에 역경을 딛고 이룩하는 숭고한 사랑이란 없다. 그 역경 자체가 사랑이다.
프로그램 특징: 그 곳에서 살아남는 사랑이 어떤 모습으로 걸어오는지 기다려 보고 싶다.
Computer Science/Network TCP/IP 와 UDP

*이것이 자바다(3판)을 보고 작성한 글입니다.

IP: Internet Protocol

IP 주소는 네트워크 어댑터(LAN 카드)마다 할당된다.

  • DNS(Domain Name System)
  • Web browser 웹 
  • 명령어 ipconfig / ifconfig

웹브라우저가 DNS를 거쳐 웹서버에서 웹 페이지를 받게 되는 과정?

  • 웹 브라우저는 웹 서버와 통신하는 클라이언트로, 사용자가 입력한 도메인 이름으로 DNS에서 IP를 검색해 찾은 다음, 웹 서버와 연결해 웹 페이지를 받는다.

Port 번호

운영체제가 관리하는 서버 프로그램의 연결 번호

포트번호가 필요한 이유는?

  • 배경: 하나의 IP 주소를 갖는 컴퓨터에서 다양한 서버 프로그램(FTP서버, DBMS, 웹 서버 등)이 실행될 수 있다. 서버는 시작할 때 특정 포트 번호에 바인딩되며, 클라이언트는 어떤 서버와 통신할 지 표현하기 위해 해당 서버의 포트번호로 통신 요청해야 한다.→ 클라이언트가 서버와 통신할 때 사용하는 포트 번호는 운영체제가 부여하는 포트번호로, 통신 요청할 때 함께 전송되어 서버가 클라이언트로 데이터를 보낼 때 사용된다.
  • 클라이언트는 서버에서 보낸 정보를 받기 위해서도 포트 번호를 필요로 한다. 이때 서버와 같이 고정적인 포트번호에 바인딩하는 것이 아니라 운영체제가 자동으로 부여하는 번호를 사용한다.
  • IP는 컴퓨터의 네트워크 어댑터(LAN)까지 갈 수 있는 정보기 때문에, 컴퓨터 내부에서 실행하는 서버를 선택하기 위해 추가적인 포트 번호가 필요하다.

Well Known Port 0 ~ 1023 ICANN가 특정 애플리케이션용으로 미리 예약한 포트
Registered Port 1024 ~ 49151 회사에서 등록해서 사용하는 포트
Dynamic Or Private Port 49152 ~ 65535 운영체제가 부여하는 동적 포트 또는 개인적인 목적으로 사용할 수 있는 포트

 2. IP 주소 얻기

IP주소 대신 도메인을 사용하려는 경우 사용 객체 InetAddress

import java.net.*;

// 도메인 네임을 알고 있는 경우 
InetAddress ia = InetAddress.getByName(String domainName); 
InetAddress[] iaArr = InetAddress.getAllByName(String domainName);

하나의 도메인으로 여러 IP가 등록되어 있는 이유?

  • 클라이언트가 많이 연결되었을 경우 서버 부하를 나누기 위해

객체로 부터 IP 주소를 얻는 메소드 getHostAddress()

String ip = InetAddress.getHostAddress();

로컬 컴퓨터의 IP와 네이버 웹의 IP 정보 출력

InetAddress local = InetAddress.getLocalHost();
sout(local.getHostAddress());

TCP는 통신시 회선을 고정해서 사용하기 때문에 순차적이고 손실없는 데이터 전송 → 신뢰성
UCP는 여러 회선을 통해 일방적인 데이터 전송 → 속도

3. TCP/IP 네트워킹

Transmission Control Protocol TCP는 IP와 함께 사용되므로 TCP/IP라고도 한다. 웹 브라우저가 웹 서버에 연결할 때 사용되며 이메일 전송, 파일 전송, DB 연동에도 사용된다.

  • 연결형 프로토콜?
    상대방이 연결된 상태에서 데이터를 주고 받는 것으로, 클라이언트가 연결 요청 → 서버 수락 → 통신 회선 고정이 되면 데이터는 고정 회선을 통해 전달된다. 떄문에 TCP는 보낸 데이터가 순서대로 전달되며 손실이 발생하지 않는다.
  • Protocol IP 주소로 프로그램들이 통신할 때 약속된 통신 규약

java.net ServerSocket, Socket 패키지

  • ServerSocket 클라이언트 연결을 수락하는 서버 클래스
  • Socket 클라이언트에서 연결 요청하거나 클라이언트와 서버 양쪽에서 데이터를 주고 받을 때 사용하는 클래스

 

TCP 서버: ServerSocket / Socket 사용 흐름

  1. 서버의 포트번호 지정: 서버가 ServerSocket 사용을 위해 바인딩할 포트 번호(50001) 지정
  2. ServerSocket serverSocket = new ServerSocket(50001); // 객체 생성과 bind 과정이 분리된 코드 ServerSocket 
serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(50001));

3. 클라이언트의 연결 요청: 서버가 실행되면 클라이언트는 Socket을 이용해 서버의 IP주소와 포트 번호로 연결 요청

try { 
	// (server IP, port number)
	// if asking to server running in local (localhost, port num)
	Socket socket = new Socket("IP", 50001);
	
	// using domain name
	Sokcet socket = new Socket(InetAddress.getByName("domainName"), 50001);
	
	// create socket and connect
	socket = new Socket();
	socket.connect( new InetSocketAddress("domainName", 50001));

} catch (UnknownHostException e) {
	// IP 잘못 표기한 경우
} catch (IOException e) {
	// IP, Port로 서버에 연결할 수 없는 경우
}

4. 서버의 통신용 Socket 생성: ServerSocket은 accept() 메소드로 클라이언트 연결 요청 수락 후 통신용 Socket 생성accept() 클라이언트 연결 요청 전까지 블로킹 상태, 클라이언트 요청이 들어오면 블로킹 해제 후 통신용 Socket 리턴

  • blocking 실행을 멈춘 상태

  1. Socket socket = serverSocket.accept();
  2. 통신: 클라이언트와 서버는 양쪽 Socket을 이용해 데이터 통신
  3. 서버 종료: ServerSocket close()로 포트 번호 언바인딩을 해줘야 다른 프로그램에서 해당 포트 번호 사용 가능
  4. serverSocket.close(); socket.close();

 

서버 설정 시 발생할 수 있는 상황

  • 서버 컴퓨터에서 여러 개의 IP가 할당된 경우
  • BindException: Port가 다른 프로그램에서 사용 중인 경우
  • → 다른 포트로 바인딩하거나 포트를 사용 중인 프로그램 종료 후 다시 실행
  • 클라이언트가 서버 연결 요청 시 UnknownHostException / IOExceptioin
    • IP 주소가 잘못 표기된 경우
    • 제공된 IP와 포트 번호로 연결할 수 없는 경우
  • 클라이언트의 IP주소와 포트 번호를 얻고 싶다면→ InetSocketAddress 객체 획득
  • InetSocketAddress.getHostToString() / getPort()
  • accept()로 리턴된 Socket의 getRemoteSocketAddress() 사용
InetSocketAddress isa = (InetSocketAddress) socket.getRemoteSocketAddress();
String clientIp = isa.getHostToString();
String portNo = isa.getPort();

 

데이터 주고 받기: IOStream

데이터는 byte로 보내고 받는다. 근데 데이터가 바이트는 아니니까 보조스트림인 DataInputStream/DataOutputStream 을 연결해서 사용한다. 대신 상대방도 DataOutputStream으로 보낼 때만 사용 가능하다.

// receive data
DataInputStream dis = new DataInputStream(socket.getInputStream());
// byte[string encoding with UTF-8]
String message = dis.readUTF();
                        
// send data
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
dos.writeUTF(message);
dos.flush();
System.out.println("Message sent: " + message);

 

4. UDP 네트워킹

User Datagram Protocol UCP는 발신자가 일방적으로 수신자에게 데이터를 보내는 방식

→ 연결 요청 및 수락 과정이 없기 때문에 TCP보다 데이터 전송 속도가 빠르다.

  • 실시간 영상 스트리밍

java.net DatagramSocket / DatagramPacket 이용

  • DatagramPacket(수신된 데이터 저장할 바이트 배열, 수신할 수 있는 최대 바이트 수)

 

UDP server

UCP 서버는 클라이언트가 보낸 Datagram을 항상 받을 준비가 되어야 한다.

TCP accept()는 클라이언트 요청 전까지 블로킹이 기본 상태였지만 UDP는 receive()로 데이터 수신 전까지 블로킹된다.

DatagramSocket socket = new DatagramSocket(50001);

// (바이트 배열, 시작 인덱스, 수신 가능 바이트 수)
DatagramPacket packet = new DatagramPacket(new byte[1024], 1024);
socket.receive(packet);

반대로, UDP 서버가 클라이언트에게 처리 내용을 보내려면 클라이언트 IP주소와 포트 번호가 필요하다.

  • receive()로 받은 DatagramPacket .getSocketAddress() 로 SocketAddress 객체 획득

 

UDP Client

UDP DatagramSocket은 기본 생성자로 생성한다. 클라이언트의 포트 번호는 자동 부여되기 때문에 따로 지정할 필요가 없다.

1. DatagramSocket (바이트 배열, 바이트 배열에 보내고자 하는 바이트 수, InetSocketAddress);

  • InetSocketAddress: UDP 서버의 IP와 Port 정보를 가진 객체

2. DatagramPacket에 담아서 정보 전달

  1. 서버로 데이터 전송 socket.send(sendPacket)
  2. 서버 처리 결과 받기 socket.receive(dataReceivePacket)
  3. 소켓 닫기 socket.close()

 

5. 서버의 동시 요청 처리

서버는 다수의 클라이언트와 통신하는데 클라이언트의 모든 요청 처리를 동기적으로 하면 다음 클라이언트의 지연시간이 길어진다.

accept() -> 데이터 받고 보내기(별도 스레드로 작업) -> receive()

  • 스레드는 과도한 스레드 생성을 막고자 threadPool 을 이용한다. 스레드 수는 제한되지만 작업 큐 대기 작업 증가로 응답이 늦어질 수 있다.

 

6. JSON 데이터 형식

  • JavaScript Object Notation

JSON에서 속성 순서는 중요하지 않기 때문에 추가한 순서대로 작성되지 않아도 상관없다. 그리고 줄바꿈 처리가 되지 않는데 오히려 이것이 네트워크 전송량을 줄이기 때문에 더 좋다.

 

작은 프로젝트에서는 JSON 자체를 이용하기 때문에 JSON-java 라이브러리 이용해서 JSON 생성하지만, JSON parsing이 필요한 경우에는 jackson 라이브러리를 이용해서 자바 객체로 변환해 사용할 수 있다. 

'Computer Science > Network' 카테고리의 다른 글

HTTP Protocol 기초  (0) 2025.03.19
Computer Science/Network TCP/IP 와 UDP