O BaseTCP é um protocolo ponto a ponto leve, construído sobre sockets TCP/IP, que permite a entrega em tempo real de um conjunto de mensagens sequenciadas e não sequenciadas de um servidor para um cliente. O BaseTCP garante que o cliente receba cada mensagem sequenciada gerada pelo servidor na ordem correta, mesmo diante de falhas na conexão do socket TCP/IP subjacente. Mensagens não sequenciadas são entregues pelo BaseTCP apenas em regime de melhor esforço.
Clientes BaseTCP podem enviar mensagens ao servidor. Essas mensagens não são sequenciadas e podem ser perdidas em caso de falha do socket TCP/IP.
O BaseTCP é ideal para sistemas em que o servidor precisa garantir a entrega de determinadas mensagens ao cliente em tempo real, mas não exige o mesmo nível de garantia para as demais. O servidor pode gerar mensagens entregues apenas em regime de melhor esforço (mensagens não sequenciadas), e as mensagens geradas pelo cliente também dispensam garantias, seja porque o fluxo de dados é unidirecional, seja porque a aplicação do servidor gera confirmações de nível superior para as mensagens importantes enviadas pelo cliente.
O BaseTCP foi projetado para ser usado em conjunto com protocolos de nível superior, que especificam o conteúdo das mensagens sequenciadas e não sequenciadas entregues pelo BaseTCP. A camada do protocolo BaseTCP é opaca para as mensagens de nível superior e permite qualquer valor dentro delas.
O BaseTCP também inclui um esquema simples que permite ao servidor autenticar o cliente no login.
O cliente e o servidor BaseTCP se comunicam trocando uma série de pacotes lógicos.
Cada pacote lógico do BaseTCP contém:
Um campo de comprimento de dois bytes, big-endian, que indica o comprimento do restante do pacote (ou seja, o comprimento do payload mais o comprimento do tipo de pacote, que é 1).
Um cabeçalho de um único byte que identifica o tipo do pacote.
Um payload de comprimento variável.
| Packet Length | Packet Type | Payload |
|---|---|---|
| 2 bytes | 1 byte | Comprimento variável |
Uma conexão BaseTCP começa com o cliente abrindo um socket TCP/IP com o servidor e enviando um Pacote de Solicitação de Login. Se a solicitação de login for válida, o servidor responde com um Pacote de Login Aceito e começa a enviar Pacotes de Dados Sequenciados e Não Sequenciados. A conexão continua até que o socket TCP/IP seja interrompido.
Cada Pacote de Dados Sequenciado carrega uma única mensagem do protocolo de nível superior. Pacotes de Dados Sequenciados não contêm um número de sequência explícito; em vez disso, cliente e servidor calculam o número de sequência localmente, contando as mensagens à medida que avançam. Observe que os clientes não devem contar os Pacotes de Dados Não Sequenciados recebidos do servidor ao calcular o número de sequência.
O número de sequência da primeira mensagem sequenciada de cada sessão é sempre 1.
Normalmente, ao fazer o login inicial no servidor, o cliente define o campo Requested Sequence Number como 1 e deixa o campo Requested Session em branco no Pacote de Solicitação de Login. Em seguida, o cliente inspeciona o Pacote de Login Aceito para identificar a sessão ativa no momento. A partir de 1, o cliente incrementa seu número de sequência local a cada Pacote de Dados Sequenciado recebido. Se a conexão TCP/IP for interrompida, o cliente pode fazer novo login no servidor indicando a sessão atual e o próximo número de sequência esperado. Dessa forma, o cliente tem a garantia de sempre receber todas as mensagens sequenciadas em ordem, apesar das falhas de conexão TCP/IP.
O BaseTCP também permite que o cliente envie mensagens ao servidor usando Pacotes de Dados Não Sequenciados a qualquer momento após o recebimento do Pacote de Login Aceito. Essas mensagens podem ser perdidas durante falhas de conexão do socket TCP/IP.
O BaseTCP usa pacotes lógicos de heartbeat para detectar rapidamente falhas de link. O servidor deve enviar um pacote Server Heartbeat sempre que se passar mais de 1 segundo desde o último envio de dados. Isso garante que o cliente receba dados com regularidade. Se o cliente não receber nada (nem dados, nem heartbeats) por um período prolongado, pode assumir que o link caiu e tentar se reconectar usando um novo socket TCP/IP.
Da mesma forma, uma vez logado, o cliente deve enviar um pacote Client Heartbeat sempre que se passar mais de 1 segundo desde o seu último envio. Se o servidor não receber nada do cliente pelo período especificado no "Pacote de Solicitação de Login", ele fecha o socket existente e aguarda uma nova conexão.
O servidor indica que a sessão atual foi encerrada enviando uma Mensagem de Fim de Sessão. Isso indica que não haverá mais mensagens nessa sessão.
O cliente precisará se reconectar e fazer login com o novo Session ID, ou com um Session ID em branco (preenchido com espaços), para começar a receber as mensagens da próxima sessão disponível.
Campos de caractere são bytes ASCII padrão.
Campos inteiros são valores binários big-endian.
O servidor BaseTCP envia um Pacote de Login Aceito em resposta a uma Solicitação de Login válida do cliente. Esse será sempre o primeiro pacote enviado pelo servidor após uma solicitação de login bem-sucedida.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "A" | Pacote de Login Aceito |
| Session | 3 | 10 | Alfanumérico | ID da sessão em que o cliente está logado. Preenchido com espaços à esquerda. |
| Sequence Number | 13 | 20 | Numérico | Número de sequência, em ASCII, da próxima Mensagem Sequenciada a ser enviada. Preenchido com espaços à esquerda. |
O servidor BaseTCP envia este pacote em resposta a um Pacote de Solicitação de Login inválido do cliente. O servidor fecha a conexão do socket após enviar o Pacote de Login Rejeitado. Em caso de tentativa de login malsucedida, o Pacote de Login Rejeitado será o único pacote enviado pelo servidor.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "J" | Pacote de Login Rejeitado |
| Reject Reason Code | 3 | 1 | Alfabético | Ver códigos abaixo |
| Código | Explicação |
|---|---|
| A | Não autorizado. A combinação de usuário e senha informada na Mensagem de Solicitação de Login é inválida. |
| S | Sessão indisponível. A sessão informada em Requested Session no Pacote de Solicitação de Login é inválida ou não está disponível. |
Os Pacotes de Dados Sequenciados funcionam como envelope para transportar as mensagens de dados sequenciadas transferidas do servidor para o cliente. Cada Pacote de Dados Sequenciado carrega uma mensagem sequenciada do protocolo de nível superior. O número de sequência de cada mensagem é implícito: o número de sequência inicial do primeiro Pacote de Dados Sequenciado de uma conexão TCP/IP é informado no Pacote de Login Aceito, e o número de sequência é incrementado em 1 a cada Pacote de Dados Sequenciado transmitido.
Como os pacotes lógicos do BaseTCP trafegam por sockets TCP/IP, a única forma de perdê-los é uma falha na conexão do socket TCP/IP. Nesse caso, o cliente pode se reconectar ao servidor, solicitar o próximo número de sequência esperado e continuar de onde parou.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "S" | Pacote de Dados Sequenciado |
| Message | 3 | Variável | Qualquer | Definido pelo protocolo de nível superior |
Os Pacotes de Dados Não Sequenciados funcionam como envelope para transportar as mensagens de dados não sequenciadas transferidas do servidor para o cliente. Cada Pacote de Dados Não Sequenciado carrega uma mensagem não sequenciada do protocolo de nível superior. Essas mensagens não são sequenciadas e não devem atualizar o número de sequência inicial do cliente em tentativas de login posteriores.
Os Pacotes de Dados Não Sequenciados enviados pelo servidor são entregues apenas em regime de melhor esforço. Eles são entregues no máximo uma vez, na mesma ordem em que são gerados pelo protocolo de nível superior. No entanto, algumas mensagens podem ser perdidas por problemas na conexão TCP/IP, inclusive buffers cheios. Se houver perda, nenhuma parte da mensagem perdida será transmitida. O BaseTCP não define o comportamento do protocolo de nível superior quando mensagens não sequenciadas são perdidas; essa semântica é definida pelo próprio protocolo de nível superior.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "U" | Pacote de Dados Não Sequenciado |
| Message | 3 | Variável | Qualquer | Definido pelo protocolo de nível superior |
O servidor deve enviar um Pacote de Heartbeat do Servidor sempre que se passar mais de 1 segundo sem envio de dados ao cliente. O cliente pode então assumir que o link caiu se não receber nada por um período prolongado.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "H" | Pacote de Heartbeat do Servidor |
O servidor envia um Pacote de Fim de Sessão para indicar que a sessão atual foi encerrada. A conexão é fechada logo após este pacote, e o usuário não poderá mais se reconectar à sessão atual.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "Z" | Pacote de Fim de Sessão |
O cliente BaseTCP deve enviar um Pacote de Solicitação de Login imediatamente após estabelecer uma nova conexão de socket TCP/IP com o servidor.
Cliente e servidor devem ter combinado previamente os campos de usuário e senha. Eles oferecem uma autenticação simples, para evitar que um cliente se conecte por engano ao servidor errado.
Username e Password não diferenciam maiúsculas de minúsculas e devem ser preenchidos com espaços à direita.
O servidor pode encerrar um socket TCP/IP de entrada se não receber um Pacote de Solicitação de Login em até 30 segundos.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "L" | Pacote de Solicitação de Login |
| Username | 3 | 6 | Alfanumérico | Usuário |
| Password | 9 | 10 | Alfanumérico | Senha |
| Requested Session | 19 | 10 | Alfanumérico | Sessão em que o cliente deseja fazer login, ou tudo em branco para entrar na sessão ativa no momento. |
| Requested Sequence Number | 29 | 20 | Numérico | Próximo número de sequência, em ASCII, que o cliente deseja receber ao se conectar, ou 0 para começar a receber a mensagem gerada mais recentemente. |
| Heartbeat Timeout | 49 | 5 | Numérico | Timeout de heartbeat do cliente, em milissegundos. Se nenhuma mensagem ou heartbeat for recebido nesse intervalo, o servidor fecha o socket e aguarda uma nova conexão. |
Os Pacotes de Dados Não Sequenciados funcionam como envelope para transportar as mensagens de dados transferidas do cliente para o servidor. Essas mensagens não são sequenciadas e podem ser perdidas em caso de falha do socket. O protocolo de nível superior deve ser capaz de lidar com essas mensagens perdidas em caso de falha na conexão do socket TCP/IP.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "U" | Pacote de Dados Não Sequenciado |
| Message | 3 | Variável | Alfanumérico | Definido pelo protocolo de nível superior |
O cliente deve enviar um Pacote de Heartbeat do Cliente sempre que se passar mais de 1 segundo sem envio de dados ao servidor. O servidor pode então assumir que o link caiu se não receber nada por um período prolongado.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Inteiro | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "R" | Pacote de Heartbeat do Cliente |
O cliente pode enviar um Pacote de Solicitação de Logout para pedir o encerramento da conexão. Ao receber um Pacote de Solicitação de Logout, o servidor encerra imediatamente a conexão e fecha o socket TCP/IP associado.
| Nome | Offset | Comprimento | Valor | Observações |
|---|---|---|---|---|
| Packet Length | 0 | 2 | Binário | Número de bytes após este campo até o próximo pacote |
| Packet Type | 2 | 1 | "O" | Pacote de Solicitação de Logout |
| Versão | Compatível com versão anterior |
Criticidade | Descrição da Alteração | Data |
|---|---|---|---|---|
| 1.0 | - | Relevante | Versão original | 05/10/2026 |