为什么Linux内核有`struct sock`和`struct socket`?

use*_*136 9 sockets linux-kernel

这个问题之前在互联网上被问过,但我找不到一个好的答案.

Linux内核网络堆栈具有两种结构:

这两种结构基本上是相连的,但似乎寿命略有不同.人们可以找到一个sk通道sock->sk,或找到一个sock通道sk->sk_socket.

为什么有两种结构来存储有关套接字的信息?假设我需要添加一个新字段,何时将其添加到struct socket何时struct sock

UPDATE:请注意,我指的是struct socketinclude/linux/net.hLinux源代码,这只是针对内核代码了,里面没有 /usr/include/sys/socket.h这意味着用户空间.

mya*_*aut 9

struct socket似乎是一个用于系统调用的更高级别的接口(这就是为什么它还有指向struct file文件描述符的指针).

struct sockAF_INET套接字的内核实现(也有struct unix_sock针对AF_UNIX它的派生的套接字),可以由内核和用户空间(via struct sock)使用.

两者都在1993年被添加到Linux 1.0中,我怀疑你会找到一个指定初始设计决策的文档.

  • @ user1202136:因为它与[分解](https://en.wikipedia.org/wiki/Decomposition_(computer_science))相矛盾,它可以使事情更简单.另请注意,`AF_INET`和`AF_UNIX`只是43中的2个(参见`AF_MAX`)可用的套接字类型.在创建低层实现结构之前,`struct socket`是由`socket()`创建的. (2认同)