HTTP/HTTPS and TCP 프로토콜 데이터 전송 및 응답
요약
- HTTP 는 TCP 상위 프로토콜로 stateless해서 한번 3-way handshake 하고, 요청하고 응답받으면 통신이 종료되는것이다
- HTTP 없이 TCP 프로토콜로만 연결한다는 것은 단순히 바이트 스트림을 주고받을 수 있는 상태를 말하는 것이다. 이때 바이트 스트림을 주고받을 수 있는 매개체로 소켓을 사용한다.
1. 개요
인터넷 통신에서 데이터 전송 및 응답을 담당하는 주요 프로토콜로는 HTTP/HTTPS와 TCP가 있습니다. 이 문서에서는 두 프로토콜의 차이점, 동작 방식, 그리고 자바를 이용한 간단한 예제를 설명합니다.
2. HTTP/HTTPS
2.1 정의
- HTTP (HyperText Transfer Protocol): TCP 위에서 동작하는 응용 계층 프로토콜로, 주로 웹 브라우저와 서버 간의 통신에 사용됩니다.
- HTTPS (HTTP Secure): HTTP에 보안(SSL/TLS)을 추가한 프로토콜로, 데이터 전송 시 암호화를 제공합니다.
2.2 특징
- Stateless: 각 요청과 응답은 독립적이며, 서버는 클라이언트의 이전 요청 상태를 기억하지 않음
- 요청-응답 방식: 클라이언트가 요청을 보내면 서버가 응답을 반환하고, 그 후 연결이 종료
2.3 동작 과정
-
3-way handshake: TCP를 통해 연결 설정.
- TCP 패킷 주고 받음.
- 요청 전송: 클라이언트가 서버로 HTTP 요청 전송.
- 응답 수신: 서버가 요청을 처리하고 HTTP 응답 반환.
- 연결 종료: 응답 후 연결 종료.
3. TCP
3.1 정의
- TCP (Transmission Control Protocol): 신뢰성 있는 데이터 전송을 보장하는 전송 계층 프로토콜로, 데이터를 바이트 스트림 형태로 전송합니다.
3.2 특징
- 신뢰성: 데이터의 손실, 중복, 순서 오류 등을 방지
- 스트림 지향: 연속된 바이트 스트림으로 데이터를 처리
- 양방향 통신: 양방향 데이터 전송이 가능
3.3 동작 과정
- 소켓 생성: 클라이언트와 서버가 각각 소켓을 생성합니
- 연결 수립: 클라이언트가 서버에 연결 요청, 서버는 이를 수락
- 데이터 전송: 바이트 스트림 형태로 데이터를 주고 받음
- 연결 종료: 데이터 전송이 완료되면 소켓을 닫아 연결을 종료
4. 자바 예제
4.1 서버 코드 (Server.java)
import java.io.*;
import java.net.*;
public class Server {
public static void main(String[] args) {
int port = 12345;
try (ServerSocket serverSocket = new ServerSocket(port)) {
System.out.println("Server is listening on port " + port);
while (true) {
Socket socket = serverSocket.accept();
System.out.println("New client connected");
new ServerThread(socket).start();
}
} catch (IOException ex) {
System.out.println("Server exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
class ServerThread extends Thread {
private Socket socket;
public ServerThread(Socket socket) {
this.socket = socket;
}
public void run() {
try (InputStream input = socket.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(input))) {
String message;
while ((message = reader.readLine()) != null) {
System.out.println("Received: " + message);
}
} catch (IOException ex) {
System.out.println("Server thread exception: " + ex.getMessage());
ex.printStackTrace();
}
}
}
4.2 클라이언트 코드 (Client.java)
import java.io.*;
import java.net.*;
public class Client {
public static void main(String[] args) {
String hostname = "localhost";
int port = 12345;
try (Socket socket = new Socket(hostname, port)) {
OutputStream output = socket.getOutputStream();
PrintWriter writer = new PrintWriter(output, true);
writer.println("Hello, Server");
} catch (UnknownHostException ex) {
System.out.println("Server not found: " + ex.getMessage());
} catch (IOException ex) {
System.out.println("I/O error: " + ex.getMessage());
}
}
}
5. 정리
- HTTP/HTTPS는 TCP 기반의 상위 프로토콜로, 요청-응답 방식의 stateless 통신을 수행합니다.
- TCP 소켓 통신은 HTTP 없이 순수한 TCP를 사용하여 바이트 스트림을 소켓을 통해 주고받는 방식입니다.
- TCP 소켓 통신의 특징: 신뢰성, 스트림 지향, 양방향 통신을 제공합니다.