CS/네트워크 - Top-down Approach + @
TCP의 연결과 종료 과정 - 흐름제어, 혼잡제어, 재전송 제어, 3-way handshake, 4-way handshake
조금씩 차근차근
2025. 4. 18. 19:12
본 게시글은 그림으로 공부하는 TCP/IP 구조 도서를 참고하였습니다.
TCP 의 주요 동작과 그 성공 시나리오들을 알아보자.
TCP의 상태는 크게 다음과 같이 분류할 수 있다.
- 접속 시작 단계
- 액티브 오픈
- 클라이언트가 커넥션을 만들어가는 처리를 의미한다.
- 패시브 오픈
- 서버가 클라이언트의 연결 요청을 받아들이는 처리를 의미한다.
- 액티브 오픈
- 접속 확립 단계
- 접속 종료 단계
- 액티브 클로즈
- FIN/ACK을 먼저 송출해서 커넥션을 종료하려는 처리를 의미한다.
- 패시브 클로즈
- FIN/ACK을 받고, 커넥션을 종료하는 과정을 받아들이려는 처리를 의미한다.
- 액티브 클로즈
TCP는 컨트롤 비트를 구성하는 8개 플래그를 '0' 또는 '1'로 설정해 다음 그림과 같이 TCP 커넥션 상태를 제어한다.
각 단계 별 주요 동작으로는 다음과 같은 것들이 있다.
- 접속 시작 단계
- 3-way handshake
- 접속 확립 단계
- 흐름 제어
- 혼잡 제어
- 재전송 제어
- 접속 종료 단계
- 4-way handshake
지금부터 각 단계의 주요 동작과, 그 동작 방식에 대해 알아보자.
접속 시작 단계: 3-way handshake
- 3번의 통신과정을 거쳐, 연결을 수립하는 과정을 의미한다.
- 양자 간에 송신 파이프/수신 파이프를 함께 열어야 하므로, 3번의 통신 과정이 필요하다.
작동 방식
- 먼저 클라이언트는 CLOSED, 서버는 LISTEN 상태에서 시작한다.
- 예시) 웹 브라우저에서 웹 서버에 HTTP로 액세스하는 경우
- 웹 브라우저는 웹 서버에 액세스하지 않는 한 CLOSED 상태이다.
- 웹 서버는 기본으로 80번 포트를 LISTEN 으로 하고, 커넥션을 받아들일 수 있다.
- 클라이언트는 SYN 플래그를 '1', 시퀀스 번호에 무작위값(그림의 x)를 설정한 SYN 패킷을 송신하고, 오픈 처리에 들어간다.
- 이때, 클라이언트는 SYN-SENT 상태로 전이하고, SYN/ACK 패킷을 기다린다.
- SYN 패킷을 받아들인 서버는 패시브 오픈 처리를 시작한다.
- SYN 플래그와 ACK 플래그를 '1'로 설정한 SYN/ACK 패킷을 반환한다.
- SYN-RECEIVED 상태로 전이한다.
- 이때 시퀀스 번호는 무작위(그림의 y), 확인 응답 번호는 SYN 패킷의 시퀀스 번호에 '1'을 더한 값(x+1)이 된다.
- SYN/ACK 패킷을 받아들인 클라이언트는 ACK 플래그를 '1'로 설정한 ACK 패킷을 반환하고, ESTABLISHED 상태로 전이한다.
- ACK 패킷을 받아들인 서버도 ESTABLISHED 상태로 전이한다.
접속 확립 단계: 흐름 제어
- 수신 측 단말이 수행하는 흐름 양 조정을 의미한다.
- 수신 측 단말은 "윈도우 사이즈" 필드를 이용해, 자신이 받을 수 있는 데이터 양을 알린다.
- 송신 측 단말은 해당 "윈도우 사이즈" 양 이상으로 데이터를 보내지 않음으로써, 버퍼에 들어가지 못하고 버려지는 데이터가 없도록 만든다.
접속 확립 단계: 혼잡 제어
- 송신 측 단말이 수행하는 흐름 양 조정을 의미한다.
cwnd
- Congestion Window
- 혼잡 제어 알고리즘에서 조절하는 패킷 송신 수
대략적인 동작 방식
- 최초에, slow start를 통해 차근차근 cwnd를 늘려나간다.
- RTT마다 2배씩 cwnd를 늘려나간다.
- 혼잡이 감지되면, cwnd를 다시 낮춘다.
- 이전에 혼잡이 발생한 부근까지 즉시 cwnd를 올린다.
- cwnd를 주기적으로 조금씩 더 올려보며, 시험해본다.
이를 2~4번을 반복하며 송신한다.
혼잡 감지 방식
- 로그 기반
- 패킷 로스가 발생하면, 혼잡이라고 판단한다.
- 지연 기반
- 지연이 발생하면 혼잡이라고 판단한다.
- 하이브리드 기반
- 패킷 로스와 지연 양쪽을 종합적으로 고려해 혼잡이라고 판단한다.
접속 확립 단계: 재전송 제어
- 패킷 유실이 발생했을 때 수행하는 패킷 재전송 기능을 의미한다.
- 재전송 제어는 다음 두가지 상황에서 발생한다.
- 중복 ACK(Duplicate ACK)
- 재전송 타임아웃(RTO)
중복 ACK(Duplicate ACK) - Fast Retransmit
- 확인 응답이 같은 ACK 패킷을 연속해서 송출할 때, 해당 ACK 패킷을 duplicate ACK 라고 한다.
- 송신 측 단말은 일정 수 이상 중복 ACK를 받으면, 대상이 되는 TCP 세그먼트를 재전송한다.
- 중복 ACK 를 트리거로 하는 재전송 제어를 Fast Retransmit이라고 한다.
- 해당 Fast Retransmit 이 발생하는 중복 ACK의 기준값은 OS나 그 버전에 따라 다르다.
재전송 타임아웃(RTO)
- ACK 패킷을 기다리기까지의 시간을 재전송 타이머로 유지하는 방식이다.
- 재전송 타이머는 ACK 패킷을 받으면 초기화된다.
접속 종료 단계: 4-way handshake
- 4번의 통신과정을 거쳐, 연결을 종료하는 과정을 의미한다.
- 일반적으로 커넥션은 자신의 송신 파이프를 먼저 끊는 것으로 시작한다.
- 따라서, 상대방 기준에 맞춰 파이프가 완전히 끊어지길 기다려야 하기 때문에, 그 시점부터 3번의 통신 과정이 필요하다.
- 해당 글의 우아한 커넥션 끊기 내용을 참고하면 좋다.
작동 방식
- 연결을 종료하고자 하는 측은 액티브 클로즈 처리를 시작한다.
- FIN 플래그와 ACK 플래그를 '1'로 한 FIN/ACK 패킷을 송신한다.
- FIN-WAIT1 상태로 전이한다.
- FIN/ACK 패킷을 받은 측은 패시브 클로즈 처리를 시작한다.
- FIN/ACK패킷에 대한 ACK 패킷을 송신하고, CLOSE-WAIT 상태로 전이한다.
- 자신의 연결 종료가 준비 완료될때까지 기다리는 시간을 갖는다.
- ACK를 받은 액티브 클로즈 측은 패시브 클로즈 측의 FIN/ACK 패킷을 기다리는 FIN-WAIT2 상태로 전이한다.
- 패시브 클로즈 측은 자신의 연결 종료 준비가 완료되면, FIN/ACK 패킷을 송신하고, 자신이 송신한 FIN/ACK 패킷에 대한 ACK 패킷, 즉 클로즈 처리에 대한 최후의 ACK 를 기다리는 LAST-ACK 상태로 전이한다.
- 패시브 클로즈 측으로부터 FIN/ACK을 받은 클라이언트는 그에 대해 ACK 패킷을 반송하고 TIME-WAIT 상태로 전이한다.
- TIME_WAIT 상태에 대한 내용은 해당 글의 TIME_WAIT 을 참고하면 좋다.
- ACK 패킷을 받은 패시브 클로즈 측은 CLOSED 상태로 전이하고, 커넥션을 삭제한다.
- 이와 함께, 커넥션에 확보하고 있던 모든 자원을 해제한다.
- 이것으로 패시브 클로즈는 종료된다.
- 액티브 클로즈 측은 설정한 시간이 경과하면 CLOSED상태로 전이하고, 커넥션을 삭제한다.
- 이와 함께, 커넥션에 확보하고 있던 모든 자원을 해제한다.
- 이것으로 액티브 클로즈는 종료된다.