[CS]3 Way Handshake & 4 Way Handshake

김피자·2023년 2월 22일
0

CS

목록 보기
13/22

3 way handshake까지 오기위해 OSI 7, TCP/UDP, TCP/IP를 열정적으로 정리했다! 이제 드디어 시작


데이터 전송

TCP는 연결 지향 프로토콜이다.
예를 들어, A와 B사이트가 데이터를 전송하려면

  1. 2개의 TCP는 두 사이트 사이 연결을 설정
  2. 양 방향으로 데이터를 교환
  3. 연결 종료

위의 과정을 통해 진행이된다. 하지만 이 과정은 물리적 연결이 아닌, 가상으로 된 연결이다.
따라서 TCP는 데이터 스트림으로부터 데이터를 받아 들여 이것을 일정 단위로 분할한 다음 TCP 헤더를 덧붙여 TCP 세그먼트를 생성하고 그 다음, IP 데이터그램에 캡슐화되어 상대방과 주고 받게 된다.

TCP 세그먼트 = 세그먼트 헤더(TCP 헤더) + 데이터
IP 데이터그램: IP에서 사용하는 패킷


연결 보장


그림 설명

세그먼트가 손실되거나 손상되었다면 TCP는 잃어버린 세그먼트가 도착할 때까지 세그먼트를 유지한다.(IP는 그걸 모름)

  • Sequence number : 보내는 세그먼트 번호
    - 바이트 단위로 순서화되는 번호 (연결성을 확신하기 위해 전송되는 각 바이트에 번호가 부여된다.)
    - 이를 통해 신뢰성(3-Way Handshake) 및 흐름제어(sliding Window) 기능 제공

⚾️ 다른 쪽으로 전달되는 패킷은 여러 개의 서로 다른 경로를 거치면서 전달되기 때문에 패킷의 순서가 뒤바뀔 수 있다. 그래서 이를 받는 수신측에서는 받은 패킷을 다시 재조립 해야하는데 이때, Sequence number을 이용해 조립함

  • Acknowledgement(ACK) number : 받아야하는 세그먼트 번호
    - 세그먼트를 보내는 송신자가 다른 쪽으로부터 받기 기대하는 바이트 번호
    - 세그먼트 수신자가 상대로부터 바이트 번호 n을 성공적으로 수신했다면, n+1이 되어 확인 응답번호가 된다.

TCP는 전이중 모드로 데이터를 전송한다.
그래서 2개의 시스템에 있는 2개의 TCP들이 연결될 때 동시에 서로 세그먼트를 송신할 수 있는데 이는, 양쪽이 각각 통신을 초기화해야하고, 데이터를 전송하기 전 다른 한쪽으로부터 승인을 얻어야 한다는 것을 의미한다.


3 Way-HandShake

: TCP/IP 프로토콜을 이용해 통신하는 응용 프로그램이 데이터 전송을 하기 전, 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 뜻한다.

이전 글에서 TCP에 대해 말할때 계속 신뢰성 !! 신뢰성 거렸는데 3 way-handshake도 정확한 전송을 위한 신뢰성 있는 연결을 맺어준다.

예를 들어, 클라이언트가 서버와 연결을 만들기 원한다고 생각해보자

  1. 서버
    • 먼저, 서버가 TCP에 연결을 받아들일 준비가 됐다고 알린다.
      : 수동 개방 요청
    • 서버 TCP는 모든 연결을 받아들일 준비가 되어있지만, 스스로 연결을 유지할 수 없다.
  2. 클라이언트
    • 클라이언트는 능동 개방 요청을 유발한다.
    • 클라이언트는 특정 서버에게 연결이 필요하다는 것을 자신의 TCP에게 알린다.
  3. 이때 3 way handshake 절차가 시작된다.

[step 1]
클라이언트는 서버에 접속을 요청하는 SYN(연결요청)패킷을 보낸다.
이때, 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT(로컬에서 연결요청(SYN)을 보낸 상태), 서버는 Wait for Client 상태이다

[step 2]
서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN 플래그가 설정된 패킷을 보내고 클라이언트가 다시 ACK로 응답하길 기다린다.
이때 서버는 SYN_RECEIVED 상태가 된다.

[step 3]
클라이언트는 서버에게 ACK를 보내고 이후에는 연결이 이루어지고 데이터가 오가게 되는 것이다. 이때 서버의 상태는 ESTABLISHED

이와 같은 방식으로 통신하는 것이 그놈의 신뢰성 신뢰성 !!! 있는 연결을 맺어 준다는 TCP의 3 Way Handshake 방식이다.


4 Way Handshake

3 way handshake가 TCP의 연결을 초기화 할 때 사용했다면, 4 way handshake는 세션을 종료하기 위해 수행되는 절차이다.

[step 1]
클라이언트가 연결을 종료한다는 FIN 플래그를 전송한다. 이때 클라이언트는 FIN-WAIT 상태가 된다.

[step 2]
FIN 플래그를 받은 서버는 일단 확인메시지(ACK)를 보내고 자신의 통신이 끝날 때 까지 기다리는데 이 상태를 서버의 CLOSE_WAIT라고 한다.

[step 3]
서버의 통신이 끝났으면 연결을 종료할 준비가 됐다고 알리기 위해 클라이언트에게 FIN 플래그를 전송한다.
이때 서버의 상태는 LAST-ACK이다.

[step 4]
클라이언트는 해지 준비가 됐다는 ACK를 확인했다는 메시지를 보낸다.

근데 만약 서버에서 FIN을 전송하기 전에 ~~ 전송한 패킷이 지연으로 FIN보다 늦게 도착하는 상황이 발생했다면 어떻게 될까?

클라이언트에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 Drop되고 유실될 것이다.

이 현상에 대비하여 클라이언트는 서버로부터 FIN을 수신하더라도 일정시간(기본 240초)동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치게 되고, 이 과정을 TIME_WAIT라고 한다.

일정 시간이 지나면 세션을 만료하고 연결을 종료해 CLOSE한다.


자 여기까지 3, 4 way handshake에 대해 알아봤다.
TCP가 왜 그렇게 전송에 신뢰 신뢰!! 하는지 알겠다.
이러한 과정을 통하니 신뢰성이 보장될 수 밖에~~

근데 사실 세션 하이재킹나면 신뢰성도 다 꽝아닌가요...?!
일단 끗!


출처
https://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake
https://velog.io/@jinn2u/3-way-handshake
https://bangu4.tistory.com/74

profile
제로부터시작하는코딩생활

0개의 댓글