받은 조각과 메시지는 다르다
ASCII 수신 조각을 합치며 TCP 스트림과 메시지 경계를 구분합니다.
03-0 소켓 채팅에서 에코와 바이트 중계를 해 본 뒤 **받은 조각에서 완성된 메시지를 어떻게 찾을까?**를 확인합니다. HTTP보다 먼저 한 줄 메시지 규칙을 이해하는 실험입니다. 한글 문제는 뒤로 두고 ASCII의 메시지 경계만 봅니다.
세 조각에서 두 문장 찾기
03-통신과웹 폴더의 05-labs/frames.mjs는 수신 조각을 배열로 재현합니다. 서버나 클라이언트를 켤 필요 없이 각자 실행합니다.
const chunks = ['Hel', 'lo\nWor', 'ld\n'];예상: 세 조각을 차례로 붙이고 줄바꿈까지 꺼내면, 완성된 메시지는 몇 개이고 각각 무엇일까요?
npm run lab:frames조각은 세 개지만 줄바꿈을 기준으로 나누면 Hello, World 두 메시지입니다. 여기서는 프로그램끼리 줄바꿈 한 개가 메시지의 끝이라고 약속했습니다.
pending에 수신 조각을 붙이고, 줄바꿈을 찾으면 그 앞의 메시지를 꺼냅니다. 아직 끝나지 않은 내용은 다음 조각이 올 때까지 남깁니다.
이것은 실제 소켓이나 패킷을 강제로 분할하는 프로그램이 아닙니다. 경계 규칙을 한눈에 보기 위한 수신 시뮬레이션입니다.
한 가지씩 바꾸기
배열을 아래처럼 바꾸어 각각 실행합니다.
const chunks = ['Hello\nWorld\n'];const chunks = ['H', 'ello\nW', 'orld\n'];최종 메시지는 같았나요? 마지막 \n을 없애면 World가 출력되지 않고 남는 이유도 찾아봅니다. 약속한 끝 표시가 없기 때문입니다.
실제 TCP와 연결하기
TCP는 순서 있는 바이트 스트림을 제공합니다. 프로그램의 write 한 번과 받는 쪽의 data 한 번이 대응한다고 보장하지 않습니다. 패킷 하나도 같은 단위가 아닙니다. TCP 표준 §3.7
나중에 보는 선택 심화 02-http-server/server.mjs의 once('data')도 요청을 완전히 모으는 코드가 아닙니다. 첫 조각에서 고정 응답을 보내는 작은 관찰용 예제로 한정합니다. 요청 내용을 해석하려면 필요한 경계까지 모으는 단계가 추가되어야 합니다.
이해 확인
- 수신 조각 세 개에서 메시지 두 개를 복원하는 흐름을 설명한다.
- 조각을 자르는 위치와 메시지 끝 규칙을 구별한다.
- write·data·패킷이 같은 단위가 아님을 설명한다.
이제 03-0 소켓 채팅으로 돌아가 chat:lines에서 같은 규칙을 적용합니다. 한글이 궁금하면 UTF-8 별도 실험을 선택합니다.