안녕하세요.
이번 글에서는 전송계층 프로토콜인 TCP의 Handshake에 대해 알아보겠습니다.
다음 글에서는 패킷 분석 프로그램인 Wireshark 를 사용해 실제 연결 및 종료 과정을 알아보겠습니다.
이를 이해하기 위해 먼저 OSI 7 Layer 에 대해 간단히 알아보겠습니다.
OSI 7 Layer

OSI 7 Layer 는 네트워크 통신의 단계를 나누어 다양한 네트워크 장비와 프로토콜 간 호환을 용이하게 하기 위해 만들어진 통신 모델입니다.
각 계층은 역할과 책임이 있습니다.
예를 들어 3계층인 네트워크 계층의 책임은 송신지에서 수신지로 패킷을 전달하는 게 목적입니다.
패킷이 전송될 방향을 알려주고, 패킷이 너무 크다면 적절하게 나누어 전송하지요.
이전 글에서 살펴봤듯이, 대부분의 이더넷 네트워크에서는 패킷의 최대 크기를 1,500 Byte로 제한합니다.
이 크기를 넘어서면 패킷을 나눠서 보내고, 나눠진 정보를 기록합니다. 이를 단편화(Fragment)라 합니다.

이 정보들을 3계층 IP 헤더에 기록하며, 기록하는 정보는 아래와 같습니다.
- 단편화된 패킷인지 (Flags의 DF필드 MF필드)
- 단편화 됐다면, 단편화된 패킷 중 몇 번째인지(Fragment Offset)
- 단편화된 패킷들의 원본은 어떤것인지(Identification)
이런 정보들이 있어야 받는 쪽에서 단편화된 패킷을 재조립할 수 있기 때문입니다.
Transport Layer
OSI 7 Layer 중 4 계층인 전송계층도 책임이 있습니다.
바로 데이터를 신뢰성 있게 전송하는 것입니다.
이때 신뢰성 이란, 데이터가 전송될 때 순서가 바뀌거나 잘못된 데이터가 전송되지 않도록 보장하는 정도입니다.
그렇다면, 어떻게 이 신뢰성을 보장할까요?
전송계층에는 대표적으로 TCP, UDP, QUIC와 같은 프로토콜들이 있습니다.
이들 프로토콜의 비교 분석에 대해서는 다른 글에서 다루고, 오늘은 TCP에 대해 알아보겠습니다.
TCP
TCP 프로토콜은 Transmission Control Protocol의 약자입니다.
번역하면 전송 제어 프로토콜이죠.
이 프로토콜이 신뢰성을 보장하는 방법은 오류 제어, 흐름 제어, 혼잡 제어 등 여러 가지 방법이 있습니다만, 오늘은 3-way-handshake 방식 연결 설정 및 종료에 대해 알아보겠습니다.

위의 그림처럼 TCP 프로토콜은 클라이언트와 서버가 통신하기 전에 연결을 수립하는 과정을 거칩니다.
그림의 동작 과정은 아래와 같습니다.
1. 클라이언트가 서버에게 SYN(Synchronization) 패킷을 전송합니다.
1-1. 이는 연결을 설정하기 위해 데이터를 전송할 준비가 되었음을 알리는 뜻입니다.
1-2. 이 패킷에는 순서를 의미하는 Sequence Number가 포함되어 있습니다. N이라고 가정하겠습니다.
2. 서버가 클라이언트에게 SYN-ACK(Acknowledgment) 패킷을 전송합니다.
2-1. 클라이언트의 연결 요청을 수신했음을 확인하는 동시에, 서버도 클라이언트와의 연결을 원한다고 알리는 뜻입니다.
2-2. 이때 보내는 ACK 응답의 값은 1번 과정에서 보낸 SYN 패킷의 순서번호인 N+1로 설정합니다.
2-3. 1-2의 과정에서 순서 번호를 보냈듯이, 이 과정에서도 순서 번호를 보냅니다. M이라고 가정하겠습니다.
3. 클라이언트가 서버에게 ACK 패킷을 전송합니다.
3-1. 클라이언트는 서버가 연결할 준비가 되었음을 확인하고, ACK의 값으로 서버가 보낸 순서 번호인 M+1을 설정합니다.
3-2. 이 이후에는 연결이 설정되었으며, 양쪽은 데이터 전송을 시작할 수 있습니다.
이와 같이 송신 측과 수신 측의 연결을 수립하기 위해 패킷이 3번(SYN, SYN-ACK, ACK) 전송되는 과정을 3-way-handshake 라 합니다.
3-way-hanshake에 대해 더 자세히 알아보겠습니다. 아래 그림은 TCP 헤더의 포맷입니다.

출발지 포트(16 비트), 목적지 포트(16 비트), 순서 번호(32 비트), 확인 번호(32 비트), 헤더 길이(4비트), 예약된 공간(6 비트)을 모두 더하면 106비트입니다.
즉 107비트부터 TCP의 Flags이고, Flags 중 SYN Flag의 값이 1이면 이전에 알아본 1번 과정, SYN Flag와 ACK Flag가 모두 1이면 2번 과정, ACK Flag가 1이면 3번 과정입니다.
TCP 연결 종료와 4-way-handshake
지금까지 알아본 3-way-handshake는 TCP 프로토콜이 송신 측과 수신 측 간 연결을 설정할 때 사용하는 방식이었습니다.
그렇다면, 연결을 종료할 때는 어떻게 종료할까요?
예상하셨겠지만, 4-way-handshake 방식입니다.

종료 과정도 순서대로 알아보겠습니다.
1. 클라이언트가 서버 측으로 종료 의사를 밝힙니다.
1-1. 이때 FIN 패킷은 TCP 헤더의 FIN Flag를 1로 설정한 패킷입니다.
1-2. 3-way-handshake와 마찬가지로, Sequence Number도 함께 전송합니다. M이라 가정하겠습니다.
2. 서버가 클라이언트 측으로 FIN 패킷에 대한 확인 응답을 보냅니다.
2-1. 이때 패킷의 순서 번호는 1-2 과정에서 보낸 M보다 1 큰 값인 M+1입니다.
3. 서버가 클라이언트 측으로 종료 의사를 밝힙니다.
3-1. 이때 FIN 패킷은 TCP 헤더의 FIN Flag를 1로 설정한 패킷입니다.
3-2. 3-way-handshake와 마찬가지로, Sequence Number도 함께 전송합니다. N이라 가정하겠습니다.
4. 서버가 클라이언트 측으로 FIN 패킷에 대한 확인 응답을 보냅니다.
4-1. 이때 패킷의 순서 번호는 3-2 과정에서 보낸 M보다 1 큰 값인 N+1입니다.
어떤가요?
1번-2번의 과정과 3번-4번의 과정이 거의 같습니다.
얼핏 보면 2-way-handshake 과정을 2번 한 것 같습니다.

TCP는 전이중(Full-Duplex) 통신을 지원하는 프로토콜입니다. 즉, 연결된 양쪽이 데이터를 자유롭게 전송할 수 있습니다.
클라이언트는 더 이상 보낼 데이터가 없어 전송을 종료하더라도, 서버는 아직 보낼 데이터가 남아있을 수 있습니다.
이 상태를 half-close 상태라 합니다.
이 상태에서 클라이언트는 서버로부터 계속 데이터를 수신할 수 있으며, 데이터를 다 받으면 ACK 패킷으로 응답합니다.
만약 이때 더 보낼 데이터가 없으면, 서버의 FIN 패킷이 전송됨으로써 연결을 종료합니다.
마치며
본 글에서는 TCP 프로토콜의 3-way-handshake와 4-way-handshake에 대해 알아봤습니다.
글의 집중도를 높이기 위해 TLS에 대해서는 다음 글에 작성하겠습니다.
지적 및 질문은 댓글로 남겨주시면 감사하겠습니다.
읽어주셔서 감사합니다.
'Network > L4' 카테고리의 다른 글
| Load Balancer 종류 소개 (2) | 2025.05.01 |
|---|---|
| 암호화 방식과 암호화 알고리즘 (0) | 2024.09.09 |
| TCP와 TLS의 동작 원리 #2 (2) | 2024.09.07 |