3Way-Handshaking: TCP 연결 수립의 핵심 메커니즘
3Way-Handshaking: TCP 연결 수립의 핵심 메커니즘
- 개요
- TCP 연결의 필요성
- 3-Way Handshaking 개념
- 3-Way Handshaking 절차
- 다이어그램으로 보는 3-Way Handshaking
- 시퀀스 번호와 확인 응답 번호의 의미
- 실제 네트워크 패킷 분석 예시
- 3-Way Handshaking의 중요성
- TCP 상태 전이 과정
- 실제 사례: 웹 브라우저의 HTTP 요청
- 실패 시나리오와 대응 방법
- 3-Way Handshaking과 4-Way Handshaking의 비교
- 성능 최적화 기법
- 개발자 관점에서의 고려사항
- 결론
- Keywords
개요
네트워크 통신에서 신뢰성 있는 데이터 전송은 현대 인터넷의 근간을 이루는 중요한 요소입니다. TCP(Transmission Control Protocol)는 이러한 신뢰성을 보장하는 대표적인 프로토콜로, 데이터 전송 전에 먼저 '연결'을 수립하는 과정을 거칩니다. 이 연결 수립 과정의 핵심이 바로 3-Way Handshaking입니다.
TCP 연결의 필요성
- TCP는 연결 지향적(Connection-Oriented) 프로토콜
- 데이터 전송 전 양측 간 논리적 연결 수립 필요
- 신뢰성 있는 데이터 전송을 위한 사전 조건
- 순서 보장, 흐름 제어, 오류 복구 등의 메커니즘 사용 가능
3-Way Handshaking 개념
3-Way Handshaking은 TCP 통신에서 클라이언트와 서버 간 연결을 수립하기 위한 세 단계의 과정입니다. 이 과정을 통해 양쪽 모두 데이터를 주고받을 준비가 되었음을 확인하고, 초기 시퀀스 번호(ISN: Initial Sequence Number)를 교환합니다.
3-Way Handshaking 절차
1단계 (SYN): 클라이언트가 서버에 연결 요청
- 클라이언트 → 서버: SYN 패킷 전송
- 시퀀스 번호(seq) 초기화 (예: seq=100)
- SYN 플래그 = 1
2단계 (SYN+ACK): 서버가 클라이언트의 요청을 수락하고 응답
- 서버 → 클라이언트: SYN+ACK 패킷 전송
- 서버의 시퀀스 번호 초기화 (예: seq=2000)
- 확인 응답 번호 = 클라이언트의 시퀀스 번호 + 1 (ack=101)
- SYN 플래그 = 1, ACK 플래그 = 1
3단계 (ACK): 클라이언트가 서버의 응답을 확인
- 클라이언트 → 서버: ACK 패킷 전송
- 시퀀스 번호 = 받은 확인 응답 번호 (seq=101)
- 확인 응답 번호 = 서버의 시퀀스 번호 + 1 (ack=2001)
- ACK 플래그 = 1
이 과정이 완료되면 양방향 통신 채널이 수립되어 데이터 전송이 가능해집니다.
다이어그램으로 보는 3-Way Handshaking
sequenceDiagram
participant Client
participant Server
Note over Client,Server: TCP 연결 수립 과정
Client->>Server: 1. SYN (seq=100, ack=-)
Note right of Client: SYN 플래그 설정
Server->>Client: 2. SYN+ACK (seq=2000, ack=101)
Note left of Server: SYN, ACK 플래그 설정
Client->>Server: 3. ACK (seq=101, ack=2001)
Note right of Client: ACK 플래그 설정
Note over Client,Server: 연결 수립 완료, 데이터 전송 시작
시퀀스 번호와 확인 응답 번호의 의미
시퀀스 번호(Sequence Number):
- 각 호스트가 생성하는 초기 시퀀스 번호(ISN)
- 랜덤하게 생성되어 보안 강화
- 데이터 바이트 스트림의 위치를 식별하는 역할
확인 응답 번호(Acknowledgment Number):
- 상대방으로부터 다음에 수신하기를 기대하는 시퀀스 번호
- 수신 측이 어디까지 데이터를 받았는지 알려주는 역할
- 일반적으로 상대방의 시퀀스 번호 + 1
실제 네트워크 패킷 분석 예시
Wireshark와 같은 패킷 분석 도구로 3-Way Handshaking을 관찰할 경우:
Frame 1: Client -> Server (SYN)
Source Port: 54321
Destination Port: 80 (HTTP)
Sequence Number: 100
Flags: SYN
Frame 2: Server -> Client (SYN, ACK)
Source Port: 80
Destination Port: 54321
Sequence Number: 2000
Acknowledgment Number: 101
Flags: SYN, ACK
Frame 3: Client -> Server (ACK)
Source Port: 54321
Destination Port: 80
Sequence Number: 101
Acknowledgment Number: 2001
Flags: ACK
3-Way Handshaking의 중요성
신뢰성 확보:
- 양방향 통신 가능성 확인
- 패킷 손실, 중복, 순서 오류 방지 메커니즘 수립
초기 파라미터 교환:
- 초기 시퀀스 번호(ISN) 교환
- 윈도우 크기 등 TCP 옵션 협상
상태 관리:
- 서버와 클라이언트의 상태 동기화
- 연결 관리에 필요한 상태 정보 생성
TCP 상태 전이 과정
3-Way Handshaking 과정에서 각 호스트의 상태 변화:
stateDiagram-v2
[*] --> CLOSED
CLOSED --> SYN_SENT: 클라이언트가 SYN 전송
SYN_SENT --> ESTABLISHED: SYN+ACK 수신, ACK 전송
CLOSED --> LISTEN: 서버가 연결 대기
LISTEN --> SYN_RECEIVED: SYN 수신, SYN+ACK 전송
SYN_RECEIVED --> ESTABLISHED: ACK 수신
ESTABLISHED --> [*]: 데이터 전송 단계
실제 사례: 웹 브라우저의 HTTP 요청
웹 브라우저가 웹 서버에 HTTP 요청을 보내는 경우:
- 브라우저(클라이언트)가 www.example.com의 80번 포트로 연결 시도
- 3-Way Handshaking으로 TCP 연결 수립
- HTTP GET 요청을 전송
- 서버가 HTTP 응답 전송
- 연결 종료(4-Way Handshaking)
실패 시나리오와 대응 방법
SYN 패킷 손실:
- 클라이언트는 타임아웃 후 SYN 재전송
- 일반적으로 3~5회 재시도
SYN+ACK 패킷 손실:
- 서버는 SYN_RECEIVED 상태로 대기
- 클라이언트의 타임아웃 후 SYN 재전송 시 서버도 SYN+ACK 재전송
ACK 패킷 손실:
- 서버는 SYN_RECEIVED 상태로 타임아웃 대기
- 데이터 전송 시작되면 ACK가 포함되어 연결 확립
SYN Flooding 공격:
- 대량의 SYN 패킷으로 서버 자원 고갈 시도
- SYN Cookie, 백로그 큐 관리 등으로 방어
3-Way Handshaking과 4-Way Handshaking의 비교
3-Way Handshaking: 연결 수립 과정 (Connection Establishment)
- SYN → SYN+ACK → ACK
4-Way Handshaking: 연결 종료 과정 (Connection Termination)
- FIN → ACK → FIN → ACK
- 양방향 연결의 각 방향을 독립적으로 종료
성능 최적화 기법
TCP Fast Open (TFO):
- 재연결 시 SYN 패킷에 데이터 포함 가능
- 첫 RTT(Round Trip Time)에서 데이터 전송 가능
- 웹 페이지 로딩 시간 단축
TCP 연결 재사용:
- HTTP/1.1의 Keep-Alive
- HTTP/2의 멀티플렉싱
- 연결 수립 오버헤드 감소
개발자 관점에서의 고려사항
소켓 프로그래밍:
- 클라이언트:
connect()
함수 호출 시 3-Way Handshaking 수행 - 서버:
accept()
함수에서 클라이언트 연결 수락
- 클라이언트:
타임아웃 설정:
- 연결 타임아웃 적절히 설정
- 재시도 메커니즘 구현
리소스 관리:
- 불필요한 연결 최소화
- 연결 풀링(Connection Pooling) 고려
결론
3-Way Handshaking은 TCP 통신의 신뢰성을 보장하는 핵심 메커니즘입니다. 시퀀스 번호와 확인 응답 번호를 교환함으로써 양방향 통신의 기반을 마련하고, 데이터 전송의 안정성을 확보합니다. 네트워크 프로그래밍이나 시스템 설계 시 이 메커니즘을 이해하는 것은 효율적이고 안정적인 통신 시스템 구축의 필수 요소입니다.
Keywords
TCP, 3-Way Handshaking, SYN, ACK, 시퀀스 번호, 연결 수립, 신뢰성 통신, 패킷 교환, 네트워크 프로토콜, 통신 보안