목적

- IP는 본질적으로 비신뢰 네트워크(Best Effort)

- 패킷이 유실되고, 순서가 뒤바뀌고, 중복 도착할 수 있음

- TCP는 이 위에서 "안 빠지고, 순서대로, 정확히" 전달하겠다는 약솔을 한 프로토콜

- 그 약속을 지키는 핵심 도구가 Sequence Number
[ Sequence Number가 하는 일 ]
1. 순서 보장
 - 패킷이 뒤바뀌어서 도착해도 Seq로 원래 순서대로 조립

2. 유실 감지
 - Ack의 gap으로 어떤 바이트가 빠졌는지 정확히 특정

3. 흐름 제어
 - Window Size + Seq 조합으로 "얼마나 더 보내도 되는지" 확인

동작 방식

핸드셰이크: 번호 합의

Client: SYN, Seq=1000                ← "나 1000번부터 시작할게" (SYN이 1000 소비)
Server: SYN+ACK, Seq=5000, Ack=1001  ← "나는 5000번부터" (SYN이 5000 소비)
Client: ACK, Seq=1001, Ack=5001      ← 합의 완료

데이터 전송: Seq + Len → Ack

Client: Seq=1001, Len=500    -> 바이트 1001~1500 전송
Server: Ack=1501             -> 1500번 까지 받음, 다음은 1501번 부터

공식: Ack = 상대의 Seq + Len

이 동작 때문에 발생하는 HOL

수신 버퍼 상태:

  [1001~1500 ✓] [1501~2000 ✗] [2001~2500 ✓] [2501~3000 ✓]
       도착           유실           도착           도착

  애플리케이션이 읽을 수 있는 범위:
  [1001~1500] 여기까지만.  나머지는 1501이 올 때까지 블로킹.

[ 설명 ]
- 2001 ~ 3000은 이미 서버에 도착해 있는데, 1501 ~ 2000 하나 때문에 전부 대기