Resumo
- O TCP preservava a ordem do fluxo, não as bordas de CALL e REPLY; o ONC RPC colocou cada mensagem em um registro formado por um ou mais fragmentos.
- Um marcador big-endian de quatro bytes reservava 31 bits ao comprimento do fragmento e o bit mais alto à indicação de que o registro terminava depois daqueles dados.
- Fechar o registro resolvia framing. Validade XDR, correlação XID, autenticação, autorização, resultado e efeito persistente continuavam separados.
O primeiro pacote não precisava conter a primeira chamada
Um servidor recebe metade do marcador antes de o agendador acordar outra vez. Em seguida, uma leitura traz o restante, todo o corpo e o início de duas mensagens posteriores. O programa que associa uma leitura a uma chamada falha nas duas situações, apesar de o TCP funcionar perfeitamente.
RFC 793 definiu a sequência de octetos e deixou claro que PUSH não é marcador de registro. O padrão atual, RFC 9293, continua oferecendo um byte stream confiável e ordenado. Segmentos são a forma momentânea de transportar esse fluxo, não unidades permanentes da aplicação.
O protocolo de procedimentos precisava separar mensagens porque os bytes de um CALL têm uma gramática e os da mensagem seguinte começam outra. O transporte não deveria adivinhar esse significado; a camada RPC teria de publicá-lo.
O marcador dividiu uma palavra em contagem e término
Em abril de 1988, a RFC 1050 descreveu record marking: uma mensagem RPC cabe em um registro RM, composto de um ou mais fragmentos. A RFC 1057 substituiu o texto em junho e manteve os mesmos bytes.
Cada fragmento começa com uma palavra sem sinal de quatro bytes na ordem do mais significativo para o menos. Os 31 bits inferiores informam a quantidade de dados do fragmento, entre zero e 2^31 - 1. O bit superior é booleano: um marca o último fragmento daquele registro; zero mantém o registro aberto.
O bit não encerra nada antes de o corpo declarado chegar. O receptor primeiro conta os dados. Só depois aplica a decisão guardada. Se a decisão for zero, o marcador seguinte pertence ao mesmo registro. Se for um, o próximo marcador abre outro registro.
A borda surgia de estado acumulado
O parser reúne quatro bytes mesmo quando eles chegam separados. Extrai comprimento e bit, consome o corpo exato e atualiza o total do registro. Pode acumular ou encaminhar os dados sob limites locais, mas não pode esquecer a qual registro pertencem.
Um fragmento final conclui uma mensagem RPC. Qualquer sobra já pode conter o próximo marcador. Um fragmento não final faz o parser voltar à fase de cabeçalho sem entregar uma mensagem incompleta. Assim, pacotes divididos e leituras combinadas produzem o mesmo resultado.
O intervalo normativo admite comprimento zero. Esse fragmento ainda carrega a escolha de continuar ou terminar. Já um EOF no meio de um corpo produz truncamento, não um registro menor. O fato de o receptor não ter completado a REPLY não informa quantas vezes o procedimento foi executado no outro lado.
Fragmento de registro não era fragmento da rede
Os nomes se parecem, os objetos não. Um RM fragment pode atravessar diversos TCP segments; vários RM fragments e records podem aparecer no mesmo buffer. Nenhum deles coincide obrigatoriamente com IP fragmentation, uma chamada a write ou um item XDR.
Também não se deve ler o bit superior como FIN, PSH, fim de arquivo, commit ou sucesso. CALL e REPLY são mensagens distintas com registros distintos sobre TCP. Uma borda perfeita pode conter credenciais inválidas ou um procedimento inexistente.
PUSH pede que os bytes disponíveis avancem sem espera desnecessária. Record marking descreve a estrutura que esses bytes formam. Um mecanismo controla a oportunidade local; o outro permite que pares discordem sobre pacotes e concordem sobre mensagens.
O framing ficou fora do XDR
O corpo RPC usa External Data Representation. A RFC 4506 estabelece tipos, comprimentos, preenchimento e ordem para que máquinas diferentes decodifiquem a mesma mensagem.
Mas o cabeçalho RM é expressamente descrito como fora da forma XDR padrão. Embora compartilhe a ordem de bytes, precisa ser processado antes do valor encerrado. Se a borda dependesse de decodificar primeiro a mensagem inteira, um erro de conteúdo impediria o parser de saber onde procurar a próxima.
A separação preserva diagnósticos. Uma declaração de framing pode ser recusada antes da operação. Um registro completo pode falhar depois na decodificação. “Terminou aqui” não se transforma em “está correto”.
A largura do campo não concedia a memória
Os 31 bits limitam apenas um fragmento. Como um registro aceita vários fragmentos, a base não anuncia um limite total único. Nem o valor máximo é uma ordem para reservar memória. Interpretá-lo assim entrega recursos locais ao remetente.
Recebedores precisam definir limites cumulativos de bytes, quantidade de fragmentos, memória e tempo. Esses números são política da implementação, não novos limites universais atribuídos ao RFC. O ponto do formato é oferecer medidas exatas para aplicar e explicar essa política.
O record marking pode ajudar a detectar e talvez recuperar erros, mas os padrões não dizem para vasculhar o payload atrás de uma palavra que pareça marcador. Qualquer padrão pode ocorrer nos dados. Depois de perder o alinhamento, encerrar a conexão pode evitar que outra chamada receba bytes alheios.
A mesma regra encontrou uma moldura que a substituiu
A RFC 1831 preservou o formato em 1995. A RFC 5531 a substituiu em 2009 sem alteração no fio. O desenho durou porque fez uma coisa: repôs a separação de mensagens sobre TCP.
Na RFC 8166, RPC-over-RDMA tem transport stream e payload stream próprios. Esse framing substitui qualquer outro, inclusive TCP record marking mesmo quando o RDMA corre sobre TCP. Uma ativação dinâmica precisa acontecer entre mensagens RPC distintas e coordenada com o transporte.
Logo, RM não é atributo eterno do procedimento. É a moldura escolhida para um tipo específico de transporte.
Evidência disponível
O conjunto fechado é RFC 793, RFC 1050, RFC 1057, RFC 1831, RFC 4506, RFC 5531, RFC 8166 e RFC 9293. Ele sustenta formato, história e limites, não mede implantação, não certifica bibliotecas e não prova identidade, autorização, correção ou efeito de uma chamada real.
O bit final permaneceu útil porque recusou um papel maior. Ele podia terminar um registro comum a dois parsers sem declarar que o trabalho descrito no interior terminara no mundo.
Briefing para membros
Contexto aprofundado do perfil
Faça login com o nível de assinatura correto para desbloquear o briefing completo e as notas das fontes.
Apenas para Strategic Circle
Strategic Circle
Aberto a todos os leitores. Desbloqueie Briefings de perfil após se inscrever e fazer login.
Junte-se ao Strategic CircleSomente para Leadership Alliance
Leadership Alliance
Para proprietários e gestores qualificados de ativos de PI; faça login para desbloquear os briefings da Leadership Alliance.
Junte-se ao Leadership Alliance
