CS Repo/네트워크 - Top-down Approach + @

TCP란? 그리고 TCP 패킷의 형태, Selective ACK(SACK)

조금씩 차근차근 2025. 4. 18. 19:01

본 게시글은 그림으로 공부하는 TCP/IP 구조 도서를 참고하였습니다.

 

전송 계층의 프로토콜, TCP에 대해 알아보자.

TCP란?

  • Transmission Control Protocol
  • 데이터 전송의 신뢰성을 요구하는 애플리케이션에서 사용된다.
  • 애플리케이션 데이터를 송신하기 전에, TCP 커넥션이라는 논리적인 통신로를 만들어, 통신 환경을 정비한 후 통신을 수행한다.
    • 송신 파이프
    • 수신 파이프
  • 송신 측 단말과 수신 측 단말이 2개의 논리적인 파이프를 전이중으로 사용해 송신과 수신을 확인해가며 데이터를 전송한다.
  • QUIC 때문에 확실하진 않지만, 2020년 기준 현재 인터넷상의 트래픽의 80% 이상이 TCP로 구성되어 있다.
  • IP 헤더의 프로토콜 번호는 '6(0x06)'으로 지정되어 있다.

TCP 패킷 포맷

TCP의 패킷 포맷. 화이트 모드로 보기를 권장한다.

  • 신뢰성을 요구하기 때문에, UDP 보다 다소 복잡한 TCP의 패킷 포맷에 대해 알아보자.
  • TCP 의 헤더 길이는 최저 20바이트(160비트)이다.

송신지/수신지 포트 번호

  • 애플리케이션의 식별에 사용되는 2바이트 숫자이다.
  • 하나의 포트에서, 다양한 IP주소에서의 요청을 받아낼 수 있다.
  • 자세한 내용은 포트번호를 참고하자.

시퀀스 번호

  • TCP 세그먼트를 올바른 순서로 정렬하기 위해 사용되는 4바이트(32비트)의 필드이다.
  • 송신 측 단말은 애플리케이션에게서 받은 데이터의 각 바이트에 초기 시퀀스 번호(ISN)에서 연번을 부여한다.
  • 수신 측 단말은 받은 TCP세그먼트의 시퀀스 번호를 확인하고, 번호순으로 정렬해 애플리케이션에 전달한다.
  • 3-way handshake 시 무작위 값이 초기 시퀀스 번호로 설정된다.
  • TCP 세그먼트를 송신할 때마다 송신한 바이트 수만큼 더해진다.
  • 4바이트로 관리할 수 있는 데이터 양(4GB)가 넘어가면, 다시 0으로 돌아가 증가한다.

확인 응답 번호(ACK 번호)

  • ACK 번호라고도 불린다.
  • 컨트롤 비트의 ACK 과는 다름에 주의하자.
  • "다음은 여기서부터 데이터를 주십시오." 라고 상대에게 전달하기 위해 사용하는 4바이트(32비트) 필드이다.

데이터 오프셋

  • TCP 헤더의 길이를 나타내는 4"비트" 필드이다.(바이트가 아님에 주의하자.)
  • TCP 헤더의 길이를 4바이트로 환산한 값이 들어있다.
  • 남은 4비트는 "예약 영역"으로, 추후 확장을 위해 개념만 존재하고, 0으로 채워 넣는다.

컨트롤 비트

  • 커넥션의 상태를 제어하는 필드이다.
  • 8비트 플래그로 구성되어 있으며, 각 비트가 다음 표와 같은 의미를 나타낸다.
비트 플래그 이름 설명 개요
1번째 비트 CWR Congestion Window Reduced ECN‑Echo에 따라, 혼잡 윈도우가 줄어든 것을 알리는 플래그. 명시적으로 혼잡을 알리는 ECN(Explicit Congestion Notification)에서 사용된다.
2번째 비트 ECE ECN‑Echo 혼잡이 발생했음을 통신 상대에게 알리는 플래그
3번째 비트 URG Urgent Pointer field significant 긴급 데이터를 처리해야 함을 나타내는 플래그
4번째 비트 ACK Acknowledgment field significant 수신한 데이터에 대한 확인 응답을 나타내는 플래그
5번째 비트 PSH Push Function 받은 데이터를 바로 애플리케이션으로 전달하도록 지시하는 플래그
6번째 비트 RST Reset the connection 연결을 강제로 재설정(끊기)하는 플래그
7번째 비트 SYN Synchronize sequence numbers 연결 설정을 시작하기 위해 시퀀스 번호를 동기화하는 플래그
8번째 비트 FIN No more data from sender 더 이상 보낼 데이터가 없음을 알리고 연결을 종료하는 플래그

윈도우 사이즈

  • 받은 데이터 크기를 알리기 위한 필드이다.
    • 아무리 고성능의 단말이라도, 한번에/오류 없이 패킷을 받을 수는 없다.
    • 그래서, '이만큼은 받을 수 있다!'라고 알릴 방법이 필요하다.
  • 확인 응답을 기다리지 않고 받을 수 있는 데이터 크기를 윈도우 크기로 알린다.
  • 2바이트로 구성되며, 최대 65535바이트까지 알릴 수 있다.
  • 0이면 더이상 받을 수 없음을 나타낸다.
    • 흐름제어 참고

체크섬

  • TCP 세그먼트가 손상되지는 않았는지, 정합성을 체크하기 위해 사용하는 2바이트(16비트) 필드이다.

긴급 포인터

  • 컨트롤 비트의 URG 플래그가 '1'로 설정되었을 때만 유효한 2바이트(16비트) 필드이다.
  • 긴급 데이터가 있을 때, 긴급 데이터를 나타내는 가장 마지막 바이트의 시퀀스 번호가 설정된다.

옵션

  • TCP에 관련된 확장 기능을 알리기 위해 사용된다.
  • 4바이트 단위로 변화하는 필드이며, 'kind' 값에 따라 정의된 몇가지 옵션을 "옵션 리스트"로 나열하는 형태로 구성되어 있다.
  • 대표적인 옵션으로는 다음이 있다.
    • 2 - MSS
      • 애플리케이션 데이터의 최대 크기를 알린다.
    • 4 - SACK Permitted
      • Selective ACK에 대응한다.
    • 5 - SACK
      • Selective ACK에 대응할 때, 이미 수신한 시퀀스 번호를 알린다.
    • 34 - TCP Fast Open
      • TCP Fast Open에 대응하는 것을 알리고, Cookie 정보를 전달한다.

MSS

  • Maximum Segment Size
  • TCP 페이로드의 최대 크기를 의미한다.
  • 3-way handshake 시, 서로 MSS 값을 교환하게 된다.
  • 예시) MTU와의 비교
    • MTU
      • IP 패킷의 최대 크기이다.
      • 인터넷의 경우, 기본값이 1500바이트
    • MSS
      • TCP 세그먼트에 삽입할 수 있는 애플리케이션 데이터의 최대 크기이다.
      • 일반적으로 IPv4 에서는 MTU - 40바이트(IP헤더+TCP헤더)가 된다.
      • IPv6에서는 MTU - 60바이트(IP헤더+TCP헤더)가 된다.

SACK

  • 사라진 TCP 세그먼트만을 재전송하는 기능이다.
    • 위 ACK 내용을 보면, TCP 는 애플리케이션 데이터를 어디까지 받아들이는가를 ACK 번호만으로 판단한다.
    • 그렇기 때문에 부분벅으로 TCP 세그먼트가 사라지면, 사라진 TCP 세그먼트 이후의 모든 TCP 세그먼트를 재전송해야 한다.
    • 해당 비효율을 개선하기 위해 Selective ACK 기능을 사용한다.
  • 부분적으로 TCP 세그먼트가 사라진 경우
    • '어디서부터 어디까지 받았는가' 라는 범위를 옵션 필드로 알릴 수 있다.
  • 예시: SACK 미지원

SACK를 미지원할 경우 발생하는 통신의 시퀀스 다이어그램. 이미 전송한 4, 5, 6번 패킷까지 재전송하는걸 확인할 수 있다.

  • 예시: SACK 지원

훨씬 최적화된 SACK 지원 방식 통신의 시퀀스 다이어그램.