Resposta curta: tcp_nagle_check () em net_ipv4_tcp_output.c
Você pode ver as condições para evitar Nagle no código:
/* Return false, if packet can be sent now without violation Nagle's rules:
* 1. It is full sized. (provided by caller in %partial bool)
* 2. Or it contains FIN. (already checked by caller)
* 3. Or TCP_CORK is not set, and TCP_NODELAY is set.
* 4. Or TCP_CORK is not set, and all sent packets are ACKed.
* With Minshall's modification: all sent small packets are ACKed.
*/
static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,
int nonagle)
{
return partial &&
((nonagle & TCP_NAGLE_CORK) ||
(!nonagle && tp->packets_out && tcp_minshall_check(tp)));
}
Uma possível pilha de chamadas para esta função pode ser tcp_sendmsg_locked () - > tcp_push () - > __ tcp_push_pending_frames () - > tcp_write_xmit () - > tcp_nagle_test () - > tcp_nagle_check () tcp_sendmsg_locked () (em net / ipv4 / tcp.c) é a principal função para enviar dados. Em cada chamada para a função, obtém um segmento de dados de um soquete e o prepara para a transmissão. O algoritmo Nagle é uma otimização para agregar os dados que chegam através do soquete para otimizar o fluxo de transmissão. Talvez você também queira conferir TCP corking e auto-corking , como eles funcionam de forma semelhante ao Nagle, mas pode ter prioridade sobre a opção NO_DELAY. Para garantir que seus pacotes sejam enviados sem atraso, capture-os (com tcpdump) e verifique se o tamanho do pacote enviado é um pouco maior que o tamanho dos dados enviados pelo seu aplicativo (devido aos cabeçalhos adicionados).