Qual é a diferença entre fluxos e datagramas na programação de rede?

131

Qual é a diferença entre soquetes (fluxo) vs soquetes (datagramas)? Por que usar um sobre o outro?

RoR
fonte

Respostas:

304

Há muito tempo, li uma ótima analogia para explicar a diferença entre os dois. Não me lembro de onde o li, infelizmente não posso dar crédito ao autor pela idéia, mas também adicionei muito do meu conhecimento à analogia principal. Então aqui vai:

Um soquete de fluxo é como uma ligação telefônica - um lado faz a ligação, o outro atende, você se cumprimenta (SYN / ACK no TCP) e depois troca informações. Quando terminar, você se despede (FIN / ACK no TCP). Se um lado não se despede, eles normalmente ligam para o outro, já que este é um evento inesperado; geralmente o cliente se reconectará ao servidor. Há uma garantia de que os dados não chegarão em um pedido diferente do que você os enviou e há uma garantia razoável de que os dados não serão danificados.

Um soquete de datagrama é como passar uma nota na aula. Considere o caso em que você não está diretamente próximo à pessoa para quem está passando a nota; a nota passará de pessoa para pessoa. Pode não chegar ao seu destino e pode ser modificado quando chegar lá. Se você passar duas notas para a mesma pessoa, elas podem chegar em uma ordem que você não pretendia, pois o caminho que as notas percorrem na sala de aula pode não ser o mesmo, uma pessoa pode não passar uma nota tão rápido quanto a outra, etc. .

Portanto, você usa um soquete de fluxo ao ter informações em ordem e intactas. Os protocolos de transferência de arquivos são um bom exemplo aqui. Você não deseja baixar algum arquivo com o conteúdo aleatoriamente danificado!

Você usaria um soquete de datagrama quando a ordem é menos importante do que a entrega pontual (pense em protocolos de jogo ou VoIP), quando você não deseja uma sobrecarga mais alta de um fluxo (é por isso que o DNS é principalmente um protocolo de datagrama, para que os servidores possam responda a muitas solicitações de uma só vez muito rapidamente) ou quando você não se importa muito se os dados chegam ao seu destino.

Para expandir o caso do VoIP / jogo, esses protocolos incluem seu próprio mecanismo de pedido de dados. Mas se um pacote estiver danificado ou perdido, você não deseja esperar no protocolo de fluxo (geralmente TCP) para emitir uma solicitação de reenvio - você precisa se recuperar rapidamente. O TCP pode levar até alguns minutos para se recuperar e, para protocolos em tempo real como jogos ou VoIP, até três segundos podem ser inaceitáveis! O uso de um protocolo de datagrama como o UDP permite que o software se recupere de um evento extremamente rápido, simplesmente ignorando os dados perdidos ou solicitando-os mais cedo do que o TCP faria.

O VoIP é um bom candidato para simplesmente ignorar os dados perdidos - uma parte apenas ouviria uma pequena lacuna, semelhante ao que acontece quando se fala com alguém no celular quando a recepção é ruim. Os protocolos de jogos geralmente são um pouco mais complexos, mas as ações tomadas geralmente são para ignorar os dados ausentes (se os dados recebidos subsequentemente substituem os dados perdidos), solicitar novamente os dados ausentes ou solicitar uma atualização completa do estado para verifique se o estado do cliente está sincronizado com o do servidor.

cdhowie
fonte
3
Simplesmente excelente por incluir os detalhes do SYNACK.
LazerSharks
2
Este exemplo, ou um muito semelhante, é da Interface de Programação do Linux. A edição de 2010 contém estes exemplos nas páginas 1155 e 1159.
Josh
30

Soquete de fluxo:

  • Canal dedicado e de ponta a ponta entre servidor e cliente.
  • Use o protocolo TCP para transmissão de dados.
  • Confiável e sem perdas.
  • Dados enviados / recebidos na mesma ordem.
  • Muito tempo para recuperar dados perdidos / errados

Soquete do datagrama:

  • Canal não dedicado e ponto a ponto entre servidor e cliente.
  • Use UDP para transmissão de dados.
  • Não é 100% confiável e pode perder dados.
  • Os dados enviados / recebidos podem não ser os mesmos.
  • Não se importe ou recupere rapidamente dados perdidos / errados.
Alejandro Blasco
fonte
Os dados não são enviados na mesma ordem (não apenas "semelhantes")? ie não faria sentido construir um mecanismo de pacote de pedidos a uma tomada de corrente
Matthew D. Scholefield
Pacotes em uma comunicação de fluxo são enviados e recebidos em ordem "semelhante", no sentido de que os próprios pacotes NÃO são garantidos para serem entregues ao host de recebimento em ordem, mas o TCP descobre as discrepâncias, reorganizando os pacotes à medida que chegam e solicitando algo isso parece ter se perdido ao longo do caminho.
Alejandro Blasco
Isso faz sentido. Talvez apenas remova isso como uma diferença e coloque-a abaixo (já que estou entendendo corretamente, quando me refiro apenas à ordem em que os pacotes são enviados, em ambos os casos, a ordem em que os dados são enviados / recebidos pode não ser o mesmo).
Matthew D. Scholefield
@Rick Mais precisamente, os soquetes são conhecidos como pontos de ponta a ponta porque os protocolos de transporte são responsáveis ​​por entregar mensagens a um ou vários pontos de extremidade da rede.
Alejandro Blasco
0

Se for a programação de rede, acho que começar com soquetes seria um bom começo.
socket = ip + port
existem três tipos de
fluxo de soquetes (TCP, ordem e entrega garantidos, sem duplicação, sem limites de comprimento ou char para dados, orientados a conexão, confiáveis, simultâneos)
datagrama (UDP, baseado em pacotes, sem conexão, datagrama limite de tamanho, dados podem ser perdidos ou duplicados, ordem não garantida, não confiável) em
bruto (acesso direto aos protocolos de camada inferior IP, ICMP)
Não vejo nenhuma regra estrita para o tipo de protocolo de transporte quanto ao soquete que deve ser usado para o protocolo de transporte e confiabilidade não deve ser confundida, pois o UDP é confiável caso as duas extremidades estejam ativas.
Confiabilidade refere-se mais à confiabilidade da entrega, pois há verificações de número de sequência usando o TCP como protocolo de transporte que não existe no UDP. É melhor usar o protocolo de rede analisador como o wireshark tcpdump etc para ver exatamente o que seu software está fazendo; tipo de verificação ou teoria de fusão no papel com seu trabalho em ação.

hakkican
fonte