요약

  • RFC 772와 RFC 780은 MTP의 다중 수신자 절차 두 가지를 제시했다.R는 수신자를 먼저 기억했고,T는 본문을 먼저 기억했다. 어느 방식이 교환을 지배할지는 수신자가 결정했다.
  • MRSQ는 방식을 확인하고, 선택하고, 초기화했다.MRCP는 수신자를 지명했지만, 그 증거가 R과 T에서 서로 다른 의미를 가졌다. 순서는 메모리와 책임, 그리고 실패의 범위를 배분했다.
  • RFC 788과 RFC 821은 이 협상을 하나의 보이는 순서로 대체했다.MAIL, 반복되는RCPT, 그리고DATA순서였다. 하나의 본문이 여전히 여러 수신자를 대상으로 할 수 있었다. 프로토콜이 버린 것은 다중 수신자 효율이 아니라 대체 가능한 전송 문법이었다.

스스로의 맥락을 지운 질문

RFC 780에서MRSQ는 동시에 기능 탐색 명령이자, 선호 질의이자, 선택 명령이자, 초기화 명령이었다. 인수 없이 사용하면 어떤 방식도 선택하지 않고 교환을 중립 상태로 되돌렸다.?를 붙이면 수신자가 선호하는 방식을 물었다.R이나T를 붙이면 두 절차 중 하나를 제안했다.

이 질의는 관측상 무해하지 않았다. MRSQ를 사용할 때마다 연관된 다중 수신자 상태가 초기화됐다. 교환 도중에 수신자의 선호를 묻는 송신자는 누적된 수신자 목록이나 저장된 메시지 본문을 버릴 수 있었다.MRSQ?를 읽기 전용 점검으로 취급하는 진단 시스템은 정작 조사하려던 거래 자체를 변경해 버린다.

이를 지원하는 수신자는 방식 하나를 지목하는215응답으로 선호 질의에 답한다. 수신자는 R이나 T 중 적어도 하나를 구현해야 하지만, 송신자의 첫 번째 선택을 따를 필요는 없다. 송신자는 제안할 수 있고, 실제로 사용 가능한 것은 수신자가 결정한다.

이 권한은 관련 지식이 어디에 있는지를 따른다. 자신의 로컬 메일러가 수신자 묶음 전체를 원하는지, 주소를 하나씩 배달하는지, 테이블에 몇 개의 경로가 들어가는지, 목록을 기억하는 것과 본문을 기억하는 것 중 어느 쪽이 더 저렴한지는 수신자만 안다. MRSQ는 그 로컬 구현 결정을 프로토콜 대화 안에 그대로 드러냈다.

R은 본문을 받기 전에 목록을 만들었다

수신자 우선 방식에서 송신자는MRCP TO:<path>명령을 연이어 내린다. 수신자는 각 명령에 답하고 수용한 경로를 기억한다. 한 주소의 거부는 이미 기억된 주소를 무효로 하지 않으며, 자원 고갈로 수신자가 더 이상 상태를 저장할 수 없게 되는 경우를 제외하면 이후 주소의 검토도 막지 않는다.

목록이 준비되면 송신자는 TO 인수 없이MAIL FROM:<sender-path>를 사용하고 메시지 본문을 한 번 전송한다. 본문 전송 이후의 성공 응답은 기억된 모든 수신자에 적용되며, 그 시점의 실패는 기억된 집단 전체의 실패로 처리된다. 이후 수신자는 목록을 비운다.

R은 결합된 봉투와 본문을 중앙 메일러에 한꺼번에 넘기는 구현에 적합하다. 값비싼 데이터 전송에 앞서 배달 작업을 조립하고, 동일한 텍스트를 주소마다 따로 보내는 일을 피한다.

이 경제성은 메모리에 의해 제한된다. RFC 780은 수신자 테이블에 경로를 더 담을 공간이 없을 때의452응답을 기술한다. 송신자는 이미 저장된 집단에 본문을 전송하고, 다른 집단을 모아 본문을 다시 전송할 수 있다. 수신자 50명과 이름 10개의 공간이라면 다섯 번의 배치가 필요할 수 있다. 따라서 “한 번의 전송”은 메시지의 형이상학적 속성이 아니라 수신자의 가용 상태에 의해 제한되는 결과물이다.

R은 원자적 배달 약속도 아니다. 각 MRCP 응답은 해당 경로가 대기 집단에 들어갈 수 있는지를 알려준다. 이후의 MAIL 완료 응답은 공유 본문이 도착한 뒤의 집단 결과를 보고한다. 이 둘은 서로 다른 검사 지점이다. 첫 수용을 최종 배달이라 부르면 이 절차가 만들어낸 구분 자체가 지워진다.

T는 목록을 알기 전에 본문을 받았다

텍스트 우선 방식은 기억되는 대상을 뒤집는다. 수신자 없이MAIL FROM:<sender-path>를 내리면 메시지 본문이 전송되어 저장된다. 이후의 MRCP 명령은 그 저장된 본문을 수신자 경로에 하나씩 적용하며, 텍스트를 재전송하지 않고 각 경로의 결과를 돌려준다.

본문은 다른 MAIL이 그것을 대체하거나 MRSQ가 방식 상태를 초기화할 때까지 사용 가능하다. T 역시 대역폭을 절약한다. 수신자마다 본문을 다시 스트리밍하지 않고, 더 큰 객체를 한 번 유지한 뒤 주소가 도착하는 대로 재사용한다.

이 구성은 배달을 점진적으로 수행하는 수신자에 어울린다. 메일함 할당 문제, 접근 충돌 또는 다른 로컬 조건은 수신자가 저장된 메시지를 적용하려는 시점에 해당 수신자에 대한 응답으로 반영될 수 있다.

이 반전은 그만의 노출을 만든다. 수신자가 본문을 수용하는 시점에는 유효한 수신자가 뒤따를지 아직 알 수 없다. 본문이 저장되기 전의 MRCP는 RFC의 용어로 널 메시지를 대상으로 한 시도가 되며, 구현은 이를 수용하거나 거부할 수 있다. 순서는 명령을 둘러싼 표현이 아니라 어떤 객체가 존재하는지를 결정한다.

같은 성공 번호가 같은 사건을 증명하지 않았다

R에서 성공한 MRCP는 주로 어떤 수신자 경로가 이후의 집단적 작업을 위해 기록되었다는 것을 증명한다. T에서는 본문이 이미 존재하므로 성공한 MRCP는 그 본문이 지명된 하나의 경로에 적용되었음을 보고한다. 명령과 응답만 담은 로그 한 줄은 활성 방식과 이전 초기화 지점을 알지 못하면 불충분한 증거일 수 있다.

이 문제는 불완전한 기록에서 더 선명해진다. MRSQ는 이전 방식 상태를 파괴한다. 새로운 MAIL은 기억된 텍스트를 대체할 수 있다. 캡처가 그 경계 중 하나를 빠뜨리면 분석자는 존재하지 않는 본문이나 이미 비워진 수신자 테이블에 MRCP를 연결해 버릴 수 있다.

그 결과 협상 가능한 순서는 공유 상태 머신을 확장한다. 기억될 수 있는 객체가 두 종류, 수신자 승인의 의미가 두 가지, 초기화 전이가 여러 개, 최종 실패의 범위도 서로 다르다. 유연성은 로컬에서는 합리적이지만, 모든 송신자·수신자·중계자·테스터·기록 독자가 두 가지 이야기를 모두 이해해야 한다.

수신자는 자기 작업장의 형태를 알고 있었다

RFC 772와 RFC 780은 R을 정답으로, T를 결함으로 제시하거나 그 반대로 제시하지 않는다. 완성된 수신자 집합과 하나의 본문을 중앙 프로세스에 넘기는 시스템에는 R이 자연스럽다. 수신자를 점진적으로 처리하면서 로컬 배달 제약을 따로 드러내고자 하는 시스템에는 T가 자연스럽다.

송신자는 원격 테이블의 크기, 수신 프로세스 뒤의 아키텍처, 메일함 자원이 확약되는 시점을 볼 수 없다. 송신자에게 최종 권한을 주면 정보가 부족한 쪽이 수신자의 내부 작업량을 결정하게 된다. 그래서 프로토콜은 송신자에게 선호를 표현할 수 있게 하되, 실효적 통제는 수신자에게 남겼다.

이 권한 분배는 연결 단위에서는 합리적이다. 그러나 네트워크 전체에서는 모든 구현이 가능한 두 가지 외부 순서의 복잡성을 모두 짊어져야 한다. 로컬에서 잘 알아낸 결정이라도 보편적 인터페이스의 일부로서는 비용이 될 수 있다.

SMTP는 보이는 순서를 고정했다

1981년 11월에 발표된RFC 788은 단일 거래 순서를 정의한다.MAIL FROM이 송신자를 확인하고 거래를 연다. 하나 이상의RCPT TO명령이 수신자를 협상한다.DATA가 마지막에 텍스트를 전송한다. 대화는 명시적으로 lock-step이며, 거래 명령은 그 순서를 지켜야 한다.

이 문법에서 MRSQ와 메일의 MRCP는 사라진다. 수신자는 더 이상 수신자가 하나도 지명되기 전에 텍스트를 요구할 수 없다. 거부된 RCPT가 다른 수신자를 위한 거래를 무효화할 필요는 없으므로, SMTP는 공유 데이터 단계 이전의 수신자별 봉투 결정은 유지한다.

RFC 821은 1982년에 같은 구조를 유지한다. 또한 같은 목적지 호스트가 여러 수신자를 처리할 때 데이터 사본을 하나만 보내도록 권한다. SMTP는 R과 T가 다루던 효율 문제를 버린 것이 아니다. 반복되는 RCPT 명령으로 봉투를 확립한 뒤 DATA를 한 번 보내는, 하나의 외부 방식을 표준화한 것이다.

이 구분이 중요한 이유는 단순화가 쉽게 능력 상실로 오해되기 때문이다. 제거된 기능은 “여러 사람에게 하나의 본문을 메일로 보내는 것”이 아니었다. 제거된 기능은 수신자가 그 본문이 전송 스트림에서 수신자 순서보다 먼저 나올지 뒤에 나올지 선택할 수 있던 능력이다.

하나의 문법, 수많은 내부 구현

전송 순서를 고정한다고 서버의 내부 구성까지 정해지는 것은 아니다. SMTP 수신자는 여전히 수신자 집합을 버퍼링하고, 데이터를 임시 저장소로 스트리밍하고, 작업을 중앙 큐로 넘기고, 로컬 배달을 지연할 수 있다. 표준이 제약하는 것은 피어가 관찰하는 것이며, 엔드포인트 뒤의 모든 데이터 구조가 아니다.

이 분리는 적응을 내부로 이동시킨다. MTP의 협상 방식 아래에서는 클라이언트와 수신자가 수신자가 선호하는 저장 순서를 두고 조율했다. SMTP 아래에서는 수신자가 균일한 대화와 자기 로컬 아키텍처 사이의 차이를 흡수한다. 피어는 더 작은 상태 공간을 얻고, 수신자는 계약 뒤에 구현 자유를 유지한다.

이것은 반복되는 프로토콜 타협이다. 외부 다양성은 로컬 최적화를 명시적으로 만들 수 있지만, 거의 사용되지 않을 분기에 대해 모든 참여자에게 비용을 청구한다. 고정 순서는 엔드포인트에게 내부 버퍼링이나 재정렬을 강요할 수 있지만, 네트워크가 테스트하고 유지해야 하는 상호운용 경로의 수를 줄인다.

lock-step은 순서와 같은 질문이 아니다

RFC 788은 이 교환을 lock-step이라 부른다. 송신자는 응답을 기다린 뒤 진행한다. 이 대기 규율은 MAIL, 수신자, 텍스트를 논리적으로 재정렬할 수 있는지와는 별개의 문제다. 이후의 SMTP 메커니즘은 대기를 줄이거나 여러 명령을 응답보다 먼저 보낼 수 있게 할 수 있지만, 수신자가 선택한 텍스트 우선 거래를 부활시키지는 않는다.

RFC 5321도 여전히 메일 거래를 MAIL, 하나 이상의 RCPT 명령, DATA로 기술한다. 매개변수와 확장은 이 단계들을 풍부하게 할 수 있다. 그러나 MRSQ가 제공하던 “주소를 먼저 기억할지, 본문을 먼저 기억할지”의 선택을 되살리지는 않는다.

이 두 차원을 혼동하면 나쁜 역사적 비교가 나온다. Pipelining은 명령이 응답에 대해 언제 전송될 수 있는지를 다룬다. MRSQ는 어떤 논리적 객체가 먼저 오는지, 그리고 수신자가 어떤 상태를 소유하는지를 다뤘다. 더 빠른 대기가 협상 가능한 절차 구성을 의미하지는 않는다.

효율 규칙은 명령 이름보다 오래 살아남았다

RFC 1123은 같은 호스트가 여러 수신자를 처리할 때 송신자가 여러 RCPT 명령을 내리고 DATA를 하나만 보내도록 강하게 권한다. 수신자마다 RCPT와 DATA를 반복하면 전송과 처리가 낭비된다.

이 운영 권고는 문법 단절 아래의 연속성을 드러낸다. 초기 MTP는 R과 T를 본문 반복을 피하는 두 가지 방법으로 취급했다. SMTP는 공유 본문이라는 목표를 유지하면서 수신자 우선을 공통의 보이는 순서로 채택했다. 네트워크는 실제로 중요했던 결과를 보존하면서 인터페이스를 표준화했다.

따라서 이 역사는 비효율적인 전임자와 효율적인 후계자 사이의 깨끗한 경쟁이 아니다. 이것은 선택이 표현될 수 있는 위치의 축소다. 수신자는 공개된 정렬에 대한 권한을 잃었고, 구현은 자기 로컬 버퍼링과 배달 기계에 대한 권한을 유지했다.

MRCP는 여기에서 좁은 역사적 의미를 지닌다

이 메일 문서들에서 MRCP는 “Mail Recipient”를 뜻한다. 초기 Mail Transfer Protocol 명령 집합에 속한다. 같은 글자들이 나중에 무관한 기술인 Media Resource Control Protocol에 사용되었다.

이 두문자 충돌은 단순한 검색 불편이 아니다. 현대 검색 질의는 나중의 프로토콜을 지나치게 높게 순위 매겨 초기 메일 기록을 무의미하게 보이게 하거나, 조용히 잘못된 이름으로 바꿔 버릴 수 있다. 날짜, 주변 명령, 원본 문서는 프로토콜 토큰의 정체성의 일부다.

같은 주의는 배포 주장에도 적용된다. RFC들은 행동을 정의하고 구현 절충을 설명할 뿐, R과 T가 얼마나 자주 사용되었는지에 대한 조사, 선택이 폐지된 단일 결정적 회의, 제거로 인해 측정된 성능 향상을 제공하지 않는다. 문서 기록은 명세의 변경을 뒷받침할 뿐, 만들어낸 채용 통계는 아니다.

프로토콜은 목표를 보존하면서 옵션을 삭제할 수 있다

MRSQ는 수신자의 사적 아키텍처를 순서에 대한 협상으로 드러내게 했다. R은 수신자에게 이름을 기억하라고 요청했고, T는 텍스트를 기억하라고 요청했다. 각각은 서로 다른 시점에 서로 다른 증거를 제공했고, 서로 다른 자원을 위험에 놓았다.

SMTP의 고정된 MAIL–RCPT–DATA 순서는 그 내부 아키텍처들을 불합법으로 선언하지 않았다. 원격 피어가 그 사이의 선택에 참여하도록 요구하는 것을 멈춘 것이다. 수신자는 여전히 필요한 작업장을 만들 수 있었지만, 하역장에는 하나의 일정표가 생겼다.

이것이 더 깊은 전환이다. 프로토콜 진화는 종종 오래된 목표를 유지하면서 그 목표를 드러내던 메커니즘을 제거한다. 여기서 목표는 다중 수신자에 대한 단일 본문 효율이었다. 드러나던 메커니즘은 수신자가 선택한 정렬이었다. SMTP는 전자를 유지하고 후자를 표준화로 제거했다.

출처