Camada de Apresentação layers

OSI Layer 6: Sintaxe e Semântica

Função Principal

Define a sintaxe e semântica dos dados transmitidos, garantindo que sistemas heterogêneos (ex.: Windows e Linux) "falem a mesma língua" por meio de conversão, compressão e criptografia.

Responsabilidades

  • compare_arrows Conversão de Formatos: Traduz dados entre representações (ex.: ASCII para UTF-8).
  • compress Compressão: Reduz o tamanho dos dados para otimizar a transmissão (ex.: gzip).
  • lock Criptografia: Garante confidencialidade e integridade (ex.: TLS/SSL).
  • movie Multimídia: Encapsula formatos como JPEG e MPEG para transmissão eficiente.

Exemplo Real

Um e-mail enviado de um cliente Windows (usando UTF-16) para um servidor Linux (usando UTF-8) é convertido pela Camada de Apresentação para garantir compatibilidade. Navegadores web também decodificam respostas HTTP em JSON ou comprimidas com gzip.

OSI vs. TCP/IP

Modelo OSI Modelo TCP/IP Funções
Camada 6 (Apresentação) Camada de Aplicação Codificação, Compressão, Criptografia
Camada 7 (Aplicação) Camada de Aplicação Interface com usuário, protocolos (ex.: HTTP)

Observação: No modelo TCP/IP, as funções da Camada de Apresentação se misturam às camadas de aplicação e transporte, mas conceitualmente pertencem à Camada 6.

Boas Práticas

  • Adote padrões abertos (ex.: Unicode, TLS) para máxima interoperabilidade.
  • Teste compatibilidade entre sistemas com diferentes codificações.

Camada de Apresentação code

Codificação, Serialização & Segurança

📌 Missão da Camada

Tradução de dados entre sistemas heterogêneos, garantindo que aplicações interpretem corretamente:

  • Codificação de caracteres (ASCII ↔ Unicode)
  • Serialização de estruturas complexas
  • Compressão/criptografia transparente

translate Codificação de Texto

swap_horiz ASCII ↔ EBCDIC

Conversão essencial para integração com mainframes IBM:

'A' → ASCII: 0x41 ↔ EBCDIC: 0xC1

language Unicode (UTF-8/16)

  • UTF-8: 1-4 bytes (retrocompatível com ASCII)
  • UTF-16: 2/4 bytes (ideal para ideogramas)
'あ' → UTF-8: 0xE3 0x81 0x82

data_object Serialização de Dados

view_list JSON/XML

Vantagens: Legível, ideal para APIs web

{"nome":"João","idade":30}

memory ASN.1/BER

Casos de uso: Certificados digitais, SNMP

30 12 02 01 01 16 0D 48 65 6C 6C 6F 20 57 6F 72 6C 64 21

compare Comparativo Técnico

Formato Tamanho Velocidade Segurança Caso de Uso
ASCII 7-8 bits ⭐️⭐️⭐️⭐️⭐️ Sem criptografia Terminais, logs
UTF-8 1-4 bytes ⭐️⭐️⭐️⭐️ BOM pode vazar info Aplicações web
JSON Médio ⭐️⭐️⭐️ XSS se mal validado APIs REST
ASN.1/DER Compacto ⭐️⭐️⭐️⭐️⭐️ Resistente a tampering Certificados, SNMP

security Byte Order Mark (BOM) - Risco de Vazamento

O BOM (0xEF 0xBB 0xBF) em arquivos UTF-8 pode revelar:

EF BB BF 48 65 6C 6C 6F // "Hello" com BOM
  • Metadados do editor (ex.: arquivos gerados no Windows)
  • BOM Leak Os bytes EF BB BF no início de arquivos UTF-8 podem revelar que o arquivo foi criado em editores específicos (ex.: Windows Notepad)
  • Sistema operacional origem
  • Prefira UTF-8 sem BOM para aplicações web

verified ASN.1/DER - Resistência a Tampering

Estrutura binária rígida previne alterações maliciosas:

30 13 02 01 01 16 0E 48 65 6C 6C 6F 20 57 6F 72 6C 64 21
30 13 02 01 FF 16 0E 48 65 6C 6C 6F 20 57 6F 72 6C 64 21
  • Tampering Alterações maliciosas em dados serializados (ex.: mudar valores em JSON)
  • Validação estrutural (TLV: Type-Length-Value)
  • Assinatura digital em certificados
  • Detecção de alterações via checksum

🔐 Boas Práticas

  • Sempre especifique codificação (ex.: Content-Type: application/json; charset=utf-8)
  • Valide inputs durante desserialização para prevenir injection
  • Prefira formatos binários (Protocol Buffers, ASN.1) para sistemas críticos

Compressão de Dados compress

Reduzindo o Tamanho dos Dados para Otimizar Redes

Por Que Comprimir Dados em Redes?

A compressão de dados é uma técnica essencial na Camada de Apresentação (OSI Layer 6) e em muitas aplicações para otimizar a transmissão. Ela reduz o tamanho dos dados antes que sejam enviados pela rede, trazendo benefícios diretos:

Quando e Por Que Usar?

A compressão é fundamental para otimizar a comunicação em cenários como:

  • Largura de Banda Limitada: Permite enviar mais informações em conexões lentas.
  • Tempos de Carregamento: Acelera o download de páginas web e arquivos.
  • Custos de Transferência: Reduz o volume de dados consumido, o que pode diminuir gastos com tráfego.
  • Armazenamento: Economiza espaço em discos e dispositivos de memória.

Algoritmos de Compressão Comuns

Existem diversos algoritmos, cada um com suas características e usos específicos:

  • swap_vert gzip / DEFLATE:

    É uma combinação de dois algoritmos poderosos:
    LZ77: Substitui sequências de bytes repetidas por referências a ocorrências anteriores dentro de uma "janela deslizante" (buffer). Pense nisso como encontrar "Ctrl+C" e "Ctrl+V" para trechos de texto.
    Huffman Coding: Atribui códigos de comprimento variável aos caracteres ou sequências. Caracteres mais frequentes recebem códigos mais curtos, e caracteres menos frequentes, códigos mais longos, otimizando o espaço total.

    Muito utilizado em transferências web (HTTP), arquivos `.gz` em sistemas Unix/Linux e dentro de formatos como ZIP.

  • view_array LZW (Lempel-Ziv-Welch):

    Usa um dicionário dinâmico que é construído durante a compressão e descompressão. Sequências de bytes que aparecem repetidamente são adicionadas a esse dicionário e, a partir da segunda vez, são substituídas por um código de índice único.

    Este algoritmo é comum em formatos de imagem como GIF e TIFF, e também em documentos PDF.

Exemplo Prático: Compressão com gzip no Terminal Linux

Vamos ver como o gzip pode reduzir o tamanho de um arquivo de texto diretamente no terminal:

bash
$ echo "Este é um texto repetitivo para demonstrar compressão. Texto repetitivo." > arquivo.txt
$ wc -c arquivo.txt # Mostra o tamanho em bytes do arquivo original
100 arquivo.txt # Exemplo: 100 bytes

$ gzip -c arquivo.txt | wc -c # Comprime o arquivo e mostra o tamanho do resultado
50 # Exemplo: 50 bytes (50% do original)

Exemplo Prático: Compressão e Descompressão com gzip em Python

Python possui a biblioteca gzip nativa, que facilita a implementação da compressão e descompressão:

compressao.py
import gzip

# Dados originais em bytes (necessário para gzip.compress)
texto_original = b"Este e um texto para compressao. Este e um texto para compressao repetitiva."

# --- Comprimir os dados ---
dados_comprimidos = gzip.compress(texto_original)

print("Tamanho original:", len(texto_original), "bytes")
print("Tamanho comprimido:", len(dados_comprimidos), "bytes")

# --- Descomprimir os dados ---
dados_descomprimidos = gzip.decompress(dados_comprimidos)
print("Texto descomprimido:", dados_descomprimidos.decode()) # Decodifica de bytes para string

Uso da Compressão de Dados na Prática de Redes

A compressão é onipresente na Internet e em muitas aplicações:

  • http HTTP (Web): Servidores web frequentemente comprimem respostas (HTML, CSS, JavaScript) antes de enviá-las ao navegador. Os cabeçalhos HTTP como Accept-Encoding: gzip, deflate, br (o navegador indica o que suporta) e Content-Encoding: gzip (o servidor indica o que enviou) são usados para negociar e sinalizar a compressão. Isso acelera drasticamente o carregamento de páginas.
  • lock PGP (Pretty Good Privacy): Antes de criptografar e-mails ou arquivos para segurança, o PGP geralmente os compacta usando algoritmos como o ZIP. Isso não só reduz o tamanho final do arquivo cifrado, mas também pode tornar a análise criptoanalítica mais difícil, pois remove padrões repetitivos.
  • file_download Transferência de Arquivos: Ferramentas como `rsync` e `scp` podem usar compressão para otimizar transferências de arquivos em links de rede, especialmente para arquivos de texto ou dados com alta redundância.

Comparação Simplificada de Algoritmos

Algoritmo Técnica Principal Uso Comum
gzip / DEFLATE Combinação de LZ77 e Huffman Coding HTTP, arquivos .gz, formato ZIP
LZW Dicionário dinâmico de sequências Imagens (GIF, TIFF), documentos PDF

Boas Práticas de Compressão em Redes

Para usar a compressão de forma eficaz, considere os seguintes pontos:

  • Compressão Lossless (Sem Perda):

    Preserva todos os bits originais dos dados, sem qualquer perda de informação. É obrigatório para dados críticos (textos, códigos, números, documentos).
    Exemplos: gzip, ZIP, PNG (para imagens com poucas cores/detalhes).

  • Compressão Lossy (Com Perda):

    Sacrifica intencionalmente parte da informação original para obter uma taxa de compressão muito maior. É aceitável para dados multimídia onde pequenas perdas não são perceptíveis ao olho ou ouvido humano.
    Exemplos: JPEG (reduz qualidade de imagem), MP3 (elimina frequências inaudíveis), MPEG (para vídeo).

  • Evite Comprimir Dados Já Comprimidos: Tentar comprimir um arquivo JPEG ou MP3 com `gzip` (compressão lossless) geralmente resulta em pouco ou nenhum ganho e apenas consome recursos da CPU. Esses arquivos já foram otimizados por algoritmos lossy.
  • Considere o Custo Computacional: A compressão e descompressão exigem poder de processamento. Em sistemas com recursos limitados (como dispositivos IoT ou servidores com muito tráfego), o benefício da redução de dados deve superar o custo de CPU.
Lembre-se: A compressão é uma ferramenta poderosa para a eficiência da rede, mas deve ser usada com sabedoria, escolhendo o algoritmo e o tipo de compressão (lossless/lossy) adequados para cada tipo de dado e cenário.

Criptografia & TLS/SSL lock

Protegendo Comunicações Digitais

🔐 Pilares da Segurança

visibility_off Confidencialidade

Apenas destinatários legítimos podem ler

verified Integridade

Dados não podem ser alterados em trânsito

person Autenticidade

Identidade das partes verificada

vpn_key Tipos de Criptografia

sync Simétrica (AES-256)

  • Mesma chave para cifrar/decifrar
  • Alta performance (1-3 Gbps)
  • Usada para dados da sessão
openssl enc -aes-256-cbc -in plain.txt -out encrypted.bin

key Assimétrica (RSA/ECC)

  • Par de chaves (pública/privada)
  • Lenta (100-1000x mais que simétrica)
  • Usada no handshake
openssl genpkey -algorithm RSA -out private.key

handshake TLS 1.3 Handshake

1. ClientHello TLS_AES_256_GCM_SHA384
2. ServerHello Certificate
3. KeyExchange (EC)DHE
4. Finished HMAC
openssl_s_client.txt
$ openssl s_client -connect example.com:443 -tls1_3
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Peer certificate: CN=example.com
Verified: OK

security Configurações Seguras

Componente Recomendado Obsoleto Riscos
Protocolo TLS 1.3 SSLv3, TLS 1.0/1.1 POODLE, BEAST
Cifras AES-GCM, ChaCha20 RC4, DES, 3DES CRIME, SWEET32
Troca de Chaves (EC)DHE, X25519 RSA Key Transport Logjam, Weak DH

warning Boas Práticas

  • Use certificados válidos de autoridades confiáveis (Let's Encrypt, DigiCert)
  • Ative HSTS (Strict-Transport-Security) para forçar HTTPS
  • Teste configurações com SSL Labs (testssl.sh)
  • Renove certificados antes de expirarem (automatize com Certbot)

Multimídia & Streaming image

JPEG, PNG, MPEG, RTSP, RTP/RTCP

Por que Formatar?

  • photo Preparar dados binários para aplicações de imagem e vídeo.
  • movie Otimizar reprodução sequencial em tempo real.
  • network_check Garantir sincronização e qualidade de serviço (QoS).

Encapsulamento de Mídia

  • JPEG / PNG: Imagens estáticas; JPEG usa compressão com perdas (reduz redundância espacial), PNG é sem perdas (preserva todos os bits).
  • MPEG (MP4, H.264): Vídeo com compressão com perdas, explorando redundância espacial (dentro de quadros) e temporal (entre quadros).

Protocolos de Streaming

  • RTSP: Protocolo de controle com comandos como OPTIONS, DESCRIBE, PLAY, PAUSE para gerenciar sessões de mídia.
  • RTP / RTCP: RTP transporta mídia em tempo real (com timestamp e número de sequência) sobre UDP; RTCP monitora QoS e sincroniza áudio/vídeo.

Exemplo: Sessão RTSP

rtsp_session.txt
C->S: DESCRIBE rtsp://exemplo.com/stream/1 RTSP/1.0
S->C: RTSP/1.0 200 OK
C->S: SETUP rtsp://exemplo.com/stream/1/trackID=1 RTSP/1.0
S->C: RTSP/1.0 200 OK; Transport: RTP/AVP;unicast;client_port=8000–8001
C->S: PLAY rtsp://exemplo.com/stream/1 RTSP/1.0
S->C: RTSP/1.0 200 OK; Range: npt=0.000–

Exemplo: Testando um Stream RTSP

Use um player como ffplay para conectar a um stream:
ffplay rtsp://exemplo.com:554/stream1

Comparação de Formatos

Formato Tipo de Compressão Uso Comum
JPEG Com perdas (espacial) Fotografias, web
PNG Sem perdas Imagens com transparência, gráficos
MPEG (H.264) Com perdas (espacial/temporal) Vídeos, streaming

Boas Práticas

  • Use H.264/H.265 para vídeos com alta compressão e qualidade.
  • Configure RTCP para monitoramento de QoS em streaming em tempo real.
  • Prefira PNG para imagens que exigem transparência ou detalhes precisos; use JPEG para fotos com tamanho reduzido.
  • Utilize UDP com RTP para baixa latência em streaming.
Nota: RTSP gerencia a sessão de streaming, enquanto RTP (sobre UDP) transporta mídia com baixa latência, usando timestamps e números de sequência. RTCP complementa com estatísticas de desempenho e sincronização de áudio/vídeo.

Atividade Prática play_arrow

Observando Handshake TLS/SSL

visibility Objetivo

Analisar o handshake TLS/SSL para entender como a Camada de Apresentação garante criptografia, confidencialidade e autenticação, usando o comando openssl s_client.

Passos

  1. Abra um terminal e execute:
    openssl s_client -connect exemplo.com:443 -msg -debug
  2. Na saída, localize as etapas do handshake:
    • ClientHello: Versão TLS, cifras, nonce.
    • ServerHello + Certificate: Cifra escolhida, certificado X.509.
    • ServerKeyExchange: Parâmetros da chave (se aplicável).
    • ClientKeyExchange: Chave pré-mestra (se aplicável).
    • ChangeCipherSpec + Finished: Ativação do canal seguro e confirmação.
  3. Identifique os nonces, a cifra negociada (ex.: TLS_AES_256_GCM_SHA384), e o certificado (ex.: CN=exemplo.com).

Exemplo de Saída

exemplo_tls_debug.txt
$ openssl s_client -connect exemplo.com:443 -msg
---
>>> TLS 1.3, ClientHello, length = 512
Ciphers: [TLS_AES_256_GCM_SHA384, ...]
<<< TLS 1.3, ServerHello, length = 128
Cipher: TLS_AES_256_GCM_SHA384
<<< TLS 1.3, Certificate, length = 2048
Subject: CN=exemplo.com
<<< TLS 1.3, ServerKeyExchange, length = 256 (if applicable)
<<< TLS 1.3, ChangeCipherSpec, length = 1
<<< TLS 1.3, Finished, length = 36

Extensão: Captura de Tráfego

Capture o tráfego TLS com:
sudo tcpdump -i eth0 host exemplo.com and port 443 -w handshake.pcap
Analise o arquivo handshake.pcap com o Wireshark para visualizar pacotes.

Comparação de Mensagens do Handshake

Mensagem Propósito
ClientHello Inicia handshake, propõe versão TLS e cifras
ServerHello Confirma versão TLS e cifra escolhida
Certificate Autentica o servidor com chave pública
ClientKeyExchange Envia chave pré-mestra (se aplicável)
ChangeCipherSpec Ativa criptografia simétrica
Finished Confirma handshake bem-sucedido

Boas Práticas

  • Use -tls1_3 para forçar TLS 1.3 e observar um handshake moderno.
  • Teste com diferentes sites (ex.: google.com, facebook.com) para comparar cifras.
  • Verifique a validade do certificado (ex.: CN, data de expiração) para evitar ataques "man-in-the-middle".
  • Use Wireshark com tcpdump para análise detalhada do tráfego.