Estou analisando o tráfego entre um cliente e um servidor Linux em execução em um servidor blade HP, o cliente às vezes fica parado esperando por mais dados quando o servidor da Web fechar a conexão.
O servidor web executa o apache2 que, por alguma razão, escolhe rodar o HTTP / 1.1 com conexão fechada em vez de permitir que o cliente envie múltiplas requisições na mesma conexão e feche a conexão, como o padrão HTTP / 1.1 (Isso é outra história .. Mas deixa o servidor com vários milhares de sockets TIME_WAIT em vez de empurrar esse estado para o cliente) ...
De qualquer forma, às vezes, um pedido HTTP é interrompido, ainda não sei onde ele realmente quebra. No lado do servidor tudo parece bem, exceto que o cliente começa a enviar um monte de pacotes RST, entre os acks.
Eu tenho capturas do tcpdump do servidor web e do NAT pelo qual o cliente passa, eu suspeitaria do NAT se não fosse por um comportamento muito estranho no servidor web.
Quando o servidor da Web atende a solicitação HTTP GET, o primeiro pacote de saída é 2960 bytes em carga IP, 2974 em conexão. Isso é muito estranho já que no cliente final no NAT o cliente recebe dois pacotes de 1514 bytes com 1460 bytes de carga TCP.
Os próximos e futuros pacotes que deixam a interface no servidor da web usam uma carga útil de 1460 (1514 on wire) que está dentro do MTU.
Acredito que alguma mágica é feita no SLB (Cisco) que fica entre o servidor da Web e a rede, de modo que o primeiro pacote DF do 2960 é espremido pelo SLB e magicamente é dividido no SLB por alguma interceptação avançada do L3.
Q1) Por que a pilha apache webserver / tcp tentaria até mesmo empurrar um pacote de 2960 bytes em uma interface que tenha MTU configurada para 1500?
Q2) Como é que a rede chega ao cliente como dois pacotes?
Q3) Como o webserver sabe que o MTU deve ser diminuído para 1460, mesmo que nenhum ICMP chegue com o conjunto "Fragmentation needed", já que todos os pacotes têm o bit DF definido.
Não me pergunte por que eu faço essas perguntas, eu sou apenas um cara em uma grande organização tentando entender por que as coisas às vezes não funcionam.
Eu tenho alguns logs tcpdump interessantes que eu posso postar se necessário, eu só tenho que substituir adições IP públicas e tal ...