minhui study

TCP Protocol(3-way handshake, 4-way handshake) 본문

네트워크/AWS와 함께하는 네트워크 개념과 보안

TCP Protocol(3-way handshake, 4-way handshake)

minhui 2020. 9. 18. 14:19

1. TCP(Transmission Control Protocol)

OSI 7Layer 중 4계층인 전송계층에 속하는 중요 프로토콜로 네트워크 망에 연결된 컴퓨터의 프로그램 간 데이터를 순서대로 에러없이 교환할 수 있게 하는 역할이다.

 

 

1) 연결 지향 프로토콜(Connection Oriented Protocol)

   → 물리적으로 전용회선이 연결되어 있는 것처럼 가상의 연결통로를 설정하여 통신하는 방식으로 가상의 연결통로를 가상회선이라 한다.

           ※ 가상회선방식 : 물리적으로 전용회선이 연결되어 있는 것처럼 논리적으로 동작하는 방식 

  → 논리적인 연결통로를 통해 데이터를 주고받음으로써 데이터의 전송순서를 보장해준다. 순서제어 라고도 한다.

  → 스트림 기반의 전송방식을 사용한다. 데이터를 임의의 크기로 나누어 연속해서 전송하는 방식을 사용한다.

 

 

 

2) 신뢰할 수 있는 프로토콜(Reliable Protocol)

    ① 흐름제어

        → 상대방이 받을 수 있을 만큼만 데이터를 효율적으로 전송하는 것

        → 흐름제어를 위해 Sliding Window방식을 사용한다.

          ※ Sliding Window : 상대방이 수신 가능한 크기(Window Size) 내에서 효율적으로 전송하기 위해 상대방이 받을 수 있 는 범위 내에서 연속적으로 전송하는 방식

 

    ② 오류제어

        → 데이터의 오류나 누락없이 안전한 전송을 보장한다.

        → 오류 또는 누락 발생 시 재전송을 수행하여 이를 보정한다.

 

     ③ 혼잡제어

         → 네트워크의 혼잡 정도에 따라 송신자가 데이터 전송량을 제어하는 것

         → 혼잡정도에 대한 판단기준은 데이터의 손실 발생 유무로 판단하며 전송한 데이터에 누락이 발생하면 네트워크가 혼잡한               상태로 판단하여 전송량을 조절한다.

 

 

 

2.TCP 연결/해제

TCP 프로토콜은 클라이언트와 통신을 하기 전에 3 way handshake( 3번의 악수 )를 통해 연결을 맺고, 연결을 종료할 때는 4 way handwake를 통해 연결을 끊는다.

각각의 TCP 연결과 해제 과정에 대해 알아보자

 

(1) 3 way handshake(Connection Establishment)

 

① 연결을 하기 전 클라이언트는 CLOSED상태이고, 서버는 요청을 기다리고 있는 LISTEN상태이다.

 

② 클라이언트에서 서버에 연결을 요청하는 SYN데이터를 전송한다.

 

③ 서버가 SYN을 받으면 잘 받았다는 ACK데이터와 함께 클라이언트 쪽에서도 포트를 열어달라는 SYN데이터를 보낸다.

    → 서버는 LISTEN상태에서 요청을 받고 상대방의 응답을 기다리는 SYN_RCV로 상태가 변경된다.

 

④ 클라이언트에서 서버로부터 ACK+SYN데이터를 받으면 클라이언트는 포트를 열고 이에 대한 확인으로 서버에 ACK데이터를 보내고 클라이언트는 ESTABLISHED상태로 바꾼다.

 

⑤ ACK데이터를 받은 서버 역시  ESTABLISHED상태로 변경되면서 클라이언트와 서버는 연결이 된다.

 

▷이렇게 3-way handshake라는 과정을 통해 클라이언트와 서버는 신뢰성있는 통신을 할 수 있게 된다.

 

 

(2) 4 way handshake (Connection Termination)

 

TCP연결을 위해 3 way handshake를 통해 ESTABLISHED하는 것과 달리 서로의 연결을 종료할 때는 4 way handshake를 수행한다. 새로 연결을 할 때보다 연결되어 있는 상황에서 종료할 때 예기치 못한 상황이 많기 때문에 과정이 더 까다롭다.

 

 

① 양쪽이 ESTABLISHED상태에서 클라이언트가 연결을 종료하겠다는 FIN플래그를 보내고, 자신의 상태를 종료요청 후 ACK를 기다리고 있다는 의미로 FIN_WAIT_1상태로 바꾼다.

 

② 서버는 알겠다는 의미로 클라이언트에 ACK데이터를 보내면서 애플리케이션의 소켓을 닫는다.

    → 이 때 자원을 정리하는데 시간이 걸리므로 소켓을 닫는데 기다리고 있는 상태라는 의미에서 CLOSE_WAIT상태로 바꾸고, 그 동안 연결 종료를 요청한 클라이언트는 서버로부터 응답이 올 때까지 기다리고 있다는 의미로 FIN_WAIT_2상태가 된다.

 

③ 애플리케이션에서 소켓을 닫으면 서버를 클라이언트로 FIN데이터를 보낸다. 그리고 자신은 클라이언트로부터 마지막 ACK을 기다리고 있는 LAST_ACK상태가 된다.

 

④ 클라이언트는 FIN데이터를 받으면 TIME_WAIT 상태로 바꾸면서 서버에 ACK데이터를 보낸다. 그리고 클라이언트는 TIME_WAIT상태에서 일정 시간이 되면 CLOSED 상태가 된다.

 

⑤ ACK데이터를 받은 서버 역시 CLOSED상태가 된다.

 

 

Comments