TIL

24/02/03 TIL __ socket io와 TCP 통신

GABOJOK 2024. 2. 3. 23:55

 

 

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 프로토콜은 데이터를 쪼개서 전송하고, 받는쪽에서 쪼개진 데이터의 순서를 보고 조립한다.

 

이런 특성 덕분에 데이터의 순서 보장을 하며 에러를 복구할 수 있다.  

신뢰성이 생기는 프로토콜이고, 데이터 손실, 혹은 중복전송에 대해 대비책을 만들 수 있다. 
여러 연결이 있다고 할지라도 초기 순차번호는 각 연결의 고유 식별자 역할을 한다.

 

그러나 이것은 프로토콜일 뿐, 

데이터를 안전하게 처리하기 위해서는 결국 메세지 큐나 브로커를 사용해야 한다고 생각한다.