TCP의 연결 수립/종료 과정에 대해 알아보자

네트워크
By Jeongmin Seo6월 20일, 2025년

목차

    TCP (Transmission Control Protocol)

    • 연결 기반 (3-way handshake 사용)
    • 신뢰성 보장: 순서 보장, 패킷 유실 시 재전송
    • 흐름 제어, 혼잡 제어 포함
    • 예시: HTTP, HTTPS, FTP, 이메일

    UDP (User Datagram Protocol)

    • 비연결형: handshake 없음
    • 비신뢰성: 순서/유실 보장 없음
    • 속도 빠름, 오버헤드 적음
    • 예시: DNS, VoIP, 게임, 실시간 스트리밍

    TCP vs UDP 비교

    항목TCPUDP
    연결 방식연결 지향 (3-way handshake)비연결
    신뢰성있음 (재전송, 순서 보장)없음
    속도느림빠름
    용도웹, 이메일 등스트리밍, 게임 등

    TCP 연결 수립 (3-way Handshake)

    
    
    • SYN (Synchronize)

      클라이언트가 초기 시퀀스 번호와 함께 서버에 연결 요청 전송

    • SYN-ACK (Synchronize-Acknowledge)

      서버가 클라이언트의 SYN을 수신한 뒤, 자신의 ISN을 클라이언트의 ISN + 1을 ACK 번호로 하여 SYN+ACK 응답 전송

    • ACK (Acknowledge)

      클라이언트가 서버의 응답을 받고 다시 서버의 ISN + 1을 ACK 번호로 하여 ACK를 전송하면서 연결 수립

    초기 시퀀스 번호 (Initial Sequence Number, ISN)

    • TCP 연결 시작 시 클라이언트와 서버가 각각 처음 사용하는 시퀀스 번호 설정
    • ISN을 기준으로 이후 데이터 패킷 시퀀스 번호 결정
    • 데이터 순서 관리 위해 각 바이트에 고유 시퀀스 번호 부여
    • 초기 설정 시 무작위(random) 값으로 설정하여 이전 연결과 구분, 보안성 강화
    • 클라이언트와 서버가 서로 다른 ISN 교환하여 데이터 순서와 연결 상태 관리
    • SYN과 FIN 플래그는 데이터 없이도 시퀀스 번호 공간을 1 차지한다.

    시퀀스 번호 (Sequence Number)

    데이터 바이트의 순서를 추적하기 위해 각 바이트에 부여되는 번호로, 연결 초기에는 ISN에서 시작하고 이후에는 전송한 바이트 수만큼 증가한다.

    ACK 번호 (Acknowledge Number)

    상대방이 다음에 보낼 것으로 기대되는 시퀀스 번호


    간단 예시

    1. 클라이언트 → 서버 : SYN, Seq = X

      → 클라이언트가 ISN(X)을 담아 보냄

    2. 서버 → 클라이언트 : SYN + ACK, Seq = Y, ACK = X+1

      → 클라이언트의 ISN(X)을 잘 받았다고 ACK(X+1)로 응답

      → 서버가 ISN(Y)를 담아 보냄

    3. 클라이언트 → 서버 : ACK, Seq = X+1, ACK = Y+1

      → 클라이언트가 서버의 ISN(Y)을 잘 받았다고 ACK(Y+1)로 응답


    TCP 연결 종료 (4-way Handshake)

    
    

    TIME WAIT

    • 클라이언트는 마지막 ACK를 보낸 후, 보통 2 * MSL 초 동안 TIME_WAIT 상태를 유지하며 연결을 완전히 종료하지 않는다.

    왜 즉시 연결을 끊지 않고 TIME_WAIT 상태를 유지하는 것일까?

    • 지연된 패킷 처리
      • 네트워크 상에서 라우터나 스위치 같은 중간 장비를 거치면서 패킷이 지연되거나 순서가 바뀔 수 있고, 일시적인 유실 후 재전송이 발생하기도 한다.
      • 이 때문에 이전 연결에서 보낸 패킷이 연결 종료 후에도 네트워크 어딘가에 남아 있을 가능성이 있다.
      • 만약 연결 정보를 즉시 제거하면, 이 지연된 패킷이 새로운 연결에서 잘못 처리될 수 있다.
      • TIME_WAIT 상태에서는 네트워크에 남아 있을 수 있는 지연 패킷이 완전히 사라질 때까지 같은 클라이언트 IP와 포트 조합을 2 × MSL 동안 재사용하지 않는다.
    • 재전송된 FIN 처리
      • 서버가 FIN을 보낸 후, 클라이언트가 보낸 ACK가 네트워크 상에서 손실될 수 있다.
      • 이때 서버는 자신이 보낸 FIN에 대한 ACK를 받지 못한 것으로 판단해, FIN 패킷을 다시 재전송한다.
      • 클라이언트가 TIME_WAIT 상태에 있다면, 이 재전송된 FIN을 받아서 다시 ACK를 보내 연결 종료를 확실히 완료한다.
    • 왜 2 * MSL 인가?
      • 0 ~ MSL: 네트워크에 떠다니는 지연된 패킷이 모두 도착하거나 사라지는 데 걸리는 최대 시간
      • MSL ~ 2 * MSL: 재전송된 종료 신호(FIN)가 도착했을 때 이를 처리할 충분한 시간

    FIN 이후 패킷이 도착하면 어떻게 될까?

    시나리오

    • 서버가 데이터 전송 후 FIN을 보냄
    • 서버가 보낸 데이터 패킷 중 일부가 네트워크 지연 등으로 인해 FIN 이후에 클라이언트에 늦게 도착

    처리 원칙

    • 지연된 패킷이 FIN 전에 전송된 정상 데이터라면 클라이언트가 TIME_WAIT 상태라도 해당 데이터를 정상적으로 수신하고 처리 가능
    • 이미 전송된 데이터는 지연되어 도착할 수 있고, TCP는 이를 허용하여 데이터 손실을 방지함