TCP Out-of-Order 패킷 처리 방식: 데이터의 정결성을 지키는 내부 로직
인터넷이라는 복잡한 미로를 통과하는 데이터 패킷들은 각기 다른 경로를 거치거나 네트워크 정체를 만나면서 송신한 순서와 다르게 도착하곤 합니다. 이를 Out-of-Order(순서 어긋남) 패킷이라고 합니다. 만약 TCP가 이를 제대로 처리하지 못한다면 우리가 다운로드하는 파일은 깨지고 영상은 노이즈로 가득 찰 것입니다. 본 포스팅에서는 TCP가 순서가 뒤바뀐 패킷을 어떻게 보관하고, 정렬하며, 응용 프로그램에 전달하는지 그 정교한 매커니즘을 살펴보겠습니다.
1. Out-of-Order 패킷이 발생하는 원인
패킷의 순서가 뒤바뀌는 이유는 크게 세 가지로 요약됩니다.
- 다중 경로 라우팅(Multi-path Routing): 패킷마다 서로 다른 경로를 통해 전송되면서 도착 시간이 달라지는 경우
- 패킷 재전송(Retransmission): 중간에 특정 패킷이 유실되어 다시 보내지는 동안 이후 패킷들이 먼저 도착하는 경우
- 네트워크 장비의 병목 현상: 특정 라우터나 스위치에서 일시적인 처리 지연이 발생하는 경우
2. TCP 내부의 핵심 처리 기법
TCP는 수신한 패킷의 시퀀스 번호(Sequence Number)를 기준으로 다음의 과정을 거쳐 데이터를 재조립합니다.
2.1 재조립 큐(Reassembly Queue) 보관
수신 측 TCP는 현재 기대하는 시퀀스 번호(Next Expected Sequence Number)보다 큰 번호를 가진 패킷이 도착하면, 이를 즉시 응용 프로그램에 넘기지 않고 커널 메모리 내의 재조립 큐에 임시로 저장합니다.
2.2 중복 ACK(Duplicate ACK) 전송
순서가 어긋난 패킷을 받을 때마다, 수신 측은 송신 측에 “아직 나는 X번 패킷을 못 받았어”라는 신호로 마지막으로 정상 수신한 패킷의 다음 번호를 ACK로 보냅니다. 이것이 3번 이상 반복되면 송신 측은 빠른 재전송(Fast Retransmit)을 수행합니다.
2.3 SACK(Selective ACK) 옵션 활용
현대 TCP의 필수 옵션인 SACK는 “X번은 비었지만, 뒤에 도착한 Y번부터 Z번까지는 잘 받았어”라는 정보를 상세히 전달합니다. 이를 통해 송신 측은 유실된 조각만 골라 보낼 수 있고, 수신 측은 재조립 큐를 더 효율적으로 관리합니다.
3. 데이터 전달 및 윈도우 관리
| 상태 | TCP 내부 동작 | 응용 프로그램(Application) |
|---|---|---|
| 순서 일치 | 수신 버퍼로 즉시 이동 및 ACK 전송 | 즉시 읽기 가능 |
| 순서 어긋남 | 재조립 큐에 저장 및 중복 ACK 발생 | 데이터 존재를 알 수 없음 (대기) |
| 누락분 도착 | 큐에 있던 데이터와 결합하여 정렬 | 연속된 구간만큼 한꺼번에 읽기 가능 |
4. 성능에 미치는 영향: HOL Blocking
Out-of-Order 패킷 처리의 가장 큰 부작용은 Head-of-Line(HOL) Blocking입니다. 아무리 뒤쪽 패킷들이 많이 도착해 있어도, 앞쪽의 빠진 조각 하나가 채워지기 전까지는 전체 데이터가 응용 프로그램에 전달되지 못하고 멈춰 있게 됩니다. 이는 실시간 스트리밍이나 게임에서 ‘렉’을 유발하는 원인이 되기도 합니다.
결론: 혼돈 속의 질서, TCP 시퀀스 번호
TCP Out-of-Order 패킷 처리 방식은 불완전한 IP 계층 위에서 신뢰성이라는 완벽한 결과물을 만들어내는 정교한 설계의 산물입니다. 시퀀스 번호와 재조립 큐, 그리고 SACK라는 도구들을 통해 TCP는 데이터의 조각들을 원래의 모습으로 복원해냅니다. 네트워크 엔지니어라면 이러한 내부 로직을 이해함으로써 패킷 손실률이 높은 환경에서의 서비스 최적화 전략을 더욱 정밀하게 세울 수 있을 것입니다.
네트워크 지연이 심한 글로벌 서비스에서 netstat을 통해 out of order segments 수치를 모니터링해 보세요. 이 수치가 높다면 대역폭의 문제보다 라우팅 경로의 불안정성이나 패킷 손실을 의심해야 합니다.