Qual é a diferença entre soquetes (fluxo) vs soquetes (datagramas)? Por que usar um sobre o outro?
Qual é a diferença entre soquetes (fluxo) vs soquetes (datagramas)? Por que usar um sobre o outro?
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.
Soquete de fluxo:
Soquete do datagrama:
fonte
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.
fonte