Quick Flow
SYN -> SYN-ACK -> ACK
data: sequence numbers + acknowledgments + retransmission
receive window: protect receiver
congestion control: protect network
FIN / ACK or RST: close or abortTCP의 신뢰성은 packet 하나를 반드시 한 번만 전달한다는 뜻이 아니라 연결의 byte stream을 순서대로 application에 제공하도록 손실과 중복을 transport에서 처리한다는 뜻입니다.
수립과 전달
Three-way handshake는 양쪽 sequence number와 연결 상태를 동기화합니다. 전송 중에는 byte 위치를 sequence number로 추적하고 acknowledgment로 수신 범위를 알립니다. 손실로 판단한 segment는 재전송될 수 있습니다.
Receiver window는 수신 측 buffer가 감당할 수 있는 양을 알리는 flow control입니다. Congestion window는 network 혼잡을 고려해 송신량을 제한하는 별도 메커니즘입니다.
종료와 오류
FIN은 한 방향의 정상적인 byte stream 종료를 나타내며 양방향 종료가 각각 진행될 수 있습니다. RST는 연결을 즉시 중단하는 신호입니다. 상대가 비정상 종료되거나 network가 끊긴 경우 즉시 알지 못할 수 있으므로 application heartbeat와 timeout이 필요할 수 있습니다.
자주 틀리는 점
- ACK가 왔다고 business transaction이 처리되었다고 판단하지 않습니다. Transport 수신과 application commit은 다릅니다.
- TCP keepalive 기본값을 실시간 장애 감지 요구에 그대로 의존하지 않습니다.
send성공이 상대 application read 완료를 뜻하지 않습니다.- Head-of-line blocking과 재전송 지연을 실시간 traffic 설계에서 고려합니다.
참고 링크
1 sources