TCP, UDP 및 소켓, 웹소켓 통신의 완벽 이해
TCP와 UDP의 차이점, 소켓과 웹소켓의 개념, 그리고 HTTP와의 관계를 종합적으로 설명하는 네트워크 통신 가이드다.
TCP와 UDP의 차이점
TCP와 UDP는 OSI 7계층 모델의 전송 계층(4계층)에서 사용되는 대표적인 프로토콜로, 데이터 전송 방식과 특성에 명확한 차이가 있다.
TCP(Transmission Control Protocol)
TCP는 연결형, 신뢰성 있는 프로토콜로 다음과 같은 특징을 가진다.
- 연결 지향적: 데이터 전송 전에 3-way handshaking을 통해 연결을 설정한다
- 양방향 통신: 양쪽에서 데이터를 주고받을 수 있다
- 신뢰성 보장: 데이터 전송 순서를 보장하고 오류 검출 및 재전송을 수행한다
- 흐름 제어: 수신자의 처리 속도에 맞춰 데이터 전송 속도를 조절한다
- 혼잡 제어: 네트워크 상황에 따라 데이터 전송량을 조절한다
TCP 연결 과정(3-way handshake):
1. 클라이언트 → 서버: SYN 패킷 전송
2. 서버 → 클라이언트: SYN+ACK 패킷 전송
3. 클라이언트 → 서버: ACK 패킷 전송
TCP는 안전한 전송을 보장하기 때문에 손실된 데이터까지 복구하여 전송한다. 이러한 특성으로 인해 파일 전송, 웹 브라우징, 이메일 등 데이터의 정확성이 중요한 애플리케이션에서 주로 사용된다.
UDP(User Datagram Protocol)
UDP는 비연결형, 비신뢰성이지만 속도가 빠른 프로토콜로 다음과 같은 특징을 가진다.
- 비연결 지향적: 연결 설정 없이 바로 데이터를 전송한다
- 단방향 통신: 일방적으로 데이터를 전송한다
- 신뢰성 없음: 데이터 전송 순서와 도착을 보장하지 않는다
- 헤더가 간단함: TCP보다 헤더 크기가 작아 오버헤드가 적다
- 빠른 속도: 연결 설정 과정이 없고 오류 제어를 하지 않아 속도가 빠르다
UDP 통신 과정:
1. 클라이언트 → 서버: 데이터그램 직접 전송
(연결 설정 과정 없음)
UDP는 실시간 통신이 중요한 경우에 적합하며, 일부 데이터 손실이 발생해도 전체 서비스에 큰 영향을 주지 않는 스트리밍 서비스, 온라인 게임, 음성/영상 통화 등에 주로 사용된다.
소켓과 웹소켓의 이해
소켓과 웹소켓은 네트워크 통신을 위한 인터페이스지만, 동작 계층과 사용 목적에 차이가 있다.
소켓(Socket)이란?
소켓은 네트워크 통신을 위한 엔드포인트로, 프로토콜 구현을 위한 인터페이스를 제공한다.
- TCP/IP 4계층에서 전송 계층 위에 위치하며 프로토콜 제어를 위한 코드를 제공한다
- 통신의 양 끝단(엔드포인트) 역할을 하며, 인터넷은 소켓을 찾아 연결하고 데이터를 송수신한다
- 소켓은 IP 주소와 포트 번호의 조합으로 식별된다
- 자바에서는
java.net.Socket
라이브러리를 통해 네트워크 통신의 읽기/쓰기 인터페이스를 제공한다
// 자바 소켓 통신 예시
Socket socket = new Socket("호스트주소", 포트번호);
OutputStream out = socket.getOutputStream();
InputStream in = socket.getInputStream();
소켓은 TCP/UDP 프로토콜을 사용하는 모든 네트워크 애플리케이션의 기본 통신 메커니즘으로, 클라이언트-서버 구조의 네트워크 프로그램에서 필수적인 요소다.
웹소켓(WebSocket)이란?
웹소켓은 HTTP에서 실시간 양방향 통신을 가능하게 하기 위해 개발된 프로토콜이다.
- HTTP 레이어에서 작동하는 소켓으로, TCP/IP 소켓과는 레이어가 다르다
- 웹에서 실시간 통신을 위해 설계되었으며, HTTP 프로토콜의 한계(비연결성, 단방향 통신)를 극복한다
- 초기 연결은 HTTP를 통해 이루어지지만, 이후 웹소켓 프로토콜로 업그레이드되어 지속적인 양방향 통신이 가능하다
- URL 형식이
ws://
또는 암호화된 연결을 위한wss://
로 시작한다 - 자바에서는
javax.websocket
또는 스프링의 STOMP 같은 라이브러리를 통해 구현한다 - 웹소켓 이전의 비슷한 기술: http폴링, http스트리밍
// 자바스크립트 웹소켓 연결 예시
const socket = new WebSocket("ws://example.com/socket");
socket.onopen = function(e) { console.log("연결됨"); };
socket.onmessage = function(event) { console.log("데이터 수신:", event.data); };
웹소켓은 채팅 애플리케이션, 실시간 대시보드, 온라인 게임, 협업 도구 등 웹 환경에서 실시간 데이터 교환이 필요한 애플리케이션에 적합하다.
소켓 vs 웹소켓 vs HTTP
이 세 가지 기술은 네트워크 통신에서 각각 다른 역할과 특성을 가지고 있다.
HTTP의 특성: HTTP는 TCP 위에서 동작하는 애플리케이션 계층 프로토콜이다.
- 비연결성(Connectionless): 요청-응답 후 연결을 종료한다
- 무상태(Stateless): 이전 요청과 현재 요청 간의 상태를 유지하지 않는다
- 단방향 통신: 클라이언트가 요청을 보내면 서버가 응답하는 구조다
- URL 형식:
http://
또는https://
로 시작한다
💡 HTTP가 단방향 구조인 이유는 웹의 기본 설계 철학 때문이다. 상태를 유지하지 않고 요청-응답 후 연결을 종료함으로써 서버 자원을 효율적으로 사용할 수 있게 설계되었다.
참고: 소켓으로 채팅 프로그램 만든거 생각해보면 HTTP 사용한거 아니다. (TCP, UDP 사용 함)
- 웹소켓 사용했으면 HTTP사용하니까 Swing(구이)말고 “브라우저에서 TCP 통신”으로 채팅 웹 만들었겠지.
- 특히나 URL도 다름:
http://www.sample.com/
과 같은 형식이 아니라ws://www.sample.com/
과 같은 형식 - 자바의 기본 소켓은 net에 있는 Socket라이브러리고, 웹 소켓은 websocket라이브러리.
- 특히나 URL도 다름:
소켓과 웹소켓의 차이: 소켓과 웹소켓은 모두 양방향 통신을 지원하지만, 동작 계층과 사용 목적에 차이가 있다.
-
동작 계층:
- 소켓: 전송 계층(4계층) 위에서 동작
- 웹소켓: 애플리케이션 계층(7계층)에서 HTTP를 기반으로 동작
-
사용 환경:
- 소켓: 모든 네트워크 애플리케이션에서 사용 가능
- 웹소켓: 주로 웹 브라우저 환경에서 사용
-
프로토콜:
- 소켓: TCP/UDP 프로토콜 직접 사용
- 웹소켓: 초기 연결은 HTTP, 이후 웹소켓 프로토콜로 업그레이드
-
구현 라이브러리:
- 소켓:
java.net.Socket
- 웹소켓:
javax.websocket
또는 스프링의 웹소켓 지원 라이브러리
- 소켓:
⚡ 실제 사용 사례 비교:
- 일반 소켓으로 구현한 채팅 프로그램은 데스크톱 애플리케이션(예: Java Swing)에서 실행된다
- 웹소켓으로 구현한 채팅 프로그램은 웹 브라우저에서 실행되며 HTTP를 통한 초기 연결 후 지속적인 통신이 가능하다
클라이언트가 웹 브라우저인 경우 웹소켓을 사용하는 것이 적합하며, 데스크톱 애플리케이션이나 서버 간 통신에는 일반 소켓이 더 적합할 수 있다.
웹소켓 통신 과정
웹소켓 통신은 HTTP를 통한 초기 연결 설정 후 웹소켓 프로토콜로 업그레이드되는 과정을 거친다.
-
핸드셰이크: 클라이언트가 HTTP 요청에
Upgrade: websocket
헤더를 포함하여 서버에 전송 - 프로토콜 전환: 서버가 101 상태 코드로 응답하며 웹소켓 프로토콜로 업그레이드
- 양방향 통신: 웹소켓 연결이 수립된 후 양방향으로 데이터 프레임 교환
- 연결 종료: 클라이언트 또는 서버가 연결 종료 프레임을 전송하여 연결 종료
웹소켓 핸드셰이크 요청 예시:
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
TCP/UDP, 소켓, 웹소켓, HTTP는 각각 다른 계층과 목적을 가진 기술이지만, 모두 네트워크 통신을 위한 중요한 요소다. 애플리케이션의 요구사항과 환경에 따라 적절한 기술을 선택하는 것이 중요하다.
댓글남기기