Socket vs WebSocket - 2021.03.21
2021.03.21
이 글은 소켓이란 무엇인지에 대한 글입니다.
Socket
소켓은 채팅과 스트리밍 등 실시간으로 서버와 소통할 때 자주 등장하는 개발 용어입니다.
소켓이란 무엇일까요?
일단 위키피디아에서는 소켓을 어떻게 정의하는지 보겠습니다.
💡 소켓 - Socket
네트워크 소켓 은 컴퓨터 네트워크를 경유하는 프로세스 간 통신의 종착점이다. 오늘날 컴퓨터 간 통신의 대부분은 인터넷 프로토콜을 기반으로 하고 있으므로, 대부분의 네트워크 소켓은 인터넷 소켓이다. 네트워크 통신을 위한 프로그램들은 소켓을 생성하고, 이 소켓을 통해서 서로 데이터를 교환한다.
머리가 아픕니다.
프로세스 간 통신이 무엇인지도 알아야겠습니다.
💡 프로세스 간 통신 - Inter-Process Communication, IPC
프로세스 간 통신이란 프로세스들 사이에 서로 데이터를 주고받는 행위 또는 그에 대한 방법이나 경로를 뜻한다.
역시 머리가 아프지만 거의 다 온 것 같습니다.
프로세스만 알면 될 거 같아요!
💡 프로세스 - Process
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다.
그렇군요! 정리하자면 소켓은 아래와 같겠습니다.
소켓이란 네트워크 통신을 경유하는 컴퓨터 프로그램 간의 소통의 종착점이다!
쉽게 말하면 A컴퓨터와 B컴퓨터와의 소통 창구입니다.
끝입니다!
...라고만 말한다면 이것이 도대체 실시간 통신 과는 무슨 상관이 있는 걸까요?
실시간 통신을 알기 위해선 어떤 방식으로 어떠한 방식으로 서버와 클라이언트가 소통하는지 알 필요가 있습니다.
서버와 클라이언트는 HTTP 프로토콜을 사용해 소통합니다.
HTTP 프로토콜이란 약속입니다. 깊게 다루진 않겠지만 간단히 설명하자면 우리가 편지를 보낼 때 보내는이 와 받는 이의 정보를 기재하자고 약속한 것과 비슷합니다. 또한 HTTP 프로토콜은 한 가지 추가적인 사항이 있는데 단일 요청에 대해서는 단일 응답만 한다.입니다. (그렇게 하자고 약속되어 있습니다.)
이러한 특성으로 인해 HTTP 프로토콜을 활용해서는 실시간 통신이 불가능합니다.
서버는 클라이언트가 요청을 보내기 전에는 절대 무언갈 보내지 않거든요! (약속입니다!)
실시간 통신이 가능한 WebSocket 프로토콜은 위키에서 웹소켓 프로토콜은 2011년 IETF에 의해 RFC 6455로 표준화되었으며라고 정의되어 있으니 2011년 전에는 어떻게 실시간 통신을 구현했을까요? 분명히 그전에도 실시간 통신 기능은 있었으니깐 말이죠.
Polling
💡 폴링 - Polling
폴링이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다.
폴링으로 구현했습니다!
즉 클라이언트에서 서버로 일정한 시간마다 계속 요청을 확인하는 방식입니다.
A가 클라이언트고 B가 서버라면 아마 이러한 대화를 나눴을 거 같습니다.
- A: 서버야 새로운 정보 있니?
- B: 아니
- ... 5초 후
- A: 서버야 새로운 정보 있니?
- B: 아니
- ... 5초 후
- A: 서버야 새로운 정보 있니?
- B: 응 새로운 게 있어 여기 받으렴
- A: 고마워! 화면을 업데이트해야겠어! 근데 서버야 새로운 정보 있니?
- B: 아니
- ...
말 수가 상당히 많습니다.
새로운 정보가 없어도 쓸데없는 통신 낭비가 이루어지고 있습니다.
또 다른 방법은 없을까요?
Long polling
단일 요청에 대한 단일 응답이니까
업데이트 결과가 있을 때만 서버가 알려주면 부담을 줄일 수 있지 않을까요?
롱 폴링 방식을 사용한다면 서버와 클라이언트는 아마 이렇게 대화했을 것 같습니다.
- A: 서버야 새로운 업데이트가 있다면 알려줘! 있을 때까지 기다릴게
- B:...(응답하지 않음)
- B: ...(응답하지 않음)
- B: ...(응답하지 않음)
- B: 어 여기! 새로운 게 있어! 받아!
- A: 고마워! 화면을 업데이트해야겠어! 그리고 서버야 새로운 업데이트가 있다면 알려줘! 있을 때까지 기다릴게
- B:...(응답하지 않음)
- B: ...(응답하지 않음)
- ...
아마 이런 식의 대화를 했을 거 같습니다.
단일 요청에 대한 단일 응답이라는 형식은 깨지지 않았고요.
이 역시 단점은 존재합니다.
실시간 통신이 짧은 시간 안에 무수히 많이 일어난다면 서버의 부담이 매우 심할 겁니다.
폴링 방식은 아무리 요청이 많아도 5초에 한 번씩(예시)만 보냈으면 됐지만
롱 폴링은 1초에 100번을 보내게 될 수도 있을 겁니다.
이 외에도 다양한 방식의 실시간 통신 기법이 있습니다.
아래 링크에서 더 다양한 기법을 볼 수 있습니다.
https://en.wikipedia.org/wiki/Push_technology#Long_polling
Push technology - Wikipedia
Technology Push technology or server push, is a style of Internet-based communication where the request for a given transaction is initiated by the publisher or central server. It is contrasted with pull/get, where the request for the transmission of infor
en.wikipedia.org
하지만 인터넷이 고도화되며 우리는 실시간 통신을 이제는 밥먹듯이 하기 시작했습니다.
여러 사람들의 니즈로 인해 드디어 2011년 서버가 클라이언트로 정보를 보낼 수 있는
웹소켓 프로토콜이 표준화되었습니다.
WebSocket
드디어 웹 소켓입니다!
위의 내용을 모두 이해했다면 웹 소켓의 개념은 정말 쉽습니다.
HTTP 프로토콜로는 실시간 통신을 구현하기에 어렵기 때문에 웹소켓 프로토콜이라는 것이 생겼습니다.
이 역시 하나의 약속입니다. 깊게 들어가지는 않겠습니다.
정확히 구현되는 방식을 설명하자면 다시 처음으로 우리는 소켓이 무엇인지를 봐야 합니다.
소켓은 컴퓨터가 다른 컴퓨터와 소통할 때 사용되는 창구라고 볼 수 있는데요
HTTP 프로토콜 역시 소켓을 통해 소통했습니다.
다만 웹소켓 프로토콜을 사용했을 때는 이 소켓으로 양방향 통신이 가능해집니다.
이를 이해하기 위해서는 포트라는 것을 알아야 합니다.
💡 포트 - Port
인터넷 프로토콜 스위트에서 포트는 운영 체제 통신의 종단점이다.
쉽게 설명하면 컴퓨터가 활용할 수 있는 통신선 같은 것이라고 볼 수 있습니다.
소켓은 이 포트를 활용합니다! 그리고 각 소켓은 하나의 포트를 이용합니다.
웹 소켓 프로토콜로 통신할 때는 클라이언트가 서버에게 자신의 포트 번호를 알려줍니다.
클라이언트와 서버는 아마 아래와 같은 방식으로 대화할 겁니다.
- A: 서버야 내 포트 번호는 12345야! (무엇도 요청하지 않음)
- B:...(새로운 정보가 없음)
- B: ...(새로운 정보가 없음)
- B: 여기 새로운 정보 줄게!
- A: 고마워! 화면을 업데이트해야겠어! 그리고 나도 새로운 정보가 있어!
- B: 응 잘 받았어!
- ...
이제 클라이언트와 서버가 대화의 형식을 띌 수 있게 됐습니다!
실시간 통신을 하기 위해 정말 많이 돌아온 느낌입니다.
드디어 이를 통해 서버는 클라이언트와 클라이언트 간의 대화(채팅)를 실시간으로 중계할 수 있습니다.
한 가지 기억할 것은 클라이언트와 클라이언트가 직접 소통할 수는 없습니다.
서버를 이용해야만 합니다.
세줄 요약
- 소켓은 컴퓨터가 다른 컴퓨터와 소통할 수 있는 창구이다.
- 웹 소켓은 컴퓨터와 컴퓨터가 실시간으로 통신할 수 있는 프로토콜(약속)이다.
- 웹 소켓 프로토콜을 활용해 클라이언트와 서버가 실시간 통신을 할 수 있다.
TMI
흔히 소켓 서버라 함은 웹 소켓 프로토콜로 통신이 가능한 서버를 말합니다!
일반적인 컴퓨터는 65,535개의 포트를 갖고 있습니다.
추가 정보
컴퓨터는 65,535개의 포트를 갖고 있는데 그렇다면 한 서버는 최대 65,535명의 클라이언트와 대화할 수 있을까? 란 궁금증이 들었습니다.
서버에게 추가 ip를 할당하고 해당 ip에 대한 포트를 추가적으로 갖는 방법도 있고
서버에선 소켓 식별만 하면 되니 2바이트 정수로 제한하지 않고 구분키의 범위를 IP / PORT까지 늘리는 방법도 있다고 합니다. (이 부분은 낯설어서 이해가 잘 되지 않네요)
두 부분 모두 정확히 이해 한지는 모르겠지만 굳이 늘리려면 늘릴 수 있다! 인 것 같습니다.
https://jangpd007.tistory.com/246
윈도우 서버 환경에서, 최대 생성 가능한 소켓(socket) 연결 수는 얼마일까?
출처 : http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=964&rssMode=1&wtype=0 정말로 좋은 글이 또 퍼옴. 두고두고 공부할 때 읽을 예정... --------------------------------------..
jangpd007.tistory.com