본문 바로가기
학교공부/[컴퓨터 네트워크]

[컴퓨터 네트워크] - Transport layer_TCP Handshake

by 윈디개 2025. 5. 27.

저번 글에서는 간단하게 TCP의 flow control에 대해서 정리해 보았다. 이번글에서는 congestion control을 정리하기 전, TCP의 기본 연결 설정인 handshake에 대해서 정리해보려 한다.


1. TCP connection

 TCP는 sender와 receiver 사이의 1:1 연결을 통해 신뢰성있는 데이터 전송을 보장한다. 이런 연결과정은 Handshaking 방법을 통해 이뤄지는데, Handshaking에 대해서 자세히 알아보자.

 

 먼저 Handshaking이 뭔지 한 번 알아보자.

  • data를 주고 받기 전에, sender와 receiver가 "handshake"를 한다.
  • handshake를 한다는 의미는 connection을 설정하고(서로가 누군지 식별하고 연결을 설정하는 것),
  • connection parameter(시 seq #)에 대해서 서로 정보를 주고 받는 것.

 

 이전 글에서 TCP는 3-way handshaking 방식으로 연결 설정이 이뤄진다고 정리했었다. 3-way는 간단하게 설명하면, 3번의 정보를 주고 받은 뒤에 실제 data를 이용한 통신이 이뤄진다는 것이다.

 

-2-way Handshaking

 여기서 드는 의문은 2-way handshaking이면 되지 않을까라는 것이다. 다음 그림을 살펴보자.

 

위 그림을 보면, 2-way handshaking 방식을 사람의 의사소통 방식, server-client 방식으로 나타낸 것이다. 즉, 위에서 부터 차례대로 설명하면,

  • 왼쪽이 영희 오른쪽이 철수라고 가정하면
  • 영희가 Let's talk라는 메세지를 철수에게 전달해 철수가 ESTAB(승인)했다.
  • 철수도 OK라는 메세지를 영희에게 전달해 영희 측에서도 ESTAB(승인)했다.
  • 그 뒤, 실제 메세지를 주고 받을 것이다.

그 밑의 client-server 방식에서도 설명하면,

  • client가 서버에 x번째 데이터 대한 connection 요청 메세지를 보내고,
  • server가 메세지를 받아 ESTAB한 뒤
  • 승인 메세지를 client 측에 전달한다.
  • client도 ESTAB(승인)한 뒤 실제 데이터를 주고 받기 시작할 것이다.

겉으로 보기에는 2-way handshaking 방식으로도 문제가 전혀 없어 보일 것이다. 그렇지만 다음과 같은 문제가 존재한다. 그림으로 한 번 살펴보자.

위 그림에 대해서 설명해보면, 2-way handshaking 방식으로 이루어지는데,

  1.  client가 서버에 x번째 데이터 대한 연결 요청을 보냈다.
  2. 서버는 요청 메세지를 받고 ESTAB(승인)했다.
  3. 요청 승인 메세지에 대한 timeout이 일어나 client는 서버 측에 연결 요청 메세지를 retransmit한다.
  4. 요청 승인 메세지를 client에게 전달했다.
  5. client는 요청 승인 메세지를 받고 ESTAB(승인)했다.
  6. 그 후로 데이터를 주고 받은 뒤 특정 시점에 연결을 종료했다.
  7. 모종의 이유로 전에 retransmit한 연결 요청 메세지가 연결 종료 후에 도착했다.
  8. server는 또 다른 연결 요청으로 판단하고 요청 승인 메세지를 client측에 보낸다.

이렇게 되면, 서버는 불필요한 연결을 설정하게 되고, 반쪽짜리 연결이 발생하게 된다. 서버에는 요청 없는 연결을 설정해 이런 설정이 많이지면 서버에 부담이 될 수 밖에 없다.

 

또 다른 예시를 살펴보자.

 

위 그림에 대해 설명하면, 직전 그림과 비슷한 상황이지만 다음 상황이 다르다.

  1. 클라이언트가 x+1번째 ACK을 받지 못해 데이터를 재전송했다고 가정하자.
  2. 근데 이 재전송한 x+1번째 데이터가 연결이 종료된 후에
  3. x번째 데이터에 대한 요청 재전송 이 도착하고 server측에 도착했다고 가정해보자.
  4. server는 다시 연결을 ESTAB(승인)할 것이다

이렇게 되면 duplicated data인 x+1 데이터가 다시 들어오게 된 것이고, 서버에 당연히 부담이 될 것이다.

 

-3-way Handshaking

 위와 같은 2-way handshaking 문제를 해결하기 위해 TCP는 3-way handshaking 방식을 선택한다.

 

위 그림을 차례대로 설명해 보면,

  1. client와 server는 소켓을 만들어놓고 연결을 LISTEN 상태에서 기다린다.
  2. client는 seq #와 SYNbit를 정해서 server에게 연결 요청 메세지를 보낸다. (client 상태는 SYNSENT로 바뀐다.)
  3. server는 메세지를 받으면, seq #를 설정하고 SYNbit에 대한 ACK와, client가 설정한 seq #에 대한 ACK을 보낸다.    이때, TCP segment의 S field(flag)와 A field(flag)가 활성화되고, server의 상태는 SYN RCVD로 바뀐다.
  4. SYN와 seq #에 대한 ACK를 받은 client는 ESTAB(연결 승인)상태로 바뀌고, server의 SYNbit에 대한 ACK와 seq #에 대한 ACK를 보낸다.
  5. SYN과 seq #에 대한 ACK를 받은 server는 client가 활성화(ESTAB)상태인 것으로 판단하고 ESTAB(연결 승인)상태로 바뀐다.
  6. 그 뒤, client와 server는 실제 데이터를 주고 받는다.

이렇게 3-way handshaking 방식으로 TCP 연결설정을 하게 되면, 앞서 정리했던 2-way handshaking 방식의 문제를 해결할 수 있게 된다.

 

 앞서, 2-way handshaking에서는 연결 요청 메세지가 연결이 종료된 후에 도착한다면, 2-way handshaking 방식에서는 server에서 반쪽짜리 연결을 하는 문제가 발생한다.

 

 3-way handshaking에서는 server가 연결 요청을 받았다하더라도, server 측에서는 SYNbit와 seq #를 ACK와 함께 보낼 것이다. 이때, client는 연결이 종료된 후, 연결 요청을 보낸 적이 없기 때문에, 해당 메세지를 무시하고, 연결을 하지 않게 된다.


2. Closing TCP connection

 3-way handshaking을 통해 연결 설정을 한 후, 데이터를 다 주고 받았으면, 이제 연결 설정을 닫아줘야 된다. 연결 설정을  닫는 과정은 4-way handshaking으로 진행된다.. 다음과 같은 순서로 진행된다.

  1. client가 더 이상 보낼 데이터가 없으면 서버에 F(finish, FIN) = 1로 설정해 segment를 보낸다.
  2. 서버는 해당 F에 대한 ACK를 보낸다.
  3. server측도 더 이상 보낼 데이터가 없으면 F(finish, FIN) = 1로 설정해 segment를 보낸다.
  4. 클라이언트는 해당 segment에 대한 ACK를 보내고 연결을 종료한다.