CS/네트워크

TCP/IP (4): TCP - 데이터의 신뢰성을 보장하는 프로토콜

나디아 Nadia 2025. 6. 16. 14:29

 

TCP (Transmission Control Protocol)

: 데이터의 신뢰성을 보장하는 프로토콜

  • 일종의 보험 역할
  • ex) 택배 회사가 택배 분실 시 다시 보내주는 정책과 같음
    → 택배 기사가 사고나 다른 문제로 인해 고객에게 택배를 전달하지 못하면 다시 똑같은 물품으로 배송해준다는 정책
    → 이때 택배 기사는 물리 계층, 데이터링크 계층, 네트워크 계층, 트랜스포트 계층을 이용해 사용자의 집에 정확하게 택배를 전달해줌
    → 여기서 택배 기사가 사고가 나서 택배를 전달하지 못하면, 택배 회사는 다시 새로운 택배 기사를 통해 택배를 전달함
    • 실제로 택배를 전달해주는 것은 택배 기사, 즉 물리 계층, 데이터링크 계층(MAC), 네트워크 계층(IP), 트랜스포트 계층(Port)이지만, 정책적으로 신뢰성을 보장해주는 것은 트랜스포트 계층의 TCP임

 

 

개요

  • 물리 계층, 데이터링크 계층, 네트워크 계층을 이용하면 원하는 호스트에 정확하게 데이터를 전달할 수 있음
    → 하지만 문제가 발생해서 패킷의 내용이 왜곡되거나 분실되는 상황이 생길 수도 있음
    → 호스트에 제대로 된 데이터가 전달되지 못함
    ⇒ 이를 보완하기 위해 TCP가 등장

 

 

 

TCP 통신에서 사용하는 핵심 제어 신호

SYN (Synchronize) 연결 시작 요청 신호 "통신할래?"
ACK (Acknowledgment) 응답 확인 신호 "응, 잘 받았어!"
FIN (Finish) 연결 종료 요청 "이제 끝내자"
SEQ (Sequence Number) 데이터의 순서 번호 "이 데이터는 몇 번째야"

 

 

 


 

3 way handshake

: 통신을 시작하는 3단계 절차

  • 사용자와 상대방이 통신을 시작하는 단계로, 데이터를 3번 송수신하면서 통신에 필요한 약속을 하는 것 (= 악수)

 

사용자와 케이틀린이 TCP 통신을 하려는 상황

  1. 사용자가 케이틀린에게 SYN(Synchronization) 패킷을 보냄
  2. 케이틀린은 사용자에게 최대 세그먼트 길이와 ACK(Acknowledgement) 패킷을 보내 통신을 수락함

    • 최대 세그먼트 길이를 결정하는 이유
      TCP는 애플리케이션에서 전송하는 데이터를 Segmentation으로 분할해서 전송함
      • 분할하는 이유
        1. 너무 큰 데이터가 분실되는 경우 잃어버리는 데이터가 많기 때문
          → 데이터를 분할하면 일부 데이터가 분실되었더라도 그 부분만 다시 보내면 되기 때문에 효율적임
        2. 데이터링크 계층에서 보낼 수 있는 데이터의 최대 크기가 정해져있기 때문
      • ex) 만약 이더넷 프레임의 기본값을 사용한다면 최대 크기는 1,500 바이트임
        → TCP 헤더 20 바이트와 IP 헤더 20바이트를 제외하면 최대 크기는 1460임
  3. 이렇게 케이틀린이 최대 세그먼트 길이와 함께 응답 메시지를 전송하면 사용자도 응답 메시지를 보냄

    ⇒ 데이터가 3번 송수신 되면서 악수했기 때문에 3 way handshake라고 부름

 

 

 

TCP의 동작

  • TCP는 상대와 통신하기 위해 3 way handshake로 커넥션을 만듦
    • 3 way handshake로 커넥션이 확립됐으면 실질적인 데이터를 전송할 수 있음
  • 커넥션을 끊을 때는 4 way handshake로 진행

 

3 way handshake 이후 데이터 전송 상황

  1. 데이터와 함께 해당 데이터에 시퀀스 번호를 붙여서 케이틀린에게 전송함(14)
  2. 케이틀린은 사용자가 보낸 시퀀스 번호에서 데이터 크기만큼 더한 값(14)에 1을 더해 ack 필드에 적어서 응답함(ack: 14 + 14 + 1 = 29)
    • 상대가 보내는 데이터도 시퀀스 번호를 붙임(seq: 1000)
  3. 케이틀린의 ACK 메시지가 도착하면,
    • seq 번호: 케이틀린에게 받은 데이터의 ack 번호를 적어서 그 다음 데이터를 전송
      (seq: 29 → 케이틀린이 29번 데이터를 요청했다는 뜻)
    • ack 번호: 케이틀린에게 받은 데이터의 seq 번호(1000)에서 데이터의 크기를 더한 값(4)에 1을 더한 값을 적어줌
      (ack: 1000 + 4 + 1 = 1005)
  4. 만약 사용자가 보낸 데이터가 분실됐거나 케이틀린의 응답 메시지가 분실됐다면, 사용자에게 ACK 메시지가 돌아오지 않음
    시간이 지나도 케이틀린에게 응답이 오지 않는다면, 케이틀린이 데이터를 못 받았다고 가정하고 같은 데이터를 다시 보냄
  5. 케이틀린이 ACK 패킷을 제대로 보냈다면 사용자는 다음 패킷을 보내게 됨

⇒ 이렇게 데이터를 보낼 때마다 확인 응답을 받고, 확인 응답이 있어야만 다음 데이터를 보내는 방식으로 신뢰성 있는 데이터 전송을 보장함

 

 

 

4 Way Handshake

: 통신을 종료하는 4단계 절차

  • 사용자와 상대방이 통신을 종료하는 단계로, 데이터를 4번 송수신하면서 서로 연결을 끊는 데 필요한 약속을 주고받는 것 (= 작별 인사)
  • 커넥션을 끊을 때는 4 way handshake로 진행

 

케이틀린과 사용자가 TCP 연결을 끊는 상황 

  1. 먼저 연결을 끊으려는 호스트 측에서(케이틀린) FIN 패킷을 보냄
  2. 그럼 사용자는 케이틀린의 FIN 패킷에 대한 ACK 패킷과 함께 사용자의 FIN 패킷을 보냄
  3. 케이틀린은 사용자의 FIN 패킷에 최종적으로 ACK 패킷을 보내며 커넥션이 끊어짐