Good find de Mike Penningtion (no comentários ) encontrando uma descrição técnica detalhada do caminho de uma solicitação pela Rede e backup (específico para o Linux OS 2005).
Uma visão mais detalhada, onde os seguintes passos foram extraídos de :
Observe que, embora as etapas listadas não sejam tão detalhadas quanto o documento mencionado acima, aproximadamente as etapas são:
O sistema operacional tem um descritor de arquivo dedicado para a porta ethernet rx,
The rx ring is a ring in the kernel memory where the network card transfers the incoming packet through DMA. The raw data which is stored in the rx ring structure is either copied into a sk buff structure.
Isso dispara um ISR para mover o pacote para a camada de rede. Note que isso escolhe se o pacote deve ser processado ou encaminhado (o que foi interessante, como imagino, talvez seja assim que o encaminhamento de ativação funciona, como para VPNs)
Se válido, passa para a camada IP. Ele verifica seu protocolo (do cabeçalho IP) e se o protocolo é TCP, chama a tcp v4 rcv
fucntion, passando para a camada TCP.
E esta parte é crucial:
The next step for this function is to find an open socket for this incoming packet,
isso é feito chamando o tcp v4 lookup
, no seguinte segmento de código:
sk = __tcp_v4_lookup(skb->nh.iph->saddr, th->source,
skb->nh.iph->daddr, ntohs(th->dest),
tcp_v4_iif(skb));
Essencialmente, eu entendo que há uma LUT mapeando o socket TCP para o endereço / portas de origem e destino da conexão do socket, como indicado por aquela chamada de função.
Se houver um soquete válido, os dados serão colocados em tcp_data_queue
para continuar aumentando a pilha para o consumo de aplicativos.