Protocolos para devs: HTTP, TCP e UDP
Protocolo HTTP
Posso dizer que esse é um dos protocolos, se não o mais usado entre os desenvolvedores. Esse protocolo vive na camada de aplicação e é o mecanismo principal usado pelas nossas aplicações para expor nossos serviços à internet. O HTTP faz a transferência de hipermídia que é a junção de hipertexto e multimídia e por isso ficou com esse nome. Esse formato possibilita que consigamos formar mensagens que contenha: texto, vídeo, som, foto, etc.
Verbos HTTP
Os verbos HTTP são métodos que realizam uma ação que é enviada ao servidor para processar por meio da solicitação de um cliente. São eles:
Método HTTP | Definição |
---|---|
OPTIONS | Retorna a lista de outros métodos HTTP suportados pelo servidor na URL fornecida. |
TRACE | Ecoa a solicitação original conforme recebida pelo servidor, útil para identificar modificações feitas à solicitação durante o trânsito. |
CONNECT | Estabelece um túnel TCP/IP transparente entre o cliente e o servidor de destino. |
GET | Recupera uma cópia do recurso especificado pela URL, sem efeitos colaterais no servidor. |
HEAD | Solicita os mesmos cabeçalhos que uma requisição GET, mas sem retornar o corpo da resposta. |
POST | Envia dados no corpo da requisição para que o servidor os armazene como um novo recurso. |
PUT | Atualiza ou cria um recurso na URL especificada com o conteúdo enviado no corpo da requisição. |
PATCH | Realiza atualizações parciais em um recurso existente usando os dados fornecidos no corpo da requisição. |
DELETE | Exclui permanentemente o recurso localizado na URL especificada. |
Alguns métodos como HEAD, GET, OPTIONS e TRACE são considerados seguros pelo motivo de não alterar nada no servidor e apenas solicitar informações. Recomendo a leitura desse artigo que eu escrevi sobre idempotência que mostra um outro lado nessa questão do método ser seguro ou não.
Códigos de estado
O HTTP envia como parte da resposta ao cliente um código que informa o estado da solicitação feita. Devemos imaginar que nem sempre a solicitação vai ser sucesso e que não temos bola de cristal para saber o que aconteceu caso alguma coisa tenha dado errado. Para isso temos uma lista de status que define que tipo de erro aconteceu. Os códigos são formados por 3 números: O primeiro dígito indica a natureza geral da resposta e o segundo e terceiro dígitos informam o problema exato encontrado. Desta forma, podemos considerar que os códigos de status são categorizados por seu primeiro dígito. São eles:
Código | Categoria | Descrição |
---|---|---|
1XX | Informativo | Indica que a solicitação foi recebida e o processamento continua. |
2XX | Sucesso | Indica que a solicitação foi recebida, compreendida e processada com sucesso. |
3XX | Redirecionamento | Indica que é necessário redirecionamento para completar a solicitação. |
4XX | Erro do Cliente | Indica que houve um erro causado pela solicitação do cliente. |
5XX | Erro do Servidor | Indica que o servidor falhou ao processar uma solicitação válida. |
Formato da mensagem HTTP
As solicitações e resposta são sempre enviadas em formato de texto simples. Esse texto tem uma ordem de informações que são analisadas pelo destinatário. Nesse texto temos 3 componentes obrigatórios e 1 opcional.
1 º Componente: consiste no método, o caminho do recurso e a versão do protocolo HTTP. Ex: GET /users/id/12 HTTP/1.1
2 º Componente: headers e seus valores. Ex: Accept: application/json.
3º Componente: Linha vazia
4º Componente (Opcional): um corpo de mensagem de solicitação
GET /users/id/12 HTTP/1.1
Accept: application/json
{
"name": "João da Silva",
"email": "[email protected]"
}
O texto da resposta fornecida pelo servidor segue o mesmo padrão:
HTTP/1.1 201 Created
Content-Type: application/json
Content-Length: 58
Location: /users/123
{
"id": 123,
"name": "João da Silva",
"email": "[email protected]"
}
TCP e UDP
TCP (Transmission Control Protocol)
Este protocolo foi desenvolvido em 1974 e é usado para realizar a comunicação com um host e realizar a entrega confiável dos pacotes. Esse protocolo reside na camada de transporte e fornece a confiabilidade de entrega dos pacotes. Toda implementação que usa esse protocolo tem sua escrita feita para lidar com a perda de pacotes. Outro detalhe que o TCP nos entrega é a possibilidade de entregar os pacotes na ordem que foi enviado e caso haja algum problema no caminho ele refaz a solicitação e reordena os pacotes, fazendo assim o controle do fluxo.
Entretanto, o "custo" disso tudo acaba recaindo sobre a latência e desempenho, já que pode ocorrer idas e vindas para buscar o mesmo dado várias vezes dependendo do cenário de erro. Em uma aplicação que queremos desempenho como streaming de vídeo, jogos, devemos sacrificar a confiabilidade de que o dado foi entregue e para isso usamos o protocolo UDP.

Abaixo estão os mecanismos utilizados pelo TCP para garantir a entrega do pacote:
Mecanismo | Descrição | Função Principal |
---|---|---|
Numeração de sequência | Numera cada byte de dados enviado para controle de ordem e identificação | Ordenar os dados e detectar perdas |
Confirmação (ACK) | O receptor envia uma confirmação informando os dados recebidos com sucesso | Confirmar o recebimento dos dados |
Retransmissão | Reenvio dos segmentos não confirmados após timeout | Garantir entrega mesmo em caso de perda |
Controle de fluxo | Usa janela deslizante para limitar quantidade de dados enviados ao receptor | Evitar sobrecarregar o receptor |
Controle de congestionamento | Ajusta taxa de envio para evitar congestionar a rede usando algoritmos específicos | Prevenir congestionamento na rede |
Detecção de erros | Usa checksum para verificar integridade dos dados transmitidos | Detectar dados corrompidos |
UDP (User Datagram Protocol)
Este protocolo é usado para comunicação simples onde não é exigido que haja confiança na entrega dos dados e também ele não cria uma conexão entre os host como o TCP realizada. Mais abaixo explicarei o que seria uma comunicação com conexão e sem conexão. o UDP não realiza o tratamento de erros igual o TCP faz e isso acaba dando mais desempenho a ele do que o TCP.
Comunicação com conexão e sem conexão
A ideia desses dois conceitos é a seguinte: na comunicação com conexão, antes de transmitir os dados, os hosts precisam estabelecer uma linha de comunicação — como um “aperto de mão” entre eles, sinalizando que podem começar a trocar informações. Esse é o caso do protocolo TCP, que realiza esse processo de handshaking entre os hosts.
Por outro lado, na comunicação sem conexão, utilizada pelo UDP, os dados são enviados diretamente, sem esse handshaking. Nesse tipo de comunicação, a transmissão acontece em uma única direção, sem que o remetente receba uma confirmação (“ok”) de que o pacote foi entregue, ao contrário do TCP, que garante esse retorno.

Lembrando que a garantia de entrega dos pacotes pelo TCP não se dá pelo handshaking e sim por outro mecanismos conforme citado acima. O handshaking valida se o host está ativo e está disponível para começar a comunicação.
Resumidamente, o protocolo TCP e UDP é isso:
Característica | TCP | UDP |
---|---|---|
Conexão | Sim (com handshaking) | Não |
Garantia de entrega | Sim | Não |
Ordenação dos pacotes | Sim | Não |
Controle de fluxo | Sim | Não |
Velocidade | Mais lenta (por causa do controle) | Mais rápida (sem controle) |
Uso típico | Navegação web, e-mails, FTP | Streaming, jogos, VoIP |
Restrições de rede
Temos alguns detalhes como largura de banda, latência e intensidade do sinal. Cada uma dessas restrições, tem um papel importante para definir o tamanho máximo de uma unidade atômica de dados (menor bloco de informação que é tratado ou transmitido de forma independente em uma rede). Essas limitações exigem que os dados transmitidos pela rede precisam incluir vários atributos para que cada nó que receba tal dado seja possível interpretar o contexto.
Abaixo está uma pincelada nessas 3 restrições
Largura de banda
Largura de banda é a quantidade máxima de dados que podem ser transmitidos por uma rede em um dado intervalo de tempo, geralmente medida em bits por segundo (bps).
Uma analogia comum compara a rede a uma rodovia: os dados são os carros, e a largura da estrada representa a largura de banda. Quanto mais faixas (ou maior a largura da estrada), mais carros (bits) podem passar ao mesmo tempo.
É importante não confundir largura de banda com a velocidade de navegação percebida, que também depende de outros fatores como latência, congestionamento e perdas. A largura de banda representa o potencial teórico máximo de transmissão, mas o valor efetivo pode ser menor na prática.
Latência
Segundo o livro latência é:
A latência é o tempo entre o momento inicial em que um sinal é enviado e o primeiro momento em que uma resposta a esse sinal pode ser iniciada. É o atraso de uma rede
Um dos exemplos que usamos para medir a latência é o famoso ping, que envia uma solicitação simples a outro dispositivo e mede o tempo de ida e volta. O tempo que o outro dispositivo leva para processar a solicitação é descartado da conta para medir a latência
Força do sinal
A intensidade do sinal pode variar nas redes, especialmente nas sem fio ou nas que usam fios de cobre. A distância e a resistência afetam o sinal, o que pode fazer os dados chegarem corrompidos. Para resolver isso, os engenheiros usam técnicas como isolar os fios e aumentar a força do sinal. No entanto, em redes grandes, a confiabilidade diminui e a perda de dados acaba acontecendo. Por isso, é melhor dividir os dados em pacotes pequenos, o que ajuda a minimizar o impacto de erros e torna mais fácil enviar novamente os pacotes perdidos.
Se um bit em um pacote for perdido, isso pode corromper o pacote todo. Então, quanto menores os pacotes, menos dados serão perdidos. Mas se os pacotes forem muito pequenos, o desempenho da rede pode cair. Por isso, os pacotes geralmente têm entre algumas centenas de bytes e alguns kilobytes. Além disso, os pacotes precisam ter um sistema de detecção de erros, para que, se um pacote estiver corrompido, ele possa ser descartado e enviado de novo. A comunicação nas redes é feita com pacotes pequenos para garantir que os dados cheguem de forma confiável.
Com isso finalizamos essa parte, mais teórica, mas promete que no próximo artigo terá um pouco mais de emoção porque iremos falar sobre Streams
em C#.
Navegação
- Artigo Anterior: Resumo do Livro Hands-On Network Programming with C# and .NET Core - Parte 2
- Próximo Artigo: Trabalhando com Stream no C#