Resposta breve à pergunta: O hardware / firmware da interface de rede e o sistema operacional fazem tudo isso.
Mais precisamente, há alguns drivers envolvidos. O dispositivo normalmente cobre as camadas 1 (física) e 2 (ligação de dados) OSI, isto é, a tradução entre sinais físicos (elétricos, rádio) e bits e agrupando-os em quadros é feita pelo hardware / firmware. O driver do dispositivo controla as funções correspondentes. As camadas 3 (rede) e 4 (transporte) são cobertas pelo sistema operacional, embora os processos privilegiados possam ter acesso aos dados.
How does the OS get a hold of the frame?
Uma vez que a interface de rede tem um quadro disponível, ele aciona uma interrupção, para que o kernel possa lê-lo na região de memória de E / S.
Os dados do cabeçalho do quadro informam o que fazer com o quadro. Se o kernel (mais precisamente: o driver de rede) conhecer o tipo de carga útil (por exemplo, IPv4 ou IPv6), o pacote (depois de retirar os cabeçalhos e trailers da camada 2) é passado ao driver da camada de rede.
Ele cuidará de todas as peculiaridades do protocolo da camada de rede, como fragmentação e remontagem, cálculo e verificação da soma de verificação, etc. além de todas as tarefas específicas da camada de rede, como roteamento e filtragem de pacotes. Dependendo da carga útil (TCP, UDP, ICMP, ICMPv6, GRE, SCTP, DCCP, etc.), o pacote é transmitido para o segundo driver da camada de transporte. Ele irá lidar com todo o material específico da camada de transporte; para protocolos orientados à conexão, como o TCP, significa, por exemplo, acompanhar o estado da conexão, manter as filas e fazer a contabilidade; outra coisa é o controle de congestionamento.
Uma vez que um pacote tenha passado por essa camada, ele é passado mais adiante (novamente após remover o cabeçalho da camada de transporte), mas desta vez para o processo userland. O processo userland não vê praticamente nada do processamento de nível inferior.
Agora, é possível acessar e processar dados brutos, como frames da userland, você pode fazer isso com um software como o libpcap. No entanto, fazer tudo isso no kernel é mais eficiente.