요약

  • TCP 시퀀스 번호는 0부터 2^32−1까지의 유한 공간을 차지하므로 모든 시퀀스 연산은 2^32를 법으로 한 모듈러 연산으로 수행됩니다.
  • 모듈러 비교는 카운터가 최댓값에서 0으로 되돌아갈 때 국소적 순서를 보존합니다.
  • 이 규칙은 확인 응답, 재전송 상태, 수신 윈도우 검사를 지배하며, 일반적인 정수 비교는 롤오버 근처에서 의미를 뒤집을 수 있습니다.

영원히 늘어날 수 없는 카운터

RFC 793은 이 제약을 명시했습니다. TCP의 시퀀스 번호 공간은 크지만 유한하며, 그 값은 0부터 2^32−1까지이고 모든 연산은 2^32를 법으로 수행해야 합니다. RFC 9293도 이 규칙과 비교에 주의가 필요하다는 경고를 그대로 유지합니다.

그 이유는 경계에서 드러납니다. 어떤 바이트가 가능한 최대 시퀀스 번호를 가진다면 그다음 바이트는 0으로 번호가 매겨집니다. 일반적인 부호 없는 정수로 보면 0이 더 작지만, 연결의 진행에서는 더 나중입니다. 따라서 단순한 크다 비교는 카운터가 되감기는 바로 그 시점에 새 시퀀스 공간을 옛 시퀀스 공간으로 오인하게 됩니다.

모듈러 연산은 이 모델을 선에서 고리(ring)로 바꿉니다. 현재 연결의 경계에서 앞으로 나아가면 결국 최댓값을 지나 0에서 다시 이어집니다. 숫자 레이블은 전체 공간을 한 바퀴 돈 뒤에야 반복되며, 수신자와 송신자는 이를 자신의 현재 상태와 유한한 윈도우를 기준으로 해석합니다.

비교가 바로 그 메커니즘

사양은 모듈러 연산을 예외적인 롤오버 처리기에만 두지 않습니다. 시퀀스 상태를 다루는 일상적 언어로 정합니다. TCP는 확인 응답이 보낸 데이터를 커버하는지, 어떤 시퀀스 위치가 재전송을 위해 아직 미해결 상태인지, 도착한 세그먼트가 수신 윈도우 안에 있는지를 판단해야 합니다. 각 판단은 고리 위에서의 상대적 위치에 관한 것입니다.

그래서 RFC들은 '이하' 같은 관계 표기를 2^32 법의 모듈러 항으로 정의합니다. 어려운 부분은 32비트 카운터를 증가시키는 것이 아닙니다. 하드웨어와 소프트웨어는 자연히 오버플로를 버립니다. 어려운 부분은 0의 양쪽에 있는 값들이 비교될 때 의도된 '이전'과 '이후'의 관계를 보존하는 것입니다.

연결 문맥이 국소적인 기준틀을 제공합니다. 최근의 확인 응답 경계, 송신 윈도우, 수신 윈도우가 고리에서 관련된 이웃 영역을 식별합니다. 프로토콜은 상태와 분리된 임의의 32비트 값 두 개가 보편적인 시간 순서를 가진다고 주장하지 않습니다.

롤오버는 리셋이 아니다

0으로 되돌아가는 것이 TCP 연결을 리셋하거나 핸드셰이크를 다시 열거나 미해결 상태를 지우지는 않습니다. 이 숫자는 기존 전송 제어 블록 안의 하나의 좌표일 뿐입니다. 확인 응답과 윈도우 변수는 모듈러 비교에 따라 계속 움직입니다.

이 점이 인접한 이야기들과 이 메커니즘을 구분합니다. SYN과 FIN은 특별한 시퀀스 공간 회계를 가지지만 같은 고리 안에 존재합니다. TIME-WAIT과 초기 시퀀스 번호 선택은 오래된 중복 세그먼트와 연결 재현 문제를 다룹니다. TCP-AO의 시퀀스 번호 확장은 되감기를 넘어 인증 입력을 보호합니다. 그러나 어느 것도, 회선상의 시퀀스 번호가 32비트이고 기본 TCP가 이를 2^32 법으로 정렬한다는 기본 사실을 바꾸지 않습니다.

이 규칙이 보장하지 않는 것

올바른 연산만으로는 모든 상황에서 오래된 트래픽이 현재 트래픽으로 오인되는 것을 막지 못합니다. 연결 수명, 세그먼트 나이, 윈도우 경계, 이후의 여러 메커니즘이 다른 모호성 위험을 다룹니다. 인용된 사양들은 현재 구현상의 실패나 현대의 전송이 이 공간을 얼마나 빨리 통과할 수 있는지도 측정하지 않습니다.

이 설계 결정의 지속적 의미는 더 좁습니다. TCP는 순서 있는 바이트 스트림을 유지하기 위해 회선 위에 무한 정수가 필요하지 않았습니다. 유한한 레이블 공간, 끝이 시작에 연결되게 만드는 규칙, 그리고 접합부 근처에서 '이전'과 '이후'를 의미 있게 유지하는 상태 기반 비교가 필요했을 뿐입니다.

출처