패킷이 중간에 사라지면 네트워크는 어떻게 반응할까? TCP 지연의 주범인 HoL Blocking과 똑똑한 재전송 매커니즘인 Fast Retransmit을 파헤칩니다.
데이터가 하드디스크를 떠나 네트워크를 타는 과정은 순탄치 않습니다. 이번에는 그 여정 중에 발생할 수 있는 **'패킷 유실'**과 그에 대응하는 TCP의 결벽증적인 태도를 분석해 봅니다.
특정 번호의 패킷이 사라졌을 때, TCP는 어떻게 평정심을 유지하며 데이터를 복구할까요?
슬라이딩 윈도우 방식으로 패킷 1번부터 5번까지 연속해서 보냈는데, 하필 3번 패킷만 중간에서 증발하거나 아주 늦게 도착하는 상황을 가정해 봅시다.
"1, 2번 잘 받았어. 이제 3번 줘." (ACK 3)
"어? 3번이 와야 하는데 4번이 왔네?" 수신측은 일단 4번을 버리지 않고 TCP Buffer에 보관합니다. 하지만 서버에게는 여전히 ACK 3을 보냅니다.
수신측은 계속해서 3번이 먼저 필요하다고 재촉합니다. 이때 SACK 정보를 실어 보냅니다. "난 아직 3번이 없어서 ACK 3이야. 하지만 **4, 5번(SACK 4-5)**은 이미 잘 챙겨뒀으니까 3번만 빨리 보내!"
이 상황에서 TCP의 가장 큰 성능 병목 중 하나인 HoL Blocking이 발생합니다.
read() 시스템 콜을 호출해서 데이터를 가져가려고 합니다.3번 데이터가 올 때까지 애플리케이션의 read() 호출은 멈춰 있거나(Blocking),
데이터가 없다는 응답을 받으며 대기하게 됩니다. 맨 앞줄(Head-of-Line)이
막혀서 뒤의 멀쩡한 데이터들이 나가지 못하는 현상, 이것이 바로 HoL
Blocking입니다.
TCP는 3번 패킷이 유실되었다고 판단할 때까지 무작정 타임아웃(Timeout)을 기다리지 않습니다. 여기서 3-Duplicate ACKs라는 규칙이 등장합니다.
왜 중복 ACK가 1번일 때는 가만히 있다가 3번이 되어서야 재전송을 할까요? 여기에는 네트워크의 불확실성을 극복하려는 공학적 타협이 담겨 있습니다.
네트워크는 복잡한 그물망입니다. 3번 패킷은 정체된 경로로 가고, 4번 패킷은 뻥 뚫린 경로로 우회해서 먼저 도착하는 일이 빈번합니다.
재전송은 단순히 패킷 하나를 더 보내는 것 이상의 큰 비용을 치릅니다.
단순한 순서 뒤바뀜인데 성급하게 재전송을 결정하면, 서버의 전송 속도가 불필요하게 반토막 나는 대참사가 발생합니다. 그래서 '3번'이라는 신중한 기준을 두는 것입니다.