본문 바로가기
프로그래밍

Socket vs WebSocket

by YuminK 2023. 11. 14.

WebSocket

1. 양방향 통신

2. 단방향 통신의 http통신과 대조적

3. 실시간 네트워킹

 

웹 소켓 이전에 있던 기술

polling

1. 일정 주기마다 요청하여 연결, 실시간 X

2. 보낼 데이터가 없어도 요청을 보낸다. (리소스 낭비)

 

Long Polling

1. 서버에 요청하고 응답을 받을 때까지 종료 X

2. 응답을 받으면 다시 연결을 보낸다. (항상 연결된 상태가 되도록 처리)

3. 많은 양의 메시지가 쏟아질 경우 부하 증가

 

Streaming

1. 끊임없이 데이터를 수신받는다. (=양방향 불가) 

 

이러한 방식은 http 헤더 정보가 커서 부담이 크다. 웹 소켓의 경우 한번 연결시 http 프로토콜을 이후부터 wss를 사용한다. socket.io는 웹소켓을 지원하지 않는 경우 polling 같은 기술을 이용하여 웹소켓과 유사하게 동작시켜준다.

https://youtu.be/MPQHvwPxDUw

 

https://kamang-it.tistory.com/entry/Webhttp%ED%86%B5%EC%8B%A0%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%96%91%EB%B0%A9%ED%96%A5-%ED%86%B5%EC%8B%A0%EA%B8%B0%EB%B2%95-long-polling

 

At a minimum however it’s important to understand that HTTP is used only for the initial handshake, which relies on a mechanism built into HTTP to request a protocol upgrade (or in this case a protocol switch) to which the server can respond with HTTP status 101 (switching protocols) if it agrees. Assuming the handshake succeeds the TCP socket underlying the HTTP upgrade request remains open and both client and server can use it to send messages to each other.

 

초기에 HTTP를 사용하여 핸드쉐이킹을 하고 upgrade 프로토콜 요청을 보내면 서버에서 응답하여 통신할 준비를 한다.

https://docs.spring.io/spring-framework/docs/4.3.x/spring-framework-reference/html/websocket.html

 

소켓은 브라우저든 아니든 제한이 없다. 더 제너릭한 용도로 사용된다. 어떠한 통신에도 사용될 수 있다. 웹소켓은 HTTP 프로토콜로 연결하기 때문에 주로 브라우저 기반에서 사용된다. 

https://stackoverflow.com/a/4973689

 

웹 소켓은 어플리케이션 프로토콜이다. 웹 소켓은 그냥 두 어플리케이션 사이의 프로토콜이다. 어느 종류인지는 상관없다. 그러나 일반적으로 서버와 브라우저 기반 어플리케이션에 쓰인다.

https://stackoverflow.com/a/33629739

 

예전에 어떤 블로거가 nodejs에서 socket.io를 사용하여 게임서버로 쓰고, 유니티 클라이언트끼리 통신 시켰다는 내용을 본 적이 있다. 일반적으로 게임서버는 Socket으로 개발하지만, 웹소켓을 사용하는 것이 문제되진 않는다. 왜냐면 WebSocket은 프로토콜일 뿐이니까. 

 

뭔가 이름 자체가 WebSocket이라 웹에서만 쓸 것 같은 느낌인데, 그렇지 않다. 추가적으로 polling에 대한 내용도 얻어 실시간에 가까운, 그러나 높은 레이턴시를 요구하지 않는 프로그램에 대해 생각하게 한다. 지속적인 연결이 필요한 경우 소켓을, 적절한 동기화를 원하는 경우에는 polling과 유사한 형태를 쓰면 될 것 같다.

'프로그래밍' 카테고리의 다른 글

함수형 프로그래밍이란?  (0) 2023.12.12
[Zigbee] FZ200BS 모듈 정리  (0) 2023.12.11
비동기 프로그래밍과 쓰레드  (0) 2023.11.13
디자인 패턴에 대한 생각  (0) 2023.11.12
테스트 서버(윈도우) 설정 방법  (0) 2023.11.12

댓글