TCP의 연결 수립/종료 과정에 대해 알아보자
네트워크
By Jeongmin Seo•6월 20일, 2025년
목차
TCP (Transmission Control Protocol)
- 연결 기반 (3-way handshake 사용)
- 신뢰성 보장: 순서 보장, 패킷 유실 시 재전송
- 흐름 제어, 혼잡 제어 포함
- 예시: HTTP, HTTPS, FTP, 이메일
UDP (User Datagram Protocol)
- 비연결형: handshake 없음
- 비신뢰성: 순서/유실 보장 없음
- 속도 빠름, 오버헤드 적음
- 예시: DNS, VoIP, 게임, 실시간 스트리밍
TCP vs UDP 비교
항목 | TCP | UDP |
---|---|---|
연결 방식 | 연결 지향 (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)
상대방이 다음에 보낼 것으로 기대되는 시퀀스 번호
간단 예시
-
클라이언트 → 서버 :
SYN
, Seq = X→ 클라이언트가 ISN(X)을 담아 보냄
-
서버 → 클라이언트 :
SYN + ACK
, Seq = Y, ACK = X+1→ 클라이언트의 ISN(X)을 잘 받았다고 ACK(X+1)로 응답
→ 서버가 ISN(Y)를 담아 보냄
-
클라이언트 → 서버 :
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는 이를 허용하여 데이터 손실을 방지함