socket io를 보다보니 tcp통신 이라는게 눈에 들어왔다.
그 전에 socket io에 대해 간단하게 집고 넘어가보려 한다.
🦊 socket io
socket io는 기본적으로 블로킹 모드이며, 해당 작업 완료까지 프로그램이 대기상태에 빠진다.
그러나 nodejs, nest js를 사용하는 나에게는 해당하지 않는다. 이 환경에서는 non-blocking이기 때문이다.
따라서,
송수신 함수 호출시 즉시 리턴되며, 호출한 스레드가 블록되지 않고 계속 실행된다.
TCP 통신을 사용해 데이터를 안정적으로, 순서대로 오류없이 전송을 하도록 되어있고,
연결 중단시 최대 1번의 메세지 전달을 보장하는 특성이 있다.
커널의 소켓 버퍼에는 송신버퍼와 수신버퍼가 있다.
socket io 에서 send 함수가 실행된다면, 송신버퍼는 데이터 송신 후 수신 버퍼가 받을때까지 blocking 되는것이 아니라,
송신버퍼에 데이터가 모두 복사되어 가진 상태가 된다면 바로 리턴한다는 특성이 있다.
그럼 이제 tcp 통신을 간단히 살펴보자.
🐶 TCP 통신
데이터를 안정적으로, 순서대로, 오류없이 전송하기 위한 소켓io의 핵심 프로토콜이다.
연결 지향적인 프로토콜 이라고도 하는데,
handshake 라는 과정으로 tcp연결을 시작, 종료한다,
클라이언트가 서버에게 연결을 할때 바로 하는게 아니라 서로 신호를 주고받아 가능한 상태임을 확인하고 연결한다.
즉 수신측의 버퍼상태를 고려해서 데이터의 흐름을 제어한다는 말이다.
연결이 되면 tcp 프로토콜은 데이터를 쪼개서 전송하고, 받는쪽에서 쪼개진 데이터의 순서를 보고 조립한다.
이런 특성 덕분에 데이터의 순서 보장을 하며 에러를 복구할 수 있다.
신뢰성이 생기는 프로토콜이고, 데이터 손실, 혹은 중복전송에 대해 대비책을 만들 수 있다.
여러 연결이 있다고 할지라도 초기 순차번호는 각 연결의 고유 식별자 역할을 한다.
그러나 이것은 프로토콜일 뿐,
데이터를 안전하게 처리하기 위해서는 결국 메세지 큐나 브로커를 사용해야 한다고 생각한다.
'TIL' 카테고리의 다른 글
24/02/06 TIL __ 메세지 브로커 와 소켓 어뎁터 (1) | 2024.02.06 |
---|---|
24/02/04 TIL __ socket io에 redis어뎁터 추가 (0) | 2024.02.04 |
24/02/02 TIL __ 레플리케이션 과 클러스터 그리고 샤딩 (0) | 2024.02.02 |
24/02/01 TIL __ rtmp 프로토콜, hls 프로토콜을 이용한 스트리밍 서비스 (0) | 2024.02.01 |
24/01/29 TIL __ 레디스 stream타입 데이터 벌크로 영구저장. (0) | 2024.01.29 |