[네트워크] TCP (feat. 3-way handshake, 4-way handshake)

Woonil·2025년 5월 17일
0

네트워크

목록 보기
3/6

TCP(Transmission Control Protocol)는 근거리 통신망이나 인트라넷, 인터넷에 연결된 컴퓨터에서 실행되는 프로그램 간 일련의 옥텟을 안정적으로, 순서대로, 그리고 에러 없이 교환할 수 있게 해주는 프로토콜이다. TCP는 3계층인 전송계층에 해당하는 프로토콜이며, 단위는 segment이다.

  • 헤더

    [출처: geeksforgeeks]
  • Flags
플래그명설명
U (Urgent)데이터의 우선순위가 높다는 의미
A (Acknowledge)응답
P (Push)
R (Reset)연결된 상태에서, 문제로 인해 연결 초기화시 사용
S (Synchronize)상대방과 연결시 동기화함
F (Finish)연결 종료

RST(RESET) 플래그

TCP 연결을 강제 종료할 때 사용되는 플래그로, 비정상적인 세션 연결을 끊어낼 때 설정한다. 악성코드가 감지된 경우, 자원 부족으로 인한 자원 할당을 해제해야 하는 경우, TCP 연결에 장애가 생긴 경우 사용될 수 있다.

IP와의 차이

IP(네트워크 계층)는 호스트와 호스트 사이의 데이터를 전송하는 반면, UDP/TCP(트랜스포트 계층)는 특정한 프로세스와 프로세스 간의 데이터를 수송한다. (하나의 호스트에는 하나 이상의 네트워크 응용 프로세스들이 동작하고 있다.)
ex) HTTP 클라이언트 프로세스와 HTTP 서버 프로세스 간 통신

🤔개념

🤝3-way handshake

TCP 통신에 있어 데이터 송수신(통신)을 위해서는 가상의 통신로(연결)를 확보해야 하며, 이 확보 과정에서 TCP 플래그의 코드 비트(6bit)가 활용된다. 패킷 교환이 총 세 번 이루어진다(클라이언트의 요청 - 서버의 응답 및 요청 - 클라이언트의 확인 응답). 3-way handshake는 한마디로 '데이터 송수신을 위해 필요한 연결 확립 과정'이라고 할 수 있다.

  • 사용되는 TCP 플래그
    • SYN(Synchronize sequence number: ‘동기화하다’ ⇒ 서로의 상태를 지속적으로 동기화
    • ACK(Acknowledgement): ‘받았음을 알리다’ ⇒ 상대방의 요청을 인지함을 알린다.

2번만 하면 될 것 같은데, 왜 3번을 하지?

TCP는 연결지향형 프로토콜로 양방향성 연결을 지향하므로 클라이언트와 서버는 서로의 존재를 서로에게 알리고 확인받는 과정이 필요하다. 따라서 2-Way로는 부족하다.

과정

  1. 클라이언트는 서버에 SYN 플래그가 세팅된 패킷이 보낸다.
    1. TCP의 SEQ번호에 난수를 부여 / ACK번호는 0으로 세팅

      난수 생성 이유

      클라이언트-서버 간 tcp 연결이 이전에도 이루어졌다면, 순차적으로 순서 부여 시 다른 tcp 연결로부터 오는 패킷으로 인식할 가능성이 존재하므로 난수를 생성하여 이러한 가능성을 줄인다.

  2. 서버는 클라이언트의 요청을 받고 요청을 수락한다는 ACK 플래그와 SYN 플래그가 같이 세팅된 패킷을 클라이언트에게 보낸다.
    1. TCP의 SEQ번호에 난수를 부여
    2. ACK번호에는 클라이언트로 받은 SEQ번호 + 1
  3. 클라이언트는 서버의 수락 응답인 패킷을 받고, ACK 플래그가 세팅된 패킷을 서버로 보낸다. ⇒ 연결 성립
    1. SEQ번호는 서버로부터 받은 ACK번호 ⇒ 동기화 완료
    2. ACK 번호에는 서버로부터 받은 SEQ번호 + 1

SYN Flooding

  1. 해커가 가상의 클라이언트로 위장해 표적 서버로 대량의 SYN 패킷을 전송한다.
  2. 공격 대상지인 서버는 각 연결 요청에 응답하며, 응답 수신 준비가 완료된 포트를 남겨둔다.
  3. 도착하지 않는 마지막 ACK 패킷을 서버가 기다리는 동안 해커는 계속해서 더 많은 SYN 패킷을 전송한다.
  4. 사용 가능한 모든 포트를 사용하고 나면 해당 서버는 정상적 기능 수행이 불가해진다.

⇒ 이에 대비하기 위해 수신지의 SYN 수신 대기 시간을 줄이거나 침입 차단 시스템을 활용할 수 있다.

Multi Thread

단일 스레드로는 여러 개의 요청이 왔을 때, 이전 요청의 처리로 인해 이후 요청이 스레드를 할당받기 위해 대기하는 상황이 생긴다. 이때, 처리 지연으로 두 요청 모두 죽어버릴 수 있다. 여러 개의 스레드를 생성하여 이런 문제를 해결할 수 있다. (요청마다 스레드를 생성하는 방식과 쓰레드 풀에 일정량의 스레드를 관리하는 방식 등이 있음)

🖐️4-way handshake

클라이언트와 서버가 데이터 통신이 종료된 이후에 해당 연결을 끊는 과정(세션 종료)으로, 양쪽 호스트 모두 그 주체가 될 수 있으며, 3-way Handshake와 마찬가지로 TCP 헤더의 플래그가 사용된다.

[사진 출처: https://velog.io/@nnnyeong/Network-TCP-3-way-4-way-Handshake]

과정

  1. 클라이언트는 서버에게 FIN 플래그를 설정한 패킷을 서버에 전송한다.

    FIN(FINISH) 플래그
    세션 연결을 종료시킬 때 사용되며 더이상 전송할 데이터가 없음을 나타낸다.

  2. 서버는 클라이언트에게 ACK 응답 패킷을 전송한다.

  3. 서버는 소켓을 해제하고 통신 종료를 의미하는 FIN 패킷을 클라이언트에 전송한다.

    소켓
    프로토콜, IP주소, 포트로 정의되며, 네트워크 상의 프로세스 간의 통신의 종착점이다. 대부분의 통신은 인터넷 프로토콜을 기반으로 하기에 대부분의 네트워크 소켓은 인터넷 소켓이다. (크게 UDP프로토콜을 사용하는 경우와 TCP프로토콜을 사용하는 경우로 나눌 수 있음)

  4. 클라이언트는 서버에게 ACK 응답 패킷 전송

    연결을 끊는 주체의 TIME-WAIT
    연결을 끊는 FIN를 보내는 엔드포인트가 마지막 ACK를 수신자에게 보낸 후 TIME-WAIT 상태에 빠지는 이유는?

    TIME_WAIT: 수신자로부터 FIN를 수신하더라도 일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정으로, 일정시간이 지나면 세션을 만료시키고 연결을 종료하며 CLOSE 상태로 변화

    • 수신자가 FIN를 전송하기 전에 전송한 패킷(ex. 마지막으로 세션을 종료하기 위한 과정에서 보내지는 데이터)이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 경우가 생기는 상황에 대비 가능
    • 수신자가 ACK 수신에 실패하면 수신자는 송신자에게 다시 한번 FIN를 송신하게 된다. ⇒ TIME-WAIT 상태 없이 통신을 종료하게 된다면 수신자는 정상적인 소켓 종료를 행하지 못할 것이다.

참고자료
[따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP 프로토콜 구조와 TCP의 플래그
[따라學IT] 09. 연결지향형 TCP 프로토콜 - TCP 3Way Handshake

profile
프론트 개발과 클라우드 환경에 관심이 많습니다:)

0개의 댓글