일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- spring kafka
- kafka
- CodePipeline
- cd
- mysql
- centos7
- mirror maker2
- AWS
- PAGING
- JPA
- CI
- QueryDSL
- Entity
- consumer
- K8s
- topic생성
- spring
- bean
- API
- entity graph
- git
- Kubernetes
- transactionaleventlistener
- Kotlin
- Spring JPA
- Streams
- ECS
- Spring Data JPA
- offsetdatetime
- producer
- Today
- Total
Yebali
[WebSocket] WebSocket이란? 본문
Socket 자체를 모른다면 아래 글부터 읽어주세요
2023.01.17 - [Backend Common] - [Socket] Socket이란?
WebSocket이란?
WebSocket은 하나의 TCP connection으로 전이중(Full Duplex) 통신을 제공하는 프로토콜이다.
WebSocket을 사용하면 웹 환경에서 실시간으로 서버가 클라이언트에게 데이터를 줄 수 있다.
WebSocket과 Socket의 차이점
WebSocket과 Socket은 OSI Layer가 다르다.
WebSocket은 7 layer(Application)에 위치하고 Socket은 4 layer(Transport)에 위치한다.
또한 WebSocket의 연결 정보는 해당 애플리케이션이 관리하지만 Socket의 연결 정보는 OS Kernel에서 관리한다.
WebSocket과 HTTP의 차이점
WebSocket과 HTTP 프로토콜 모두 OSI 7 layer에 위치하고 4 layer(TCP)에 의존한다.
또한 WebSocket은 80, 443번 포트에서 동작하게 설계되어 HTTP와 호환되지만 동일하지는 않다.
가장 큰 차이는 프로토콜이다. WebSocket을 연결하기 위한 Handshake 과정에서는 HTTP를 사용하지만
WebSocket 통신에서는 HTTP가 아닌 독자적인 프로토콜(ws://)을 사용한다.
두 번째 차이는 WebSocket은 전이중 통신이지만 HTTP는 단방향 통신이다.
HTTP는 매 요청마다 TCP 연결을 맺고 '클라이언트 -> 서버' 또는 '서버 -> 클라이언트'의 방향으로 데이터가 전달된다.
하지만 WebSocket은 한번 맺은 TCP 연결로 '클라이언트 <-> 서버' 간의 양방향 통신이 가능하다.
WebSocket의 연결
WebSocket은 HTTP GET 매소드를 사용하여 연결(Handshake)을 시도한다.
클라이언트가 GET으로 연결 요청을 보내면 서버는 101 Switching Protocols 응답을 반환해 연결이 이루어졌음을 알린다.
연결이 이루어지고 나면 HTTP 연결은 시간이 지나며 자동으로 끊어지고,
연결된 WebSocket은 Protocol Overhead 방식으로 웹 서버와 브라우저가 데이터를 주고받는다.
Protocol Overhead 방식이란 여러 TCP Connection을 생성하지 않고 하나의 TCP Connection을 사용하면서
별도의 헤더 등의 논리적인 데이터를 사용하여 여러 개의 Connection을 맺는 효과를 내는 방식이다.
WebSocket은 프레임으로 구성된 '메시지'라는 논리적인 단위로 데이터를 송수신하여
메시지에 포함될 수 있는 것은 텍스트와 바이너리뿐이다.
WebSocket handshake 예시
/** 클라이언트 요청 */
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
/** 서버 응답 */
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
WebSocket을 사용하면 좋은 경우
일반적으로 서버에서 발생한 이벤트를 실시간으로 클라이언트에게 전달해야 하는 서비스(ex. SNS, 증권, 채팅 등)에 적합하다.
그리고 WebSocket은 HTTP와 같은 80번 포트를 사용하기 때문에 방화벽을 재설정하지 않아도 되는 장점이 있다.
WebSocket의 단점
- 브라우저가 WebSocket을 지원하지 않을 수 있다.
- WebSocket은 서버와 클라이언트 간의 Socket 연결을 유지하는 것 자체가 비용이 든다. 그렇기 때문에 트래픽이 많은 서버의 경우에는 서버에 큰 부담을 줄 수 있다.
WebSocket 이전의 방법
- Polling : 클라이언트가 서버에 일정한 주기로 요청을 보내 데이터를 받는 방식이다.
불필요한 Request와 Connection이 발생하며 실시간 환경에서는 요청을 보낼 타이밍을 예측할 수 없다. - Long Polling : Polling의 단점을 극복하고자 서버에서 조금 더 대기하여 데이터나 이벤트를 받는 방식이다.
많은 양의 이벤트가 발생하면 Polling과 동일해진다. - Streaming : 연결을 끊지 않고 계속해서 데이터를 수신하는 방식이다. 클라이언트에서 서버로 데이터를 보내기 어렵고
HTTP통신을 하기 때문에 Request, Response을 위한 헤더가 불필요하게 크다는 단점이 있다.
참조
https://ko.wikipedia.org/wiki/%EC%9B%B9%EC%86%8C%EC%BC%93
https://xephysis.tistory.com/42
https://velog.io/@codingbotpark/Web-Socket-%EC%9D%B4%EB%9E%80
https://d2.naver.com/helloworld/1336
'Backend Common' 카테고리의 다른 글
[Socket] Socket이란? (0) | 2023.01.17 |
---|---|
Time zone과 표준시 (0) | 2022.11.27 |
[JAVA] Garbage Collection의 개념과 동작 (0) | 2022.09.25 |
[JAVA] JVM의 구조 (0) | 2022.09.25 |
[Java] Java 컴파일과 실행 순서 (1) | 2022.09.25 |