이 두가지는 전송계층에서 가장 널리 사용되는 두 가지 프로토콜이다.
TCP(Transmission Control Protocol)
연결 지향적 프로토콜로 데이터 전송 전에 송신자와 수신자 간에 연결을 확립. 이를 위해 3-way 핸드셰이크 과정을 거친다.
3-Way HandShake
송신자가 수신자에게 연결 요청(SYN)을 보낸다. -> 수신자는 요청을 받고 승인(SYN-ACK)을 보낸다. -> 송신자는 수신자의 승인에 대해 확인 응답(ACK)을 보낸다.
연결 해제 시 데이터 전송이 완료되면 4-way handshake를 통해 연결을 종료.
수신자로부터 ACK(확인 응답)을 통해 패킷이 제대로 전달되었는지 확인한다. 손실된 패킷은 재전송된다. 체크섬을 사용하여 데이터 오류를 감지하고, 필요에 따라 재전송한다. 전송된 데이터가 원래의 순서대로 수신되도록 순서 번호를 부여
: 체크섬이란 TCP헤더와 데이터에 대해 16비트 체크섬 비트를 계산하여 데이터의 오류 여부를 확인하는 것을 말한다. 수신자쪽에서 받은 체크섬과 송신자가 보낸 체크섬이 다르면 재전송 요청을 한다.
수신자의 데이터 처리 능력을 고려하여 송신 속도를 조절한다. 일반적으로 슬라이딩 윈도우 프로토콜을 사용한다.
네트워크 혼잡을 감지하고 송신 속도를 조절하여 패킷 손실을 최소화한다.
연결 설정 및 유지, 흐름 제어, 오류 제어 등의 기능으로 인해 헤더 크기가 커지고 처리 오버헤드가 증가한다. 신뢰성을 보장하기 위한 추가적인 처리로 인해 지연 시간이 발생 가능.
연결 지향적 특성으로 인해 1:1 통신만 가능
ex)
HTTP/HTTPS(웹 브라우징) : 데이터의 완전성과 순서 보장이 필요
이메일 전송(SMTP, POP3, IMAP) : 메시지의 정확한 전달이 중요
파일 전송(FTP) : 파일 데이터의 손실 없이 전송
원격 접속(SSH, Telnet) : 명령어와 응답의 정확한 전달이 필요
헤더의 구성은 크기는 최소 20바이트로 크며 소스 및 목적지 포트, 순서 번호, 확인 응답 번호, 플래그, 윈도우 크기, 체크섬, 긴급 포인터에다가 별도의 옵션 필드까지 해서 크기가 상당히 크다.
UDP(User Datagram Protocol)
데이터 전송 전에 별도의 연결 설정 과정이 없으며 각 패킷은 독립적으로 처리되며, 송신자는 수신자가 패킷을 받았는지 확인하지 않는다.
체크섬을 통해 데이터 오류를 감지할 수 있지만, 오류 수정이나 재전송 메커니즘이 없음. 각 패킷은 독립적으로 처리되므로, 순서가 바뀌거나 손실될 수 있음.
송신자는 최대 속도로 데이터를 전송하며, 네트워크 상태나 수신자의 처리 능력을 고려하지 않는다.
헤더 크기가 8바이트로 매우 작으며 추가적인 연결 설정 과정이 없음. 최소한의 프로토콜 기능으로 인해 지연 시간이 적다.
멀티캐스트와 브로드캐스트를 지원하여 한 번의 전송으로 여러 수신자에게 데이터를 전달할 수 있다.
ex)
실시간 스트리밍(RTP) : 약간의 데이터 손실보다 지연 시간이 더 중요
온라인 게임 : 빠른 반응이 중요하며, 일부 패킷 손실은 허용
VolP : 음성 통화에서 지연 시간 최소화가 중요
DNS 조회 : 빠른 응답이 필요하며 재전송은 애플리케이션 레벨에서 처리
헤더의 크기는 8바이트이다. 소스 및 목적지 포트 번호, 길이, 체크섬으로 이루어져 있다.
TCP와 UDP의 차이점과 실습 가능성을 신입/취업 준비 중인 Java, Spring 백엔드 개발자 관점에서 살펴보겠습니다.
| 특징 | TCP | UDP |
|---|---|---|
| 프로토콜 종류 | 연결 지향(Connection-oriented) | 비연결 지향(Connectionless) |
| 신뢰성 | 신뢰성 있는 데이터 전송 보장 (패킷 확인 및 재전송) | 신뢰성 보장 없음 |
| 데이터 순서 | 데이터 순서 보장 | 데이터 순서 보장 없음 |
| 속도 | 비교적 느림 (연결 설정 및 확인 과정 포함) | 비교적 빠름 (단순한 데이터 전송) |
| 오버헤드 | 높음 (패킷 확인, 재전송, 연결 관리) | 낮음 (단순한 패킷 전송) |
| 데이터 손실 허용 | 허용하지 않음 (손실 시 재전송) | 허용 (손실된 데이터 재전송 없음) |
| 주요 사용 사례 | HTTP, HTTPS, FTP, SMTP (파일 전송, 웹 브라우징 등) | DNS, VoIP, 온라인 게임, 스트리밍 (빠른 응답 필요) |
Java와 Spring을 기반으로 한 실습은 네트워크 프로그래밍과 실제 백엔드 애플리케이션의 기초를 쌓는 데 유용합니다.
TCP는 신뢰성을 보장하기 때문에 상태 유지(Stateful)와 데이터 무결성 요구사항이 있는 서비스에 적합합니다.
목적: TCP의 연결 지향적 특성과 패킷 확인 기능 이해.
기능:
사용 기술:
Socket, ServerSocket 클래스.예제 코드:
// Server.java
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = new ServerSocket(8080);
System.out.println("Server is running...");
while (true) {
Socket clientSocket = serverSocket.accept();
new Thread(() -> {
try (BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true)) {
String message;
while ((message = in.readLine()) != null) {
System.out.println("Received: " + message);
out.println("Server Echo: " + message);
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
}
}
// Client.java
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("localhost", 8080);
try (BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader console = new BufferedReader(new InputStreamReader(System.in))) {
String userInput;
while ((userInput = console.readLine()) != null) {
out.println(userInput);
System.out.println(in.readLine());
}
}
}
}
UDP는 빠르고 단순한 데이터 전송을 처리하기 위해 사용됩니다.
목적: UDP의 비연결성과 빠른 데이터 전송 이해.
기능:
사용 기술:
DatagramSocket, DatagramPacket 클래스.예제 코드:
// UDPServer.java
import java.net.*;
public class UDPServer {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(8080);
byte[] buffer = new byte[1024];
System.out.println("UDP Server is running...");
while (true) {
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
String received = new String(packet.getData(), 0, packet.getLength());
System.out.println("Received: " + received);
}
}
}
// UDPClient.java
import java.net.*;
public class UDPClient {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
InetAddress address = InetAddress.getByName("localhost");
byte[] buffer = "Hello, Server!".getBytes();
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, 8080);
socket.send(packet);
System.out.println("Message sent!");
}
}
TCP 실습:
UDP 실습:
Socket, DatagramSocket 사용).실습을 통해 네트워크 통신에 대한 이해를 높이면, 백엔드 개발자로서의 기초를 탄탄히 다질 수 있습니다. 추가로 필요하거나 도움이 필요한 부분이 있으면 말씀해주세요!