UDP와 TCP는 둘 다 인터넷 프로토콜(IP) 위에서 작동하는 전송 계층 프로토콜이지만, 각자의 특징과 사용 목적이 다릅니다. 아래는 두 프로토콜의 차이점과 예제 코드로 비교하여 설명합니다.
TCP와 UDP의 차이점
- 연결 지향성
- TCP (Transmission Control Protocol): 연결 지향적입니다. 통신을 시작하기 전에 클라이언트와 서버가 연결을 설정해야 하며, 연결을 종료할 때도 명시적으로 종료합니다. 데이터가 순서대로 전달되고 손실이 없음을 보장합니다.
- UDP (User Datagram Protocol): 비연결 지향적입니다. 데이터그램을 개별적으로 전송하며, 연결 설정과 종료 과정이 없습니다. 데이터의 순서와 전달을 보장하지 않습니다.
- 신뢰성
- TCP: 신뢰성이 높습니다. 데이터 전송 확인(ACK), 재전송, 흐름 제어 및 혼잡 제어 등의 메커니즘을 사용합니다.
- UDP: 신뢰성이 낮습니다. 데이터 전송 확인, 재전송 등의 기능이 없으며, 패킷이 손실되거나 순서가 뒤바뀔 수 있습니다.
- 속도
- TCP: 속도가 느립니다. 신뢰성을 보장하기 위한 추가적인 오버헤드(오류 검사, 흐름 제어 등)가 있습니다.
- UDP: 속도가 빠릅니다. 오버헤드가 적고, 데이터그램을 신속하게 전송합니다.
- 사용 예
- TCP: 파일 전송, 이메일, 웹 브라우징 등 신뢰성이 중요한 응용 프로그램에 사용됩니다.
- UDP: 실시간 스트리밍, 온라인 게임, VoIP 등 속도가 중요한 응용 프로그램에 사용됩니다.
예제 코드 비교
TCP 서버
import java.io.*;
import java.net.*;
public class TCPServer {
public static void main(String[] args) {
try (ServerSocket serverSocket = new ServerSocket(6789)) {
System.out.println("Server is listening on port 6789");
while (true) {
try (Socket clientSocket = serverSocket.accept()) {
System.out.println("New client connected");
InputStream input = clientSocket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
OutputStream output = clientSocket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
String message = reader.readLine();
System.out.println("Received: " + message);
writer.println("Message received");
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
TCP 클라이언트
import java.io.*;
import java.net.*;
public class TCPClient {
public static void main(String[] args) {
String serverAddress = "localhost";
int port = 6789;
try (Socket socket = new Socket(serverAddress, port)) {
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String message = "Hello, TCP Server";
writer.println(message);
String response = reader.readLine();
System.out.println("Server response: " + response);
} catch (IOException e) {
e.printStackTrace();
}
}
}
UDP 서버 (앞서 제공된 코드와 동일)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPServer {
public static void main(String[] args) {
try {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData;
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("RECEIVED: " + receivedMessage);
InetAddress clientAddress = receivePacket.getAddress();
int clientPort = receivePacket.getPort();
String responseMessage = "Message received";
sendData = responseMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
serverSocket.send(sendPacket);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
UDP 클라이언트 (앞서 제공된 코드와 동일)
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
public class UDPClient {
public static void main(String[] args) {
try {
DatagramSocket clientSocket = new DatagramSocket();
InetAddress serverAddress = InetAddress.getByName("localhost");
String message = "Hello, UDP Server";
byte[] sendData = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9876);
clientSocket.send(sendPacket);
byte[] receiveData = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
System.out.println("FROM SERVER: " + receivedMessage);
clientSocket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
요약
- TCP는 연결 지향적, 신뢰성이 높고 속도가 느리며, 신뢰성이 중요한 응용 프로그램에 사용됩니다.
- UDP는 비연결 지향적, 신뢰성이 낮고 속도가 빠르며, 실시간 통신이 중요한 응용 프로그램에 사용됩니다.
각 프로토콜의 특성을 이해하고, 응용 프로그램의 요구 사항에 따라 적절한 프로토콜을 선택하는 것이 중요합니다.
반응형