소켓(SOCKET)이란?
소켓(Socket)은 네트워크 상의 컴퓨터 간에 데이터 송수신을 가능하게 해주는 인터페이스이다. 소켓은 IP 주소와 포트번호를 사용하여 특정 네트워크 장치에서 실행 중인 애플리케이션에 연결된다.
소켓은 네트워크 통신에서 컴퓨터 간 데이터를 주고받기 위한 엔드포인트다. 정해진 프로토콜 규약에 따라 IP주소와 포트 번호를 통해 상대방을 찾아 통신할 수 있게 해준다.
등장 배경
소켓(Socket)은 기존 HTTP 통신의 한계를 보완하기 위해 사용된다. 클라이언트와 서버, 두 컴퓨터가 특정한 Port를 통해 실시간으로, 양방향 통신을 가능하게 만든 통신을 의미한다. 정확히는 두 컴퓨터가 서로에게 단방향 통신을 주고 받음으로써 양방향 통신을 구동하는 것이지만, 기능적으로 두 컴퓨터는 거의 동등한 위치에서 양쪽 모두가 데이터를 송신할 수도 있고 수신할 수도 있다는 것이다. 이는 클라이언트만이 통신을 시작할 수 있었던 HTTP 통신과는 큰 차이점을 보여준다.
HTTP는 클라이언트-서버 모델을 따른다. 이 모델에서는 클라이언트가 요청(request)을 보내면 서버가 그 요청에 응답(response)하는 구조로, 통신은 기본적으로 클라이언트가 시작한다. 이로 인해 HTTP는 클라이언트가 통신을 시작하는, 즉 요청을 보내는 역할을 독점하며, 서버는 수동적으로 응답하는 구조로 고정된다.
용어 정리
1) 소켓
- 네트워크 통신의 출발점이자 도착점
- 두 컴퓨터 간의 통신을 가능하게 해주는 논리적인 연결 포인트
2) IP 주소
- 인터넷이나 네트워크 상에서 각 컴퓨터를 식별하는 고유한 주소
- 예: 192.168.1.1, 172.217.16.174 (IPv4), 2404:6800:4004:809::200e (IPv6)
3) 포트 번호
- 한 컴퓨터 내에서 여러 애플리케이션이나 서비스가 동시에 네트워크 통신을 할 수 있도록 구분해주는 숫자
- 0 ~ 65535 까지의 범위를 가지며, 특정 서비스는 표준적으로 할당된 포트 번호를 사용한다. 예) HTTP는 포트 80, HTTPS는 포트 443
동작 흐름
1. 초기 HTTP 요청
- 클라이언트가 처음 서버에 연결할 때는 일반적으로 HTTP요청을 보낸다. 이 HTTP요청은 보통 웹 페이지를 로드하거나, 서버에서 초기 데이터를 가져오는데 사용된다.
2. WebSocket 프로토콜로 전환 (선택적)
- HTTP 요청 중에는 "업그레이드 요청(Upgrade Request)"이 있다. 이 요청은 서버에게 WebSocket으로 통신 프로토콜을 변경하고 싶다는 의도를 전달하는 것이다.
3. 서버의 응답 (소켓 허용)
- 서버가 클라이언트의 업그레이드 요청을 승인하면, HTTP 응답의 일종으로 "101 Switching Protocols"라는 상태 코드를 보낸다. 이 응답은 클라이언트에게 "HTTP 프로토콜에서 WebSocket으로 전환하겠다"는 메시지를 전달한다.
- 이 시점부터는 HTTP 통신이 아니라, 양방향 소켓 통신이 이루어진다.
4. WebSocket 연결 수립 후 통신
- WebSocket 연결이 설정되면, 이후의 통신은 HTTP가 아닌 WebSocket 프로토콜을 사용하여 실시간 양방향 통신이 이루어진다. 이 통신에서는 클라이언트와 서버가 자유롭게 데이터를 주고받을 수 있다.
서버 (Server)
클라이언트 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라이언트 소켓을 생성하여 통신이 가능하게 한다.
1) socket() 함수를 이용하여 소켓을 생성
2) bind() 함수로 ip와 port 번호를 설정(자바의 ServerSocket은 생성 시 포트 번호를 지정하므로 별도의 bind() 호출이 필요 없다.)
3) listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정
4) accept() 함수를 사용하여 클라이언트와의 연결을 기다림
클라이언트(Client)
실제로 데이터 송수신이 일어나는 것은 클라이언트 소켓이다.
1) socket() 함수로 가장 먼저 소켓을 연다.
2) connect() 함수를 이용하여 통신할 서버의 설정된 ip와 port 번호에 통신을 시도 (자바의 Socket 클래스에서는 소켓을 여는 순간 내부적으로 connect()함수와 같은 역할을 수행하여 연결한다.)
3) 통신을 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor를 반환 (자바에서는 소켓 디스크립터를 직접 다룰 필요가 없으며, Socket 객체를 통해 소켓과의 통신을 수행)
4) 이를 통해 클라이언트와 서버가 서로 read(), write()를 하며 통신 (이 과정 반복)
소켓의 유형
소켓 통신은 사용하는 프로트콜에 따라 크게 두 가지 유형으로 나눌 수 있다.
1. 스트림 (TCP)
- TCP(Transmission Control Protocol) 기반 소켓.
- 신뢰성 있는 연결을 제공하는 소켓
- 양방향으로 바이트 스트림을 전송, 연결 지향성
- 데이터가 손실되거나 순서가 바뀌지 않도록 보장
- 주로 웹 서버와 클라이언트 간의 통신에 사용
2. 데이터그램 (UDP)
- UDP(User Datagram Protocol) 기반 소켓.
- 비연결형 소켓
- 빠른 통신이 필요한 경우에 사용
- 데이터가 손실될 수 있으며 순서를 보장하지 않는다.
- 실시간 스트리밍 같은 경우에 주로 사용된다.
참고
'CS 지식 > 네트워크' 카테고리의 다른 글
[네트워크] 로드밸런싱(Load Balancing) (1) | 2024.10.13 |
---|---|
[네트워크] OSI 7계층 & TCP/IP 4계층 (0) | 2024.07.11 |
[네트워크] 클라우드 서비스 (IaaS, PaaS, SaaS) (0) | 2024.06.13 |
[네트워크] JWT 토큰 인증 (쿠키, 세션, 토큰 인증 방식) (0) | 2024.06.09 |
[네트워크] Web Server 와 Web Application Server (0) | 2024.05.30 |