Cotas de transporte
As cotas de transporte são um mecanismo de política para decidir quando uma conexão está consumindo recursos excessivos. Uma cota é um limite rígido que impede o uso de recursos adicionais depois que o valor da cota é excedido. As cotas de transporte impedem ataques de negação de serviço mal-intencionados ou não intencionais.
Os transportes do WCF (Windows Communication Foundation) têm valores de cota padrão baseados em uma alocação conservadora de recursos. Esses valores padrão são adequados para ambientes de desenvolvimento e cenários de instalação pequenos. Os administradores de serviço devem examinar as cotas de transporte e ajustar valores de cotas individuais caso uma instalação esteja ficando sem recursos ou se as conexões estiverem sendo limitadas, apesar da disponibilidade de recursos adicionais.
Tipos de cotas de transporte
Os transportes do WCF têm três tipos de cotas:
Os tempos limite reduzem os ataques de negação de serviço que dependem da associação de recursos por um longo período de tempo.
Os limites de alocação de memória impedem uma única conexão de esgotar a memória do sistema e negar serviço a outras conexões.
Os limites de tamanho da coleção associam o consumo de recursos que alocam indiretamente a memória ou estão em oferta limitada.
Descrições de cotas de transporte
Esta seção descreve as cotas de transporte disponíveis para os transportes padrão do WCF: HTTP(S), TCP/IP e pipes nomeados. Os transportes personalizados podem expor suas próprias cotas configuráveis não incluídas nesta lista. Consulte a documentação de um transporte personalizado para saber mais sobre suas cotas.
Cada definição de cota tem um tipo, um valor mínimo e um valor padrão. O valor máximo de uma cota é limitado por seu tipo. Devido às limitações do computador, nem sempre é possível definir uma cota como seu valor máximo.
Nome | Tipo | Mín. value |
Padrão value |
Descrição |
---|---|---|---|---|
ChannelInitializationTimeout |
TimeSpan | 1 tique | 5 segundos | Tempo máximo a aguardar que uma conexão envie o preâmbulo durante a leitura inicial. Esses dados são recebidos antes da autenticação ocorrer. Essa definição geralmente é muito menor que o valor da cota ReceiveTimeout . |
CloseTimeout |
TimeSpan | 0 | 1 minuto | Tempo máximo a aguardar que uma conexão feche antes que o transporte gere uma exceção. |
ConnectionBufferSize |
Integer | 1 | 8 KB | Tamanho, em bytes, dos buffers de transmissão e recebimento do transporte subjacente. Aumentar o tamanho do buffer pode melhorar a taxa de transferência ao enviar mensagens grandes. |
IdleTimeout |
TimeSpan | 0 | 2 min | Tempo máximo em que uma conexão em pool pode permanecer ociosa antes de ser fechada. Essa definição só se aplica a conexões em pool. |
LeaseTimeout |
TimeSpan | 0 | 5 min | Tempo de vida máximo de uma conexão ativa em pool. Depois que o tempo especificado tiver decorrido, a conexão será fechada quando a solicitação atual for atendida. Essa definição só se aplica a conexões em pool. |
ListenBacklog |
Integer | 1 | 10 | Número máximo de conexões que o ouvinte pode ter não servidas antes que conexões adicionais com esse ponto de extremidade sejam negadas. |
MaxBufferPoolSize |
long | 0 | 512 KB | Memória máxima, em bytes, que o transporte dedica ao agrupamento de buffers de mensagens reutilizáveis. Quando o pool não pode fornecer um buffer de mensagem, um novo buffer é alocado para uso temporário. Instalações que criam muitas fábricas de canais ou ouvintes podem alocar grandes quantidades de memória para pools de buffers. Reduzir esse tamanho de buffer pode reduzir consideravelmente o uso de memória nesse cenário. |
MaxBufferSize |
Integer | 1 | 64 KB | Tamanho máximo, em bytes, de um buffer usado para transmitir dados. Se essa cota de transporte não estiver definida ou o transporte não estiver usando streaming, o valor da cota será o mesmo que o menor entre o valor da cota MaxReceivedMessageSize e MaxValue. |
MaxOutboundConnectionsPerEndpoint |
Integer | 1 | 10 | Número máximo de conexões de saída que podem ser associadas a um ponto de extremidade específico. Essa definição só se aplica a conexões em pool. |
MaxOutputDelay |
TimeSpan | 0 | 200 ms | Tempo máximo a aguardar após uma operação de envio para envio em lote de mensagens adicionais em uma única operação. As mensagens serão enviadas anteriormente se o buffer do transporte subjacente ficar cheio. O envio de mensagens adicionais não redefine o período de atraso. |
MaxPendingAccepts |
Integer | 1 | 1 | Número máximo de aceitações para canais que o ouvinte pode ter em espera. Há um intervalo de tempo entre a conclusão de aceitação e uma nova aceitação tendo início. Aumentar esse tamanho de coleção pode impedir que os clientes que se conectam durante esse intervalo sejam removidos. |
MaxPendingConnections |
Integer | 1 | 10 | Número máximo de conexões que o ouvinte pode ter em espera para serem aceitas pelo aplicativo. Quando esse valor de cota é excedido, novas conexões de entrada são descartadas em vez de esperar para serem aceitas. Os recursos de conexão, como segurança de mensagem, podem fazer com que um cliente abra mais de uma conexão. Os administradores de serviço devem considerar essas conexões adicionais ao definir esse valor de cota. |
MaxReceivedMessageSize |
long | 1 | 64 KB | Tamanho máximo, em bytes, de uma mensagem recebida, incluindo cabeçalhos, antes que o transporte gere uma exceção. |
OpenTimeout |
TimeSpan | 0 | 1 minuto | Tempo máximo a aguardar que uma conexão seja estabelecida antes que o transporte gere uma exceção. |
ReceiveTimeout |
TimeSpan | 0 | 10 min | Tempo máximo a aguardar que uma operação de leitura seja concluída antes que o transporte gere uma exceção. |
SendTimeout |
Timespan | 0 | 1 minuto | Tempo máximo a aguardar que uma operação de gravação seja concluída antes que o transporte gere uma exceção. |
As cotas de transporte MaxPendingConnections
e MaxOutboundConnectionsPerEndpoint
são combinadas em uma única cota de transporte chamada MaxConnections
quando definida por meio de associação ou configuração. Somente o elemento de associação permite definir esses valores de cota individualmente. A cota de transporte MaxConnections
tem os mesmos valores mínimos e padrão.
Definir cotas de transporte
As cotas de transporte são definidas por meio do elemento de associação de transporte, da associação de transporte, da configuração do aplicativo ou da política de host. Este documento não abrange a definição de transportes por meio da política de host. Consulte a documentação do transporte subjacente para descobrir as definições para cotas de política de host. O tópico Configurar HTTP e HTTPS descreve as definições de cota para o driver Http.sys. Pesquise na base de dados de conhecimento da Microsoft mais informações sobre como configurar limites do Windows em HTTP, TCP/IP e conexões de pipe nomeado.
Outros tipos de cotas se aplicam indiretamente aos transportes. O codificador de mensagens que o transporte usa para transformar uma mensagem em bytes pode ter suas próprias definições de cota. No entanto, essas cotas são independentes do tipo de transporte que está sendo usado.
Controlar cotas de transporte no elemento de associação
Definir cotas de transporte por meio do elemento de associação oferece a maior possível flexibilidade no controle do comportamento do transporte. Os tempos limite padrão para as operações Fechar, Abrir, Receber e Enviar são obtidos da associação quando um canal é criado.
Nome | HTTP | TCP/IP | Pipe nomeado |
---|---|---|---|
ChannelInitializationTimeout |
X | X | |
CloseTimeout |
|||
ConnectionBufferSize |
X | X | |
IdleTimeout |
X | X | |
LeaseTimeout |
X | ||
ListenBacklog |
X | ||
MaxBufferPoolSize |
X | X | X |
MaxBufferSize |
X | X | X |
MaxOutboundConnectionsPerEndpoint |
X | X | |
MaxOutputDelay |
X | X | |
MaxPendingAccepts |
X | X | |
MaxPendingConnections |
X | X | |
MaxReceivedMessageSize |
X | X | X |
OpenTimeout |
|||
ReceiveTimeout |
|||
SendTimeout |
Controlar cotas de transporte na associação
Definir cotas de transporte por meio da associação oferece um conjunto simplificado de cotas a escolher enquanto ainda dá acesso aos valores de cota mais comuns.
Nome | HTTP | TCP/IP | Pipe nomeado |
---|---|---|---|
ChannelInitializationTimeout |
|||
CloseTimeout |
X | X | X |
ConnectionBufferSize |
|||
IdleTimeout |
|||
LeaseTimeout |
|||
ListenBacklog |
X | ||
MaxBufferPoolSize |
X | X | X |
MaxBufferSize |
1 | X | X |
MaxOutboundConnectionsPerEndpoint |
2 | 2 | |
MaxOutputDelay |
|||
MaxPendingAccepts |
|||
MaxPendingConnections |
2 | 2 | |
MaxReceivedMessageSize |
X | X | X |
OpenTimeout |
X | X | X |
ReceiveTimeout |
X | X | X |
SendTimeout |
X | X | X |
A cota de transporte
MaxBufferSize
só está disponível na associaçãoBasicHttp
. As associaçõesWSHttp
são para cenários que não dão suporte a modos de transporte transmitidos.As cotas de transporte
MaxPendingConnections
eMaxOutboundConnectionsPerEndpoint
são combinadas em uma cota de transporte única chamadaMaxConnections
.
Controlar cotas de transporte na configuração
A configuração do aplicativo pode definir as mesmas cotas de transporte que acessar diretamente as propriedades em uma associação. Nos arquivos de configuração, o nome de uma cota de transporte sempre começa com uma letra minúscula. Por exemplo, a propriedade CloseTimeout
em uma associação corresponde à definição closeTimeout
na configuração e a propriedade MaxConnections
em uma associação corresponde à definição maxConnections
na configuração.