Você não especificou de que kernel você está falando.
Do ponto de vista da BSD, tudo é explicado em TCP / IP Illustrated, Volume 2: A implementação por Gary R. Wright W. Richard Stevens
A versão curta segue:
- O quadro chega ao anel descritor rx da NIC. Através do DMA, ele é transferido para o anel RX na RAM.
- O driver converte os descritores específicos do dispositivo no anel RX para algum tipo de estrutura geral do kernel da rede (por exemplo,
mbuf
/mbuf_cluster
ousk_buff
). Também aqui o pacote é copiado para bpf . - Em
ether_input
, dependendo das famílias de protocolo e endereço do quadro, ele é processado pela entrada de matrizprotosw
(comutador de protocolo) correspondente. - Então, depois que o datagrama
ip_input
outcp_input
/udp_input
chegar na camada de soquete aoso_rcvbuf
(buffer de recebimento do soquete) do daemon de roteamento correspondente. - A partir desse ponto, o daemon de roteamento geralmente é notificado sobre dados pendentes no soquete por meio de algum tipo de recurso de notificação de E / S ( selecione (2) / enquete (2) / epoll (7) / kqueue (2) ) e usa recv (3) nesse soquete para extrair a carga útil dos pacotes. Aqui
(e)glibc
/libc
/libSystem
toma seu lugar. - O daemon de roteamento é mágico e altera a (s) tabela (s) de roteamento dos kernels por meio de sockets de roteamento ( PF_ROUTE em derivados BSD ou PF_NETLINK 's NETLINK_ROUTE no Linux)