요약

  • RFC 768은 UDP 체크섬 필드에서 0에 두 가지 서로 다른 의미를 부여했습니다. 계산 결과가 0이면0xFFFF로 전송되었고, 회선 값이0x0000이면 체크섬이 생성되지 않았다는 뜻이었습니다.
  • 1989년 호스트 요구사항은 체크섬 생략을 여전히 가능하게 두면서도 체크섬 생성을 기본값으로 만들었습니다. IPv6는 이후 체크섬을 필수로 만들었고, 2013년 개정에서 좁게 한정된 터널 사례만 예외를 허용했습니다.

하나의 필드, 두 개의 0

1980년 8월, Jon Postel의RFC 768은 응용 프로그램이 최소한의 프로토콜 장치로 데이터그램을 주고받을 수 있도록 사용자 데이터그램 프로토콜(UDP)을 규정했습니다. 이 프로토콜은 순서가 보장된 전달, 중복 방지, 신뢰성을 약속하지 않았습니다. 헤더는 딱 8옥텟, 즉 송신 포트, 수신 포트, 길이, 체크섬이었고 그 뒤에 데이터가 이어졌습니다.

마지막 필드는 산술 연산이 다소 곤란한 경계를 만들기 전까지는 단순해 보입니다. UDP는 TCP와 마찬가지로 16비트 1의 보수 체크섬을 사용했습니다. 계산에는 UDP 헤더와 데이터, 그리고 IP 송수신 주소, 프로토콜 번호, UDP 길이를 담은 의사 헤더가 포함되었습니다. Postel은 이 의사 헤더가 데이터그램이 잘못된 수신 맥락으로 전달되는 상황을 방어하는 데 도움이 된다고 설명했습니다.

1의 보수 산술에서 0은 두 가지 비트 패턴, 즉 전부 0과 전부 1을 갖습니다. RFC 768은 이 두 패턴에 회선상에서 서로 다른 역할을 부여했습니다. 계산 결과가 0이면 송신자는 전부 1을 전송해야 했습니다. 반대로 전부 0이 전송되면 송신자가 체크섬을 생성하지 않았다는 의미였습니다. 패킷 형식은 따로 플래그 비트를 추가하지 않고도 계산 결과와 작은 상태 신호를 함께 담을 수 있었습니다.

이것이 이 글이 짚는 좁은 역사적 지점입니다. 0 체크섬은 계산된 값이 우연히 0이 된 체크섬이 아니라, 부재를 부호화한 것이었습니다. 두 상태를 혼동하면 구현체가 유효한 데이터그램을 거부하거나, 검증되지 않은 오류 감지 부재를 마치 검증된 것처럼 다룰 수 있었습니다.

선택 가능이 곧 기본값은 아니었다

최초 사양은 생략의 여지를 남겨 두었고, 체크섬을 신경 쓰지 않는 디버깅이나 상위 계층 프로토콜을 언급했습니다. 9년 뒤 인터넷 호스트 요구사항인RFC 1122가 운영 규칙을 더 명확히 했습니다. 호스트는 체크섬 생성과 검증을 구현해야 했고, 응용 프로그램이 생성을 선택적으로 제어할 수는 있었지만 기본값은 반드시 켜짐이어야 했습니다. 수신자는 체크섬 없는 데이터그램을 응용 프로그램에 전달할지 여부를 선택적으로 정할 수 있었습니다.

RFC 1122는 흔한 구현 오류도 지적했습니다. 계산된 0은 회선상으로는 65535로 보내야 하고, 전부 0인 필드는 체크섬 부재를 뜻한다는 것입니다. 이 문서는 근거리 네트워크에서 효율을 위해 체크섬을 끈 일부 응용 프로그램이 있었고 수많은 미탐지 오류가 보고되었다고 전했지만, 개수나 구체적 사건, 분모를 제공하지 않았습니다. 따라서 이 대목은 표준 저자들이 기록한 우려의 증거이지, 그 관행이 얼마나 널리 퍼졌는지에 대한 측정은 아닙니다.

체크섬은 결코 서명이 아니었습니다. 의사 헤더는 일부 잘못된 전달을 잡아낼 수 있었고, 계산은 우발적 손상의 일부를 감지할 수 있었습니다. 그러나 송신자를 인증하거나, 고의적 변경을 막거나, 응용 데이터가 합리적임을 증명하지는 못했습니다. “체크섬이 있다”와 “패킷이 신뢰할 수 있다”는 서로 다른 주장이었습니다.

IPv6가 경계를 강화했다

1998년 IPv6 사양인RFC 2460은 UDP 체크섬을 필수로 만들었습니다. 계산 결과가 0이면 이 역시0xFFFF로 기록해야 했고, 수신자는 체크섬 필드가 0인 IPv6 UDP 데이터그램을 폐기하도록 했습니다. 이로써 이전까지 선택적이던 부재 표시는 일반적인 IPv6 UDP 트래픽에서 더 이상 허용되지 않았습니다.

이 규칙은 이후 특정 성능 사례와 마주했습니다. 2013년RFC 6935와RFC 6936은 제약이 있는 UDP 터널 캡슐화에 대한 IPv6 동작을 개정했습니다. 터널은 이미 자체 무결성 검사를 갖춘 패킷을 운반할 수 있었고, 외부 체크섬을 계산하면 비용이 들 수 있었습니다. 이 예외는 적용 조건, 종단점 동작, 중간 장비 호환성에 의존했으며, 0 체크섬을 일반적인 IPv6 옵션으로 만들지는 않았습니다.

표준화 순서는 시사적입니다. 비트 패턴은 그대로인데 허용되는 맥락이 바뀌었기 때문입니다. IPv4에서는 0이 부재를 표시할 수 있었고, 호스트 지침은 계산을 기본으로 유도했습니다. IPv6에서는 부재가 처음에 거부되었다가, 추가 보호 장치를 갖춘 특정 외부 터널 역할에 한해 좁게 복원되었습니다. 체크섬을 건너뛰는 것이 허용되는지는 값 하나만으로 수신자가 판단할 수 없었고, 프로토콜 버전과 사용 맥락이 그 답을 정했습니다.

출처