1. 세 개념의 정의
|
주체 |
레이어 |
무엇을 기다리나 |
| RTO |
커널 |
TCP 커널 |
ACK |
| Connection Timeout |
애플리케이션 |
앱 |
3-way handshake 완료 |
| Read Timeout |
애플리케이션 |
앱 |
데이터 수신 |
2. Connection Timeout의 범위
- SYN / SYN-ACK 구간만 해당
- 이 시점은 RTT 샘플이 없으므로 initRTO = 1초 고정 사용
- 3번째 ACK부터는 RTT 측정 완료 → 동적 RTO 산출 → Read Timeout 영역
Client Server
|---SYN------->| initRTO = 1초 (RTT 측정 불가)
|<--SYN-ACK----| initRTO = 1초 (RTT 측정 불가)
|---ACK-------->| ← 여기서부터 동적 RTO (RTT 기반)
3. 레이어 구조
[ 애플리케이션 레이어 ]
connection timeout ── 연결 수립 구간
read timeout ── 데이터 송수신 구간
[ TCP 커널 레이어 ]
RTO ── 전 구간에서 묵묵히 재전송 중
- 두 레이어는 독립적으로 병렬 동작
- 앱은 커널의 재전송을 인지하지 못함
4. 핵심 원칙: 더 짧은 쪽이 이긴다
앱 timeout < 커널 RTO 소진 → 앱이 먼저 포기 → 소켓 close → 커널 재전송 중단
커널 RTO 소진 < 앱 timeout → 커널이 먼저 포기 → 앱에 ETIMEDOUT 반환
- 실무에서는 앱 timeout(수십 초)이 커널 RTO 소진(기본 924초)보다 짧아 앱이 먼저 포기하는 게 일반적
tcp_retries2를 작게 줄이면 커널이 먼저 포기하는 상황 발생 가능