[Network] TCP의 핸드쉐이크

JeongYong Park·2023년 5월 8일
1

성공과 실패를 결정하는 1%의 네트워크 원리 책에서 연결을 생성하고 종료하는 방법이 간단하게 나와있었습니다. 그러던 중 이런 생각이 들었습니다.

어? 이거 3-way handshaking 같은데?

이대로 넘어가기에는 아쉬워 해당 과정이 어떻게 이루어지는지 작성해 보고자 합니다.

TCP

TCP(Transmission Control Protocol)은 네트워크 통신에서 가장 널리 사용되는 프로토콜 중 하나로, 신뢰성 있는 데이터 전송을 보장하는 것으로 알려져 있습니다. TCP는 연결 지향적인 프로토콜로서, 통신을 시작하기 전에 클라이언트와 서버 간 정상적인 연결을 하는 과정을 거치게 됩니다. 이 과정을 3-way handshake라고 부르며 클라이언트와 서버간 안정적인 통신 경로를 구축하는 핵심 역할을 합니다.

연결지향 프로토콜

핸드쉐이크에 대해 이야기하기 전에 TCP에서 얘기하는 연결지향에 대해 알아보고자 합니다.
TCP는 연결지향 프로토콜의 대표적인 예입니다. TCP 프로토콜은 두 프로세스가 데이터를 주고받기 전에 논리적인 연결이 수립되는걸 요구합니다. 해당 연결은 통신 작업이 일어나던 중에 계속 지속되어야 하고 통신이 끝나면 해제되어야 합니다.

그러면 TCP 프로토콜은 왜 연결상태를 유지하는 걸까요? 이는 연속적인 데이터를 순서에 맞게, 신뢰성있게 전송하기 위해서입니다. (이 외에도 TCP 프로토콜은 흐름 제어, 혼잡 제어 측면에서도 연결상태를 유지합니다.)

TCP는 연결이 유지되는 동안 데이터의 순서와 신뢰성을 보장하게 됩니다. 이를 위해 TCP 스트림은 세그먼트로 나뉘어 IP 패킷이라고 불리는 작은 조각을 통해 전송됩니다.

이런 연결지향 특성은 TCP의 사용분야에 매우 적합합니다. 예를 들어 클라이언트가 웹 사이트에 접속한다던지, 파일을 전송할 때 데이터의 신뢰성과 정확성이 매우 중요한 요소로 작동하게 됩니다. 이때 TCP의 연결지향성은 데이터의 손실을 최소화하고 중복 데이터 전송을 방지하게 됩니다.

따라서 TCP의 3-way handshake는 클라이언트와 서버 간의 안정적인 연결을 설정하기 위한 핵심 과정이 됩니다.

3-way handshake

그렇다면 클라이언트와 서버는 어떻게 연결을 만들게 될까요? 이름에서부터 알 수 있듯이 세 번의 통신 과정을 거쳐 연결을 수립하게 됩니다.

3-way handshake는 아래 세 단계를 거쳐 이루어지게 됩니다.

  1. SYN: 클라이언트가 서버에게 연결 요청을 보냅니다. 클라이언트는 SYN(시작) 패킷을 보내고, 이 패킷에는 클라이언트가 사용할 임시 포트 번호와 초기 시퀀스번호가 포함됩니다. SYN 패킷은 서버로 전송되고, 클라이언트는 SYN_SENT 상태로 전환됩니다.

  2. SYN+ACK: 서버는 클라이언트의 연결 요청을 받고, 클라이언트로부터 받은 SYN 패킷에 대한 응답으로 SYN+ACK 패킷을 보냅니다. SYN+ACK 패킷은 서버의 초기 순차번호와 클라이언트의 초기 순차번호+1로 구성됩니다. 서버는 이제 클라이언트로부터의 연결 요청을 받을 준비가 되었음을 알리기 위해 SYN+ACK 패킷을 전송하고, SYN_RCVD 상태로 전환됩니다.

  3. ACK: 클라이언트는 서버로부터 받은 SYN+ACK 패킷에 대한 응답으로 ACK(확인) 패킷을 보냅니다. 이 패킷은 서버의 시퀀스번호+1을 포함하고 있습니다. 이제 클라이언트와 서버 간에 연결이 성립되었으며, 클라이언트는 ESTABLISHED 상태로 전환됩니다. 서버도 정상적인 ACK 패킷을 받으면 ESTABLISHED 상태로 전환됩니다. 이제 양쪽은 안정적인 연결을 갖추게 되었고, 데이터 전송이 가능해집니다.

CLOSED

아무런 연결이 없는 상태이다.

LISTEN

서버가 클라이언트의 연결 요청을 기다리고 있는 상태이다. 클라이언트가 보내기 전까지 서버는 이 상태를 유지하게 됩니다.

SYN-SENT

클라이언트가 SYN 플래그가 있는 패킷을 보낸 상태입니다.

SYN-RECEIVED

서버가 SYN 플래그가 포함된 패킷을 받고, SYN+ACK를 응답으로 보낸 상태입니다. SYN+ACK를 응답으로 보낼 때 시퀀스 번호를 클라이언트가 보낸 시퀀스 번호 + 1로 보내게 됩니다. 이후 ACK를 수신할 때까지 SYN_RECEIVED 상태를 유지합니다.

ESTABLISHED (클라이언트)

클라이언트는 자신이 맨 처음에 보냈던 시퀀스 번호와 서버로부터 받은 시퀀스 번호 + 1값을 통해 제대로 연결이 이루어졌는지 확인합니다. 이후 클라이언트는 연결이 성립되었다고 판단해서 서버로부터 받은 시퀀스 번호 + 1값과 ACK플래그가 포함된 패킷을 다시 서버로 전송하게 됩니다.

ESTABLISHED (서버)

서버 또한 클라이언트로부터 받은 시퀀스 번호와 자신이 보낸 시퀀스 번호의 차가 1이라면 연결이 정상적으로 수립된 것으로 판단하고 ESTABLISHED 상태로 진입하게 됩니다. 이때부터 클라이언트와 서버는 통신을 시작하게 됩니다.

결론

TCP는 연결지향 프로토콜로, 다음과 같은 특징이 있습니다.

  • 신뢰성
  • 순서 보장
  • 흐름제어
  • 혼잡제어

클라이언트-서버 구조에서 연결을 수립하기 위해 3-way handshake 과정을 거치게 됩니다.

TCP 프로토콜이 연결을 수립하기 위해 얼마나 많은 작업을 수행하는지 알 수 있는 시간이었습니다.

profile
다음 단계를 고민하려고 노력하는 사람입니다

2개의 댓글

comment-user-thumbnail
2023년 5월 10일

SYN ACK 관계에 대해서만 알고 있었는데
그 상세 과정을 되게 잘 써주셨네요..! 공부하고 가요 📚

1개의 답글