소켓
프로그램이 네트워크에서 데이터를 주고받을 수 있도록 네트워크 환경에 연결할 수 있게 만들어진 연결부
프로토콜, IP, 주소, 포트넘버로 정의됨
일반적으로 TCP/IP 프로토콜을 이용
프로세스가 데이터를 보내거나 받기 위해서는 반드시 소켓을 열어서 소켓에 데이터를 써보내거나 소켓으로부터 데이터를 읽어들여야 함
통신의 흐름
서버
클라 소켓의 연결 요청을 대기하고, 연결 요청이 오면 클라 소켓을 생성하여 통신이 가능하게 함
1. socket() 함수를 이용하여 소켓을 생성
2. bund() 함수로 ip와 pot 번호를 설정
3. listen() 함수로 클라이언트 접은 요청에 수신 대기열을 만들어 몇개의 클라이언트를 대기 시킬지 결정
4. accept() 함수를 사용하여 클라의 연결을 기다림
클라이언트
실제로 데이터 송수신이 일어나는 것은 클라소켓
1. socket() 함수로 가장 먼저 소켓을 엶
2. connect() 함수를 이용하여 통신 할 서버의 설정된 ip와 port 번호에 통신을 시도
3. 통신을 시도 시, 서버가 accepy() 함수를 이용하여 클라의 socket descriptor를 반환
4. 이를 통해 클라와 서버가 서로 read(), write()를 하며 통신( 4번 과정 반복)
*하나의 프로세스는 동일한 포트번호를 가진 여러개의 소켓과 결합 가능함
하나의 호스트가 하나의 포트로 여러개의 소켓을 만들어 다른 호스트들과 데이터를 주고 받을 수 있음
소켓 통신시 주의사항
데이터를 송수신 할 땐 보안이 가장 중요
데이터 송신시 수신측에서 무작정 데이터를 수신하는게 아닌 포트번호를 식별하여 알맞게 들어온 프로세스만 수신해야 함
TCP/IP 소켓과 웹소켓의 차이
소켓과 웹소켓의 공통점
IP와 포트를 통한 통신을 함
양방향 통신이 가능
차이점
웹소켓은 HTTP 레이어에서 작동하는 소켓(TCP/IP 소켓의 레이어와 다름)
웹소켓(WebSocket)
http에서는 실시간 통신을 할 수 없다는 문제를 해결하기 위해 나온 기술
http의 특징
- 비연결성(단방향)
- 매번 연결 맺고 끊는 과정의 비용 발생
- request response 의 구조
- 헤더의 비중이 너무 큼 : 실시간성으로 많은 데이터를 주고 받고자 하는 경우에는 매우 부담스러운 요소
요청을 보내면 응답이 오는 단방향적 구조로 통신 하기 때문에 일반 소켓처럼 계속 connection이 유지되는 실시간 통신을 할 수없음
웹 소켓의 특징
- 연결지향적(양방향)
- 한번 연결 맺은 뒤 유지
- 핸드쉐이크 과정에서는 헤더의 비중이 크지만, 연결 후 간단한 작은 데이터들로 송수신(경제적)
웹에서 실시간 통신을 해야하는 상황에서 잘 쓰이는 프로토콜 중 하나
웹소켓의 사용시기
1. 채팅(SNS APP)
2. 실시간 주식거래사이트
3. 게임 등(LOL, 멀티플레이어 게임)
웹 소켓 동작 방법
1. 핸드쉐이킹
채널에 대한 정상적인 통신이 시작되기 전에 두개의 실체 간에 확립된 통신 채널의 변수를 동적으로 설정하는 자동화된 협상과정
2. Frame 구성
최초 접소시 http 프로토콜위에서 핸드쉐이킹을 하기 때문에 http 헤더 사용
프레임으로 구성된 메시지라는 논리적 단위로 송수신
웹소켓의 라이브러리
Socket.io / SockJS
html5 이전의 기술로 구현된 서비스에서 웹소켓처럼 사용 할수 있도록 도와주는 기술
웹소켓 이전의 http 실시간 통신
1. http polling
서버로 일정 주기 요청 송신
실시간으로 통신하는 것이 아닌 일정 조건을 만족할때, 일정 시간마다 자동적으로 요청 송신
문제점 - 불필요한 요청, 긴 대기시간
2. http long-polling
서버에 요청을 보내고, 이벤트가 생겨 응답 받을 때까지 서버측에서 연결을 종료 하지 않는것,
응답을 받으면 끊고 다시 재요청
poling 처럼 일정 시간마다 요청을 보내는것이 아닌 연결은 유지하되 이벤트가 생기면 연결을 끊고 다시 재요청
문제점 - 불필요한 요청은 보완 했지만, 많은 양의 메세지가 생기면 polling과 똑같음
3. http streaming
서버에 요청을 보내고 끊기지 않은 연결상태에서 끊임 없이 데이터를 수신함
문제점 - 클라에서 서버로의 데이터 송신이 어려움
결국 모든 방법들은 http의 단방향 통신으로 인해 불필요한 요청과 응답이 오가는 문제가 있다
'coding > Node.js' 카테고리의 다른 글
로그 남기기 1 - winston 사용 (0) | 2022.09.09 |
---|---|
socket.io - 실시간 채팅 / 채팅방 구현 (2) | 2022.09.07 |
에러 핸들러 (0) | 2022.09.03 |
Sequelize Op like - 검색 기능 (0) | 2022.08.23 |
페이지네이션 (0) | 2022.08.23 |