TCP Handshake
3-Way-Handshake
3-Way-Handshake란, 전송제어 프로토콜(TCP)에서 통신을 하는 장치간 서로 연결이 잘 되어있는지 확인하는 과정/방식이다.
쉽게 말해서 TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 확인하는 과정
이라고 할 수 있다.
3-Way-Handshake 과정을 통해 데이터를 주고받는 양 쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장 할 수 있어야하고, 실제로 데이터 전달을 시작하기 전에 한 쪽이 다른쪽이 준비되었다는 것을 알 수 있도록 한다.
3-Way-Handshake 과정
3-Way-Handshake는 클라이언트와 서버
사이에서 이루어지는데 A라는 클라이언트와 B라는 프로세스 사이의 예시를 통해 과정을 설명해본다.
먼저 포트의 상태 정보는 다음을 뜻한다.
- CLOSED: 포트가 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV: SYNC 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED: 포트 연결 상태
또 TCP Header 안의 플래그 정보는 다음과 같다.
- SYN (Synchroinize Sequence Number): 동기화 요청을 뜻함
- ACK (Acknowledgement Number) : 확인, 응답을 뜻함
- FIN (Finish) : 세션 연결을 종료시킬 때 사용
- A → B : SYN
- 접속 요청 프로세스 A가 연결 요청 메시지 전송 (SYN)
- 송신자가 최초로 데이터를 전송할 때 Sequence Number을 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
- PORT 상태 - B: LISTEN, A:CLOSED
- B → A: SYN + ACK
- 접속 요청을 받은 프로세스 B가 요청을 수락했으며, 접속 요청 프로세스인 A도 포트를 열어 달라는 메시지 전송 (SYN + ACK)
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송
- PORT 상태 - B: SYN_RCV, A:CLOSED
- A → B: ACK
- PORT 상태 - B: SYN_RCV, A: ESTABLISHED
- 마지막으로 접속 요청 프로세스 A가 수락 확인을 보내 연결을 맺음 (ACK)
- 이때, 전송할 데이터가 있으면 이 단계에서 데이터를 전송 할 수 있음
- PORT 상태 - B: ESTABLISHED, A: ESTABLISHED
위 과정은 다음처럼 표현 할 수 있다.
Client > Server : TCP SYN
Server > Client : TCP SYN ACK
Clinet > Server : TCP ACK
왜 SYN에 랜덤한 수를 전송할까?
연결을 맺을 때 사용하는 포트는 유한 범위 내에서 사용하고 시간이 지남에 따라 재사용된다. 따라서 두 통신 호스트가 과거에 사용된 포트 번호 쌍을 사용할 가능성이 존재한다.
또한 서버 측에서는 패킷의 SYN을 보고 패킷을 구부한게 되는데, 난수가 아닌 순차적인 number가 전송된다면 이전의 connection으로부터 오는 패킷으로 인식할 위험이 있다.
4-Way-Handshake
3-Way-Handshake가 연결을 설정하는 과정이였다면 4-Way-Handshake는 연결을 해제하는 과정
이다.
연결 해제란 서버와 상호작용을 통해 통신을 하다가 더 이상 통신을 하지 않겠다는 것을 의미한다.
4-Way-Handshake 과정
4-Way-Handshake 또한 클라이언트와 서버 사이에서 이루어지고 A라는 클라이언트와 B라는 서버를 예시로 과정을 설명한다.
- A → B : FIN
- 프로세스 A가 연결을 종료하겠다는 FIN 플래그를 전송
- 프로세스 B가 FIN 플래그로 응답하기 전까지 연결을 계속 유지
- B → A: ACK
- 프로세스 B는 일단 확인 메시지를 보내고 자신이 통신이 끝날 때 까지 기다린다 (TIME_WAIT 상태)
- 수신자는 Acknowledgement Number 필드를 (Sequence Number + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송한다.
- 자신이 전송할 데이터가 남아있다면 이어서 계속 전송한다.
B → A: FIN
- 프로세스 B의 통신이 끝났으면 연결 종료 요청에 합의한다는 의미로 프로세스 A에게 FIN 플래그를 전송한다.
A → B: ACK
- 프로세스 A는 확인했다는 메시지를 전송한다.
면접에 나올 수 있는 질문
Q. 3-way-handshake란?
A. TCP 통신에서 데이터를 전송하기 위해 네트워크 연결을 확인하는 과정이다
Q. 4-way-handshake란?
A. TCP 통신에서 네트워크 연결을 해제하는 과정
Q. 왜 2-way-handshake는 불가능할까?
A. TCP는 양방향 연결이기 때문에 클라이언트가 서버에게 존재를 알리고, 서버에서도 클라이언트에게 존재를 알린 뒤 대답을 얻어야한다.
총 4단계가 필요하며 축약한 것이 3단계 이므로 2 way로는 한계가 있다.
1단계: 클라이언트가 서버에게 존재를 알린다
2단계: 서버가 클라이언트의 존재를 알았다고 대답하며 클라이언트에게 존재를 알린다
3단계: 클라이언트가 서버의 존재를 알았다고 대답한다.
Q. 3 way handshake, 4 way handshake는 필수적인 과정인가?
A. 3,4 way handshake를 통하면 여러번 패킷을 주고 받는 과정이 포함된다. 하지만 이는 신뢰성 있는 연결인 TCP 특성상 보낸 데이터를 잘 받았는지, 그에 대한 잘 받았다는 응답 역시 잘 받았는지를 양측에서 확인하는 과정이다.
이러한 과정이 없다면 통신하던 중 예기치 않게 연결이 종료될 수 있고, 이는TCP의 신뢰성에 영향
을 끼치게 되므로 TCP 통신 과정에서는 필수적이라 할 수 있다.
참고
- [TCP] 3-way-handshake & 4-way-handshake
- [Network] TCP 3-way handshaking과 4-way handshaking
- [네트워크 쉽게 이해하기 22편] TCP 3 Way-Handshake & 4 Way-Handshake
- TCP 3-way Handshake, 4-way Handshake
기여자
Jongminfire
📦