All'alba vincerò

At dawn, I will win!

CS/네트워크

TCP/IP (4): TCP 헤더

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

TCP 헤더

: TCP 세그먼트의 앞부분에 붙는 제어 정보들

 

 

개요

  • 애플리케이션 계층에서 전송한 데이터는 트랜스포트 계층으로 전달됨
    → 트랜스포트 계층에서는 이 데이터에 사용할 프로토콜의 헤더를 붙임(TCP를 이용하기 때문에 TCP 헤더가 붙음)
    ⇒ 이 데이터가 세그먼트

 


 

TCP 구성

 

 

 

Source Port: 송신 측의 포트
Destination Port: 수신 측의 포트

  • 둘 다 16비트로 구성
    • 2¹⁶ = 65536 ⇒ 0 ~ 65535번 포트까지 사용 가능

 

 

 

Sequence Number: 해당 데이터의 일련 번호

  • 데이터를 보낼 때 번호를 붙임(seq)
  • "내가 지금부터 보낼 데이터의 위치”를 의미
  • 이 번호가 있어서 데이터의 순서가 뒤바뀌어 도착해도 원래 순서대로 복원할 수 있고, 데이터 누락 여부도 확인 가능함
  • 처음 보낼 땐 난수로 결정되고, 그 다음부터는 현재 Sequence Number + 내가 보낸 데이터 크기 + 1
    • ex) 초기 Sequence Number가 10000이고, 보낸 데이터가 500바이트면
      → 다음 Sequence Number는 10501 (10000 + 500 + 1)
  • 32비트로 구성

 

 

 

Acknowledgement Number: 자신이 다음에 받아야 할 상대의 Sequence Number를 의미

  • 수신자가 송신자에게 보내는 응답
    → "나는 이 번호 이전까지 다 받았고다음엔 이 번호부터 보내줘"라는 의미
  • ACK = 받은 데이터의 Sequence Number + 받은 데이터 크기 + 1
  • ex) 상대방이 보낸 데이터의 Sequence Number가 20000이고, 데이터 크기가 1000이면
    → Acknowledgement Number는 21001 (20000 + 1000 + 1)

 

 

Sequence Number와 Acknowledgement Number의 동작 예시

  • 3 way handshake로 커넥션을 이미 만든 상황
    1. 사용자가 Sequence Number 1000과 500바이트 크기의 데이터를 전송함
      • Acknowledgement Number는 3 way handshake를 진행할 때 받은 Sequence Number에 데이터 크기를 더한 값을 사용하지만, 여기선 단순화를 위해 0으로 가정함
    2. 케이틀린은 응답으로
      • 200바이트 크기의 데이터를 보냄
      • Sequence Number는 난수로 5000으로 설정됨
      • Acknowledgement Number는 1501 (1000 + 500 + 1)로 설정해 사용자에게 다음 순서를 알려줌
        → 사용자가 보낸 데이터의 Sequence Number 1000에 데이터 크기 500와 1을 더함
    3. 사용자는 케이틀린의 데이터를 받고 응답으로
      • Sequence Number는 1501인 데이터를 준비하고
      • Acknowledgement Number는 5201 (5000 + 200 + 1)이라고 알림
        → 케이틀린에게 받은 Sequence Number 5000에 데이터 크기 200와 1을 더함

⇒ 이렇게 서로의 Sequence Number와 Acknowledgement Number를 사용해 데이터의 신뢰성을 보장함

 

 

 

Data Offset: 현재 TCP 데이터가 TCP 세그먼트의 앞에서 얼마나 떨어져 있는지를 4바이트 단위로 나타냄

  • TCP 헤더의 크기를 의미
    ⇒ TCP Segment = TCP Header + TCP Data
  • TCP 헤더의 기본값은 20바이트이므로 Data Offset의기본값은 5
  • 4비트로 구성

 

 

 

Reserved: 앞으로 필요할 때를 대비해 남겨둔 필드

  • 현재는 사용되지 않음
  • 3비트로 구성

 

 

 

Control Flags: 연결 상태나 제어 목적을 나타내는 TCP 헤더 안에 있는 6개의 플래그 비트

  • 각 비트는 0 또는 1로 설정됨
  • 총 9비트로 구성
NS
(None Sum)
악의적인 데이터를 은폐하는 걸 방지하기 위한 필드 아직 실험 단계,
잘 쓰이지 않음
CWR
(Congestion Window Reduced)
혼잡 제어 시 사용되는 필드 혼잡 제어용
ECE
(ECN Echo)
혼잡 제어 시 사용되는 필드 혼잡 제어용
URG
(Urgent Flag)
긴급하게 처리해야 하는 데이터를 나타낼 때 사용하는 필드 거의 안 쓰임
ACK
(Acknowledgement Flag)
받은 데이터에 대한 응답 표시 1이면 데이터를 잘 받았다는 뜻
PSH
(Push Flag)
데이터를 즉시 상위 계층으로 전달 요청하는 필드 1이면 즉시 전달,
0이면 버퍼링을 허용
RST
(Reset Flag)
연결을 강제로 종료 요청하는 필드 1이면 이미 연결된 커넥션을 강제로 끊는다는 뜻
SYN
(Synchronize)
커넥션을 생성할 때 사용 연결 시작용
FIN
(Fin Flag)
더 이상 데이터가 없어서 연결 종료를 요청하는 필드 정상 종료용,
1이면 연결을 끊고 싶다는 의미

 

 

 

Window Size: TCP의 흐름제어인 슬라이딩 윈도우를 사용할 때 사용

  • 흐름 제어에 사용됨
  • 수신 측이 수용 가능한 버퍼 크기를 보냄
  • 16비트로 구성

 

 

 

Checksum: 전송 중 오류가 있는지 확인하기 위한 필드

  • 흐름 제어에 사용됨
    • TCP의 흐름제어인 슬라이딩 윈도우를 사용할 때 사용
  • 16비트로 구성

 

 

 

Urgent Pointer: 데이터 중 긴급한 데이터가 어디까지 있는지를 가리킴

  • URG 플래그가 1일 경우 사용됨
  • 수신 측은 이 포인터를 참고해서 긴급 데이터를 우선 처리
    • 이 포인터가 가리키는 데이터를 우선 처리할지는 애플리케이션 구현에 따라 다름
      → 애플리케이션을 만든 개발자 마음

 

 

 

Options: TCP의 기능을 확장할 때 사용

  • 크기가 정해져있지 않고 가변적임
  • 데이터 오프셋(DO)필드를 이용해 실제 헤더의 크기를 계산할 수 있음
  • 최대 40바이트까지 가능함