TCP 3방향 핸드셰이크(SYN, SYN-ACK,ACK)
⚡ 스마트 요약
TCP 3방향 핸드셰이크는 모든 TCP 세션이 시작될 때 수행되는 연결 설정 절차입니다. 클라이언트와 서버는 SYN, SYN-ACK, ACK 패킷을 교환하여 시퀀스 번호를 동기화하고 애플리케이션 데이터의 단일 바이트를 전송하기 전에 양측이 준비되었는지 확인합니다.

TCP 3방향 핸드셰이크란 무엇인가요?
The TCP XNUMX방향 핸드셰이크 클라이언트와 서버가 사용하는 절차입니다. TCP/IP 네트워크 애플리케이션 데이터 교환 전에 안정적인 연결을 설정하기 위한 절차입니다. 이름에서 알 수 있듯이, 이 절차는 양측이 동기화(SYN) 패킷과 확인 응답(ACK) 패킷을 교환하고 사용할 초기 시퀀스 번호를 합의하는 세 단계로 구성됩니다.
핸드셰이크는 양쪽 종단점이 TCP 소켓을 대칭적으로 시작, 협상 및 종료할 수 있도록 설계되었습니다. 핸드셰이크가 완료되면 연결은 전이중 방식으로 작동하며, 어느 한쪽이 세션 종료를 알리는 FIN 신호를 보낼 때까지 양쪽에서 병렬로 데이터를 송수신할 수 있습니다.
TCP 메시지 유형
핸드셰이크 및 종료 과정에서 4개의 제어 플래그가 반복적으로 나타납니다.
| 메시지 | 기술설명 |
|---|---|
| SYN | 장치 간 연결을 시작하고 순번을 동기화합니다. |
| ACK | 이전 부분이 수신되었음을 상대방에게 확인시켜 줍니다. |
| 동기화 ACK | 결합된 메시지 — 로컬 장치의 SYN 메시지와 상대방의 이전 SYN 메시지에 대한 ACK 메시지. |
| END | 연결을 정상적으로 종료하는 데 사용됩니다. |
TCP XNUMX방향 핸드셰이크 프로세스
TCP 트래픽은 항상 3방향 핸드셰이크로 시작됩니다. 클라이언트는 서버에 세션 요청을 함으로써 통신을 시작합니다.
3자 악수 다이어그램.
- 1단계 — SYN: 클라이언트는 SYN 플래그가 설정된 세그먼트를 전송합니다. 이는 서버에 "통신을 시작하고 싶습니다"라는 메시지와 함께 초기 시퀀스 번호를 제안하는 것입니다.
- 2단계 — SYN-ACK: 서버는 SYN 및 ACK 플래그가 모두 설정된 세그먼트로 응답합니다. ACK는 클라이언트의 SYN에 대한 확인 응답이고, SYN은 서버 자체의 초기 시퀀스 번호를 제안합니다.
- 3단계 — 확인: 클라이언트는 서버의 SYN-ACK에 대한 응답으로 최종 ACK를 보냅니다. 이제 연결이 설정되었으며 양측 모두 작업을 시작할 수 있습니다. transmit팅 애플리케이션 데이터.
실제 사례
다음은 구체적인 수열을 사용한 예시입니다.
- 호스트 X는 서버로 TCP SYN 패킷을 전송하여 연결을 시작합니다. 이 패킷에는 임의의 초기 시퀀스 번호가 포함되어 있습니다(예: ).
4321— 이는 호스트 X가 전송할 바이트 스트림의 시작을 나타냅니다. - 서버는 SYN 패킷을 수신하고 SYN-ACK로 응답합니다. ACK 번호는 호스트 X의 시퀀스 번호에 1을 더한 값입니다.
4322), 그리고 SYN 패킷은 서버 자체의 초기 순번을 제안합니다. - 호스트 X는 서버의 순번에 1을 더한 값을 승인 번호로 하는 최종 ACK를 회신합니다.
데이터 교환이 완료되면 TCP는 4방향 FIN/ACK 시퀀스를 사용하여 연결을 종료하므로 양쪽 끝점이 소켓을 깔끔하게 해제할 수 있습니다.
TCP에 3자 핸드셰이크가 필요한 이유
핸드셰이크는 단순한 형식적인 절차가 아니라, 안정적인 바이트 스트림 전송과 관련된 세 가지 구체적인 문제를 해결합니다.
- 순번 동기화: 양쪽 피어는 상대방의 초기 시퀀스 번호를 알게 되는데, TCP는 이 번호를 사용하여 손실되거나 순서가 잘못된 세그먼트를 감지합니다.
- 연결 상태 일치: 세 번째 ACK는 서버의 SYN-ACK가 도착했음을 확인하는 것이므로, 양측 모두 ACK를 수신할 때까지 데이터 전송을 시작하지 않습니다. 설립 (주).
- 중복 패킷 보호: 무작위 초기 시퀀스 번호와 시간 기반 핸드셰이크 상태는 이전 세션의 오래된 세그먼트가 실수로 수락되는 것을 방지합니다.
TCP 핸드셰이크 시 흔히 발생하는 문제점
핸드셰이크는 안정적이지만, 식별 가능한 방식으로 오류가 발생하기도 합니다. 네트워크 엔지니어는 일반적으로 다음과 같은 오류 중 하나를 발견합니다.
- SYN 플러드 공격: 악의적인 클라이언트가 SYN-ACK에 응답하지 않고 수천 개의 SYN 패킷을 전송하여 서버의 연결 테이블을 고갈시킵니다. SYN 쿠키는 이러한 공격에 대한 표준적인 방어 수단입니다.
- 반개방형 연결: 세 번째 ACK가 손실되면 연결은 반쯤 열린 상태로 유지되다가 결국 타임아웃으로 인해 연결이 해제됩니다.
- 방화벽 또는 NAT로 인해 전송 중 연결이 끊어짐: 상태를 유지하는 미들박스가 상태를 잃어버리면 SYN-ACK 패킷을 드롭하여 클라이언트가 재시도를 하게 될 수 있습니다.
- RST 재설정: 서버가 요청된 포트에서 수신 대기 중이 아니면 SYN 패킷에 RST 패킷으로 응답하여 즉시 연결 시도를 종료합니다.


