TCP와 UDP를 비교하는 글에서 간단하게 3-way handshake라는 과정을 소개했다.
https://suzzeong.tistory.com/95
3-way handshake란 무엇인지? 4-Way Handshake란 무엇인지?
이제 조금 더 깊게 알아볼 것이다.
그 전에 TCP에 대해 다시 정리해 보자.
TCP(Transmission Control Protocol)란?
TCP(전송 제어 프로토콜)는 두개의 호스트를 연결하고 데이터 스트림을 교환하게 해주는 중요한 네트워크 프로토콜이다.
TCP는 데이터와 패킷이 보내진 순서대로 전달하는 것을 보장해준다.
TCP의 역할은 에러 없이 패킷이 신뢰할 수 있게 전달되었는지 보증해주는 것이다.
TCP의 특징으로는 동시제어가 가능하다는 것인데, 이것은 초기 요청이 작게 시작해도 컴퓨터들과 서버들의 대역폭의 깊이가 증가해도 네트워크가 지원할 수 있다는 것을 의미한다.
TCP는 3-way handshake라는 과정을 통해 연결 후 통신을 시작하고, 흐름제어와 혼잡제어를 지원하면서 데이터의 순서를 보장한다. 이 후 4-way handshake라는 과정을 통해 연결을 해제한다.
TCP 프로토콜의 작동
- 연결 생성 (Connection establishment) → 3-way handshake
- 자료 전송 (Data transfer)
- 연결 종료 (Connection termination) → 4-way handshake
신뢰성 있는 연결이 생성되어야하며, 그 후 자료를 전송하고, 마지막으로 연결을 종료하면서 할당된 자원을 반납한다.
TCP의 3-Way Handshake 란?
TCP 통신을 이용하여 데이터를 전송하기 위해 클라이언트와 서버 간에 네트워크 연결을 설정하는 과정이다.
양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제로 데이터 전달이 시작하기 전에 한 쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 말한다.
- SYN (A → B)
- 접속 요청 프로세스 A(클라이언트)가 SYN이라는 연결 요청 메시지 전송
- 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- PORT 상태 - B: LISTEN / A: CLOSED
- SYN-ACK (B → A)
- 접속 요청을 받은 프로세스 B(서버)가 요청을 수락했으며, 접속 요청 프로세스인 A(클라이언트)도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
- 수신자는 Acknowledgement Number 필드를 Sequence Number + 1로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- PORT 상태 - B: SYN_RCV / A: CLOSED
- ACK (A → B)
- PORT 상태 - B: SYN_RCV / A: ESTABLISHED
- 마지막으로 접속 요청 프로세스 A(클라이언트)가 수락 확인을 보내 연결을 맺음 (ACK)
- 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송할 수 있다.
- PORT 상태 - B: ESTABLISHED / A: ESTABLISHED
상태 | 설명 |
CLOSED | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN-SENT | SYN 요청을 한 상태 |
SYN-RECEIVED | SYN 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISEHD | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
3-way handshake는 TCP 연결의 안정성과 신뢰성을 보장하는 중요한 역할을 한다.
예를 들어, 클라이언트가 SYN 패킷을 보낸 후 응답을 받지 못하면, 클라이언트는 연결이 실패했다고 가정하고 다시 시도할 것이다. 이를 통해 네트워크 연결의 안정성을 보장할 수 있다.
TCP의 4-Way Handshake 란?
4-way handshake는 연결을 해제(Connection Termination)하는 과정이다.
여기서는 FIN 플래그를 이용한다.
FIN(finish): 세션을 종료시키는데 사용되며, 더 이상 보낸 데이터가 없음을 나타낸다.
- FIN(A → B)
- A가 연결을 종료하겠다는 FIN 플래그를 전송
- B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
- ACK (B → A)
- B는 일단 확인 메시지를 보내고 자신의 통신이 끝날 때까지 기다린다.
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다.
- FIN (B → A)
- B가 통신이 끝났으면 연결 종료 요청에 합의한다는 의미로 프로세스 A에게 FIN 플래그를 전송
- ACK (A → B)
- A는 확인했다는 메시지를 전송
상태 | 설명 |
CLOSE | 연결 수립을 시작하기 전의 기본 상태 (연결 없음) |
ESTABLISHED | 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다. |
CLOSE-WAIT | 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알린다. |
LAST-ACK | CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태. |
FIN-WAIT-1 | 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다. |
FIN-WAIT-2 | 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다. |
CLOSING | 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태 |
TIME-WAIT | 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다. |
포트(PORT) 상태 정보
- CLOSED: 포트가 닫힌 상태(연결 수립을 시작하기 전의 기본 상태)
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태
참고
https://developer.mozilla.org/ko/docs/Glossary/TCP
'IT 지식 > CS' 카테고리의 다른 글
프레임워크 vs 라이브러리 (0) | 2023.03.29 |
---|---|
Webpack(웹팩)이란? (0) | 2023.02.07 |
[Data Structure] ADT(추상적 자료형): 큐와 스택 (0) | 2023.01.10 |
시간 복잡도와 공간 복잡도 (0) | 2023.01.09 |
[Network] TCP vs UDP (0) | 2022.12.16 |