Até certo ponto, o que acontece depende do SO e da aplicação. No entanto, pode-se fazer a seguinte sequência de previsões:
-
Primeiro, a pilha 's janela de recepção irá encher, com algo um pouco menor que a taxa de dados completa da rede. Ele preenche mais lento que a taxa de linha da rede devido ao algoritmo de início lento do TCP e outros efeitos da maneira como pilhas TCP / IP se comportam.
A janela TCP pode ter até 128 KiB (menos 1 byte) na minha caixa Linux. (Diga
sysctl net.core.rmem_max
para obter o valor da caixa .) Geralmente, ele é menor que esse valor máximo. O padrão é 4 KiB na minha caixa. (Digasysctl net.ipv4.tcp_rmem
para obter esse valor.) -
Seu aplicativo terá algum buffer próprio. Pode ser de apenas 1 byte, mas não pode ser zero. O Linux precisaria de um syscall de cópia zero como
recvfile()
para evitar a necessidade de buffer de aplicativo, e ele não tem isso.O tamanho do buffer é totalmente do programador da aplicação. Nos programas que escrevi, usei de cerca de uma dúzia de bytes até 64 KiB, dependendo das necessidades do aplicativo. Inferi o uso de buffers muito maiores (Mi1 MiB) em outros aplicativos, observando como eles se comportam.
-
O aplicativo certamente usará algum tipo de mecanismo de E / S em buffer para gravar o arquivo, como C 's stdio . Isto é tipicamente pelo menos 1 KiB, e pode ser vários KiB. Na minha caixa aqui, parece que o padrão é 8 KiB.
É possível que o aplicativo esteja usando E / S sem buffer ou esteja constantemente liberando os buffers de E / S para o disco, mas isso é incomum.
-
O driver de dispositivo para o dispositivo de armazenamento pode ter algum buffer. Provavelmente não é muito, mas um buffer página de 4 KiB não seria irracional.
-
O próprio dispositivo de armazenamento quase certamente tem algum cache. Os discos rígidos modernos têm caches na ordem de algumas dezenas de megabytes, por exemplo. Se você estiver escrevendo em um dispositivo RAID, pode haver um cache de write-back ainda maior também.
Todos os cinco desses buffers precisam ser preenchidos antes que o desempenho bruto de E / S do dispositivo de armazenamento subjacente possa ter algum efeito. Como eles poderiam facilmente adicionar até 100 MiB ou mais, você precisará testar com um tamanho de transferência maior do que isso, se quiser ter certeza de que não está apenas testando o comportamento combinado desses buffers.
Depois de abordar tudo isso, responderei à sua pergunta de nível superior: contanto que você esteja usando um protocolo de rede com mecanismo de controle de fluxo - por exemplo TCP - não deve haver nenhum problema resultante do cenário que você propõe. No entanto, se você estiver usando um protocolo de rede não confiável como UDP , e o protocolo de aplicação construído sobre ele não fornece seu próprio mecanismo de controle de fluxo, o aplicativo pode ser forçado a soltar pacotes nesta situação.