본문 바로가기

전공/네트워크

전송 계층 - TCP 의 모든 것 (#1. 핸드세이킹, 혼잡제어)

반응형

TCP는 신뢰성이 중요한 통신에서 사용되는 프로토콜이다. 신뢰성을 높이기 위해 여러가지 부수적인 임무를 담당하고 있는데 그 중에 대표적인 것이 핸드셰이킹, 혼잡제어, 흐름제어다.

  • 논리적 연결- 핸드셰이킹을 통해 가상의 연결 터널(회선 통신)을 만들고 이를 통해서 데이터를 주고받는다.
  • 흐름제어- 송신자[Sender]와 수신자[Receiver]의 메시지 속도를 조절하여 오버플로우를 방지한다.
  • 혼잡제어- 송신자와 수신자 사이에 존재하는 네트워크의 혼잡도를 조절한다.

 

1. 핸드셰이킹[Handshacking]을 통한 논리적 연결 생성

논리적 연결이란 송신자와 수신자만을 위한 통로를 하나 만들어서 이 통로를 이용해서 통신하겠다는 의미이다. 한번 연결 통로를 만들어놓으면 이를 해지할 때까지 계속 이 통로 안에서 데이터가 오간다. 이러한 통신을 설정하기 위해서는 송수신자 간의 대화가 필요하다. 이 과정에서 송수신자 간에 메시지가 총 3번 오가기 때문에 3 way handshacking 라 한다. handshacking 과정을 자세히 살펴보기 이전에 보았던 TCP 패킷을 떠올려보자.

이 패킷의 Flags 영역인 U A P R S F의 역할에 대해 이전 포스팅에서 설명했다. 핸드셰이킹에서는 플래그의 S(SYN)와 A(ACK), F(FIN)가 사용되며 Sequence Number와 Ack Number가 활용된다는 사실을 염두한 후 아래 그림을 살펴보자. 클라이언트와 서버가 존재한다. 클라이언트는 서버와 TCP 연결을 수립하여 통신하고 싶어하는 상황이다.

 

1. 클라이언트는 연결을 요청하기 위해 TCP 메시지에 SYN 비트를 1로 세팅한 후 서버에게 전송한다. 여기서 Seq는 특정 번호를 지칭한다. x라고 가정해보자.

2. 메시지를 받은 서버는 일단, 클라이언트의 메시지를 잘 받았다는 연락을 줘야한다. 따라서 '이 메시지는 확인 메시지다'라는 의미로 ACK=1로 세팅한다. 그 후, 어떤 메시지에 대한 응답인지 알려줘야하기 때문에 이전에 받았던 Seq에 +1을 한 값을 ACK num으로 설정하여 보낸다. 따라서 ACK=1, ACK Num=x+1이 된다. 

또한 연결을 요청했기 때문에 연결이 지금 가능한 상황인지 아닌지에 대해 클라이언트에게 알려줘야 한다. 따라서 연결이 가능하다는 의미로 SYN=1 로 세팅한다. 또한 서버만의 Seq 번호를 하나 정하여 함께 전송한다. 위의 예시에서 서버는 Seq 번호로 y를 택했다.

따라서 서버는 SYN=1, Seq Num=y, ACK=1, ACK Num=x+1 으로 세팅한 후 클라이언트에게 메시지를 보낸다.

3. 해당 메시지를 받은 클라이언트는 서버가 자신의 메시지를 잘 받았다는 것과 연결이 가능하다는 것을 알았다. 따라서 '가능하다고? 알겠어 그러면 연결 수립해줘' 라는 의미로 ACK=1로 세팅한다. 그 후, 어떤 메시지에 대한 응답인지 알려주기 위해 ACK num=y+1로 세팅한다. 그 후 해당 메시지를 서버에게 보낸다.

4. 서버는 메시지를 받는다. 받은 메시지의 ACK num를 본 후, '아 내가 이전에 보냈던 메시지구나'라는 것을 알고 해당 클라이언트와 연결을 수립한다.

 

그 후 클라이언트와 서버는 충분히 통신한 후 연결을 끊고싶을 것이다. 이때 클라이언트 측에서 '연결 종료'를 위한 메시지를 보내야 한다. 연결을 끊을 때도 한번에 훅!하고 끊는 것이 아니라 앞서 핸드셰이킹처럼 세 번의 메시지를 주고 받아야 한다.

이때의 과정은 위와 같다. 그러나 이때는 SYN이 아니라 Finish를 의미하는 FIN 플래그를 세팅하여 통신한다.

연결 종료를 요청하는 중

1. 클라이언트는 연결을 끊기 위해 FIN=1을 세팅하여 메시지를 보낸다.

2. 서버는 해당 메시지를 받은 후, 메시지 잘 받았다는 표시로 ACK=1 메시지를 보내고 연결 종료하기 위한 준비를 한다.

3. 연결 종료 준비를 끝낸 서버는, '이제 연결 종료할게'라는 메시지를 보내기 위해, FIN=1을 세팅하여 메시지를 보낸다.

4. 클라이언트는 '응 종료해줘'라는 응답 메시지로 ACK=1 을 보낸다.

5. 서버가 이 메시지를 받은 후에야 최종적으로 연결이 종료된다.

 

반응형