Receber pacotes em UDP
-
06-07-2019 - |
Pergunta
Vamos dizer que meu programa envia um 1000 bytes através da rede (UDP). Isso garantiu que o receptor receberá os 1000 bytes em um "lote"? Ou talvez ele vai precisar para realizar sevral "lê" até que ele receberá a mensagem inteira? se o mais tarde é verdade, como posso garantir que a ordem dos pacotes para a mesma mensagem não obter "mista" (em ordem), ou talvez as garantias Protocolo,
Editar : ou seja, não é possível que a minha mensagem será dividida para pacotes sevral? (E se eu tentar enviar uma mensagem 10000mb, o que acontece então?)
Solução
Você vai ter tudo ou nada.
Mas não há nenhuma garantia especial que você vai receber pacotes exatamente uma vez na ordem em que foram transmitidos; perda de pacotes, reordenação e (menos frequentemente) a duplicação, tudo é possível.
Existe um tamanho máximo de quadro (de 65.507 bytes), send () ing pacotes de maiores dimensões vai devolver um erro.
Você deve fornecer tampão suficiente para receber todo o quadro em uma chamada.
pacotes UDP pode ser fragmentado em múltiplos fragmentos de IP, mas o sistema vai cair um pacote incompleto. Este é, portanto, transparente para o aplicativo.
Outras dicas
O receptor terá todo o pacote em uma chamada. O tamanho do pacote é limitado, mesmo em teoria :
Comprimento Um campo de 16 bits que especifica o comprimento em bytes da totalidade datagrama: cabeçalho e dados. O mínimo comprimento é de 8 bytes desde que é a comprimento do cabeçalho. O tamanho do campo define um limite teórico de 65.535 bytes (8 bytes de cabeçalho + 65527 bytes de dados) para um datagrama UDP. o limite prático para o comprimento de dados que é imposta pela subjacente protocolo IPv4 é 65.507 bytes.
No entanto, o limite real é muito, muito menor, geralmente é seguro assumir que 512 bytes. Consulte Qual é o maior Tamanho Seguro UDP Packet em Internet.
Os dados enviados usando UDP é agrupado em pacotes , por isso, se você envia x quantidade de bytes, em seguida, se o receptor recebe o pacote, ele receberá x quantidade de bytes.
No entanto, seus pacotes pode até não chegar, ou eles podem chegar fora de ordem.
UDP, ao contrário do TCP, não é um protocolo confiável. Ele não fornece construído em um mecanismo para garantir que os pacotes chegam na ordem correta, ou mesmo chegar a todos. Dito isto, você pode escrever suas rotinas de envio / recv de forma passo de bloqueio, onde cada vez que um pacote é enviado, o remetente deve esperar para receber um ACK antes de enviar novamente. Se um ACK não é recebido depois de algum tempo de espera especificado, o pacote deve ser reenviado. Desta forma, você garantir que os pacotes sejam recebidos na ordem correta. (Para mais informações, consulte a RFC para o protocolo TFTP , que usa esta estratégia .)
Finalmente, se possível, você pode querer considerar o uso de TCP em vez.
Com UDP Lite você pode pedir para receber pacotes parcialmente corrompidos. Isto pode ser útil para serviços de vídeo e de VoIP.