Linux操作系统原理—内核网络协议栈( 二 )


网络协议层(Network protocols):对应 IP layer 和 Transport layer 。 毫无疑问 , 这是整个内核网络协议栈的核心 。 这一层主要实现了各种网络协议 , 最主要的当然是 IP , ICMP , ARP , RARP , TCP , UDP 等 。
协议无关层(Protocol agnostic interface) , 又称协议接口层 , 本质就是 Socket 层 。 这一层的目的是屏蔽网络协议层中诸多类型的网络协议(主要是 TCP 与 UDP 协议 , 当然也包括 RAW IP ,SCTP 等等) , 以便提供简单而同一的接口给上面的系统调用层调用 。 简单的说 , 不管我们应用层使用什么协议 , 都要通过系统调用接口来建立一个 SOCKET , 这个 SOCKET 其实是一个巨大的 sock 结构体 , 它和下面的网络协议层联系起来 , 屏蔽了不同的网络协议 , 通过系统调用接口只把数据部分呈献给应用层 。
BSD(Berkeley Software Distribution)socket:BSD Socket 层 , 提供统一的 SOCKET 操作接口 , 与 socket 结构体关系紧密 。
INET(指一切支持 IP 协议的网络) socket:INET socket 层 , 调用 IP 层协议的统一接口 , 与 sock 结构体关系紧密 。
系统调用接口层(System call interface) , 实质是一个面向用户空间(User Space)应用程序的接口调用库 , 向用户空间应用程序提供使用网络服务的接口 。
Linux操作系统原理—内核网络协议栈
本文插图
协议栈的数据结构
Linux操作系统原理—内核网络协议栈
本文插图
msghdr:描述了从应用层传递下来的消息格式 , 包含有用户空间地址 , 消息标记等重要信息 。
iovec:描述了用户空间地址的起始位置 。
file:描述文件属性的结构体 , 与文件描述符一一对应 。
file_operations:文件操作相关结构体 , 包括 read、write、open、ioctl 等 。
socket:向应用层提供的 BSD socket 操作结构体 , 协议无关 , 主要作用为应用层提供统一的 Socket 操作 。
sock:网络层 sock , 定义与协议无关操作 , 是网络层的统一的结构 , 传输层在此基础上实现了 inet_sock 。
sock_common:最小网络层表示结构体 。
inet_sock:表示层结构体 , 在 sock 上做的扩展 , 用于在网络层之上表示 inet 协议族的的传输层公共结构体 。
udp_sock:传输层 UDP 协议专用 sock 结构 , 在传输层 inet_sock 上扩展 。
proto_ops:BSD socket 层到 inet_sock 层接口 , 主要用于操作 socket 结构 。
proto:inet_sock 层到传输层操作的统一接口 , 主要用于操作 sock 结构 。
net_proto_family:用于标识和注册协议族 , 常见的协议族有 IPv4、IPv6 。
softnet_data:内核为每个 CPU 都分配一个这样的 softnet_data 数据空间 。 每个 CPU 都有一个这样的队列 , 用于接收数据包 。