[TIL] 24.10.18 FRI

GDORI·5일 전
0

TIL

목록 보기
75/79
post-thumbnail

팀프로젝트 이후 리팩토링 진행

생각했던 것들과 튜터님들의 피드백 내용을 종합하여 리팩토링을 진행하고자 한다. git 세팅 및 파일구조 변경까지는 완료했으나 소켓 통신 방식에 대해서 바꾸려면 시간이 조금 걸릴 것 같으나 재밌을 것 같다.

net 모듈

net은 node.js에서 기본으로 제공하는 TCP 소켓을 생성하고 관리하는 기본적인 API를 말한다. 이를 통해 네트워크 통신을 쉽게 구현할 수 있으며 Socket.io와 달리 다운받을 것이 없고 낮은 레벨의 통신을 처리하는데 적합하다.

서버측 JS

import net from 'net';

const PORT = 5555;

const server = net.createServer((socket) => {
  console.log(`Client connected from: ${socket.remoteAddress}:${socket.remotePort}`);
  socket.on('data' , (data) => {
    console.log(data);
  })
  
  socket.on('end', () => {
    console.log('Client disconnected');
  });

  socket.on('error', (err) => {
    console.error('Socket error:', err);
  });
})

server.listen(PORT, () => {
  console.log(`Echo server listening on port ${PORT}`);
  console.log(server.address());
})

클라이언트측 JS

import net from 'net';

// 서버에 연결할 호스트와 포트
const HOST = 'localhost';
const PORT = 5555;

const client = new net.Socket();

client.connect(PORT, HOST, () => {
  console.log('Connected to server');
})

client.on('data', (data) => {
  console.log(data)
});

client.on('close', () => {
  console.log('Connection closed');
});

client.on('error', (err) => {
  console.error('Client error:', err);
});

사용법이 매우 비슷하다.

Buffer

TCP는 바이트 배열을 주고받으며, 각 요소는 0부터 255 사이의 정수 값을 가진다. 이는 이진 데이터를 표현하는데 유용하다.
Buffer 객체는 Node.js에서 이진 데이터를 다루기 위한 최적화된 객체로서, 고정 길이와 빠른 접근성을 제공하며 메모리를 효율적으로 사용하고 네트워크 프로토콜과 파일 포맷과의 호환성이 뛰어나다. 문자열을 바이트 배열로 변환하여 저장하고 조작할 수 있다.

한번의 TCP 전송당 처리되는 데이터 크기

MTU ( Maximum Transmission Unit)

이더넷의 경우 기본 MTU는 1,500 바이트로 IP 헤더 20바이트, TCP 헤더 20바이트를 제외한 1,460바이트가 실제 데이터에 할당된다.

MSS ( Maximum Segment Size )

MSS는 MTU에서 IP와 TCP 헤더 크기를 뺀 값이다. 일반적으로 1,460바이트로 설정되며 한 번에 이 크기만큼의 데이터가 전송된다. 그러나 애플리케이션의 설정에 따라 더 작은 단위로 쪼개질 수 있다.

그렇다면, 패킷은 한번에 1.4kb를 안넘기면 좋지 않나?

패킷의 크기가 크면 데이터를 조각으로 나누는 단편화를 진행하고 그 만큼 재조립 시간과, 손실되었을 경우 재전송 여부 등으로 성능이 저하된다. 또한 네트워크 혼잡 시 MSS 이하로 전송하는 것은 효율적이라고 볼 수 있다.

다만, 여기서 너무 작은 데이터 10~20바이트 수준을 자주 전송하게 되면 패킷 헤더의 사이즈보다 작은 데이터 비율이기 때문에 비효율적이며 이 때에는 여러 데이터를 버퍼링 후 한번에 전송하는 것이 효율적일 것 같다.

실시간 통신이 중요한 경우 TCP_NODELAY 옵션을 사용하여 네이글 알고리즘을 비활성화 할 수 있는데 나중에 따로 게시글로 작성하겠다.

profile
하루 최소 1시간이라도 공부하자..

0개의 댓글