요약
- stream은 데이터를 순서대로 흘려보내거나 꺼내는 통로다 — 앞에서부터 읽고, 읽으면 소비되어 사라지고, 길이는 끝날 때까지 모른다.
- 배열(random access)과 결정적으로 다르고, TCP만의 개념이 아니라 파일·stdin/stdout 등에서 쓰이는 일반 프로그래밍 추상화다.
본문
배열과의 결정적 차이
| 배열/메모리 파일 | stream | |
|---|---|---|
| 접근 | 아무 데나 자유 접근 (arr[i]) |
앞에서부터 순서대로만 (forward-only) |
| 존재 | 전체가 이미 있음 | 도착한 만큼만, 나머진 나중에 |
| 읽으면 | 그대로 남음 | 소비됨 — stream에서 사라지고 읽기 포인터 전진 |
| 길이 | 알고 있음 | 끝날 때까지 모름 |
한 줄로: 배열은 자유 접근, stream은 앞으로만 쌓이고 소비되면 사라진다.
3가지 성질
- 순서대로, 앞으로만 (sequential / forward-only)
- 읽기 포인터가 앞으로만 간다. 한 번 읽은 바이트는 지나가고 되돌아가 인덱싱 못 함.
- 시간에 걸쳐 도착 (over time)
- 전체가 이미 있는 게 아니라 지금 도착한 만큼만 있음. 읽을 게 없으면 read가 기다림(block).
- 길이를 미리 모름 (unbounded)
- 끝(EOF/FIN)이 언제일지 모르고, 흐르는 동안 계속 꺼낸다.
buffer 비유는 실제다
"통로 뒤에 데이터가 쌓이고 거기서 지속적으로 꺼낸다"는 모델이 물리적으로 맞다. 예: TCP는 커널에 receive buffer가 있어서 —
도착한 데이터 → 커널이 수신 버퍼에 쌓음 → 앱이 read/recv로 거기서 꺼냄
- 버퍼에 있으면 바로 꺼내짐, 비었으면 read가 기다림
- 앱이 안 꺼내 버퍼가 차면 송신 측을 늦춤(흐름 제어)
즉 stream = 통로(소켓/파일 핸들 등), 그 뒤에 쌓이는 곳 = 버퍼.
위치
- stream은 네트워크만의 개념이 아니다. 파일 읽기 스트림, stdin/stdout, Node stream, 로그 파이프 등 "바이트를 순서대로 흘려보내거나 꺼내는 통로"는 다 같은 추상화.
- TCP는 이 stream 모델을 네트워크 위에(segment 전송 위에) 구현한 한 사례다.
참고
- TCP Byte Stream -- Transport Layer의 추상화다. — TCP가 이 stream 추상화를 segment 전송 위에 구현한 사례