Code to implement network protocols can be either inside the kernel of an operating system or in user-level processes. Kernel-resident code is hard to develop, debug, and maintain, but user-level implementations typically incur significant overhead and perform poorly.
No takes yet. Share an insight, caveat, or question.
Mogul et al. (1987) studied this question.