Em termos de código, é o código que existe no espaço do kernel que realmente manipula a implementação do TCP para cima dos drivers da NIC. O kernel do Linux está ciente do seu hardware de rede e o abstrai em um conjunto de adaptadores de link. A pilha TCP / UDP / IP está ciente desses dispositivos de "link" e é ainda mais abstraída para conceitos de nível Linux / Unix, como soquetes.
Os processos acessam essa funcionalidade por meio de chamadas do sistema para o kernel. Enquanto o conceito de um processo no Linux é isolado ou fechado a partir do kernel, é tecnicamente verdade que cada processo é capaz de acessar essa funcionalidade através de chamadas do sistema.
Isso significa que quando os dados são recebidos na NIC, o kernel manipula o TCP. Quando um aplicativo recebe dados do buffer que o processo está manipulando TCP, embora apenas de uma maneira bloqueada por meio de chamadas do sistema no espaço / memória do kernel por meio de sua inicialização de uma chamada do sistema.
Como o Linux é preventivo, mesmo as chamadas para o espaço do kernel são parte de pelo menos como o kernel controla o compartilhamento de tempo dos processos, portanto, tecnicamente, você pode considerar o TCP como parte de todo processo. Mas se você considerar apenas o código que pertence a esse espaço de memória de processos (aplicativos de espaço do usuário), apenas o kernel tratará o TCP.
Lembre-se de que o Linux / Unix incorpora alguma funcionalidade de soquete que está abstraindo o TCP / IP em bibliotecas que estão vinculadas ao tempo de compilação de um aplicativo, portanto, estaria em seu espaço de memória. Como estruturas de memória usadas para representar endereços IP.