TCP 시퀀스 번호

From CS Wiki

TCP 시퀀스 번호(TCP Sequence Number)는 TCP(Transmission Control Protocol)에서 데이터 패킷의 순서를 추적하고, 전송 중 손실된 데이터의 재전송 및 올바른 데이터 조립을 보장하기 위해 사용하는 숫자이다. 시퀀스 번호는 TCP 연결에서 매우 중요한 역할을 하며, 송신 측에서 전송하는 각 바이트에 고유한 번호를 할당한다. 수신 측에서는 이를 기반으로 패킷이 올바른 순서로 도착했는지 확인할 수 있다.

시퀀스 번호의 주요 역할[edit | edit source]

  • 데이터 순서 보장
    • 시퀀스 번호는 각 바이트에 고유 번호를 할당함으로써, 수신 측이 전송된 데이터를 올바른 순서대로 재조립할 수 있게 한다.
    • 이를 통해 데이터가 원래 순서와 다르게 도착하더라도 올바른 순서로 재구성할 수 있다.
  • 데이터 손실 감지 및 재전송
    • 수신 측에서는 시퀀스 번호를 통해 누락된 패킷을 감지할 수 있다.
    • 특정 시퀀스 번호의 패킷이 누락되었을 경우, 수신 측은 송신 측에 해당 패킷을 재전송해달라고 요청할 수 있다.
  • 연결 제어 및 흐름 제어
    • TCP 연결 설정 시, 시퀀스 번호는 초기화되어 양측 간 데이터 흐름을 관리한다.
    • 특히 수신 측은 확인 응답(ACK)으로 다음에 기대하는 시퀀스 번호를 송신 측에 알려주어 데이터 전송 속도를 조절할 수 있다.

시퀀스 번호 초기화[edit | edit source]

  • TCP 연결 설정 시, 클라이언트와 서버는 각각 초기 시퀀스 번호(ISN, Initial Sequence Number)를 임의로 선택하여 설정한다.
  • 이 초기 값은 보안과 데이터 무결성을 유지하는 데 중요하며, 일반적으로 무작위로 선택된다.
  • 클라이언트와 서버는 서로의 초기 시퀀스 번호를 SYN 패킷을 통해 교환하고, 이후 ACK 패킷으로 이를 확인하여 연결을 완료한다.

예시[edit | edit source]

TCP 통신에서 클라이언트가 서버로 500 바이트의 데이터를 전송한다고 가정하자. 클라이언트의 초기 시퀀스 번호가 1000이라면, 각 바이트에는 다음과 같이 시퀀스 번호가 할당된다.

  • 첫 번째 바이트: 시퀀스 번호 1000
  • 마지막 바이트: 시퀀스 번호 1499

서버가 모든 데이터를 수신한 후 확인 응답을 보낼 때, 다음에 기대하는 바이트의 시퀀스 번호인 1500을 ACK 값으로 보내게 된다. 이를 통해 송신 측은 모든 데이터가 정상적으로 수신되었음을 확인하고, 이후 데이터 전송을 이어 나간다.

같이 보기[edit | edit source]