跳转到内容

网络功能

来自维基教科书,开放世界中的开放书籍


网络
套接字访问
地址族: inet, unix, ...
网络存储
协议
网络接口
网络驱动程序

Linux 内核网络功能涵盖从套接字接口到协议再到网卡。


⚲ Shell 接口

man 8 netstat 打印网络连接、路由表、接口统计信息和其他详细信息
man 8 ip 显示和配置路由、网络设备、接口和隧道
man 8 ss - 套接字统计信息实用程序


套接字

[编辑 | 编辑源代码]

⚲ API

sys/socket.h – 主要用户模式套接字头文件


基本通用和客户端接口

man 2 socket__sys_socket id 创建一个通信端点
struct sockaddr id - 抽象套接字地址
man 2 connect__sys_connect id;
man 2 shutdown 关闭全双工连接的一部分
man 2 send__sys_sendto id 在套接字上发送消息
man 2 recv__sys_recvfrom id, __sys_recvmsg id 从套接字接收消息


其他服务器端接口

man 2 bind__sys_bind id - 将 sockaddr 绑定到套接字
man 2 listen__sys_listen id - 监听套接字上的连接
man 2 accept__sys_accept4 id - 接受套接字上的连接


⚙️ 内部

struct socket id @ linux/net.h inc 包含
struct proto_ops id - 抽象协议接口
struct sock id - 套接字的网络层表示 net/sock.h inc


__sys_socket id ↯ 调用层次结构
sock_createid
__sock_createid
security_socket_createid
sock_allocid
net_proto_family id->create.
例如 inet_create id。有关其他选项,请参阅 地址族


__sys_connect id ↯ 调用层次结构
move_addr_to_kernelid
audit_sockaddrid
__sys_connect_fileid
sock_from_fileid
security_socket_connectid
proto_ops id->connect.
例如 inet_stream_connect id。有关其他选项,请参阅 协议
net/socket.csrc


📚 参考

man 7 socket
linux/socket.hinc
伯克利套接字

网络存储

[编辑 | 编辑源代码]

🚀 高级主题

🔧 待办事项


⚲ API

man 2 sendfiledo_sendfile id.


另请参阅 文件描述符之间的零拷贝

应用层: 网络文件系统
NFS doc
init_nfs_fs id, nfs4_fs_type id, nfs_fs_type id,
init_nfsd id, nfsd_fs_type id
CIFS doc
init_cifsid
cifs_fs_type id, smb3_fs_type id cifs_smb3_do_mount id
目标和 iSCSI 接口指南 doc


⚲ API: man 2 uname, man 2 sethostname, man 2 gethostname, man 2 setdomainname man 2 getdomainname

utsname id


⚙️ 细节

utsname id 返回来自 nsproxy iduts_namespace idnew_utsname id 的可写指针,该指针来自 current id task_struct id
CLONE_NEWUTS idsetns id
kernel/utsname.csrc


📚 参考

man 7 命名空间
man 7 网络命名空间
man 7 uts 命名空间


地址族

[edit | edit source]

⚲ API

man 2 getsockname
man 2 getpeername
地址族 (AF)定义地址格式和地址长度socklen_t.
man 3 inet_ntopman 3 inet_pton (从 AF 导出 socklen_t)


常用 AF: AF_UNIX idAF_INET idAF_NETLINK id


PF - 协议族索引 (PF_MAX id) 实际上与地址族索引 (AF) 相同。


⚙️ 一些 AF 的内部机制

man 7 unixunix_family_ops id - 用于本地 IPC 的套接字
unix_createid
man 7 ipinet_family_ops id - IPv4
inet_createid
man 7 netlinknetlink_family_ops id - 内核和用户空间之间的通信
netlink_createid
man 7 vsockvsock_family_ops id - VM 和虚拟机管理程序之间的通信
vsock_createid
man 7 packetpacket_family_ops id - 设备级接口
packet_createid
bt_sock_family_ops id - 蓝牙
bt_sock_createid

总共有超过 40 个 AF (见 AF_MAX id)


⚙️ 内部

sock_register id - 注册 net_proto_family id。请参阅对这些标识符的引用,以找到超过 30 个协议族。
__sock_createid


📚 进一步阅读

man 8 ip-address – 协议地址管理
互联网层
man 7 地址族

协议

[edit | edit source]

每个协议族 (PF,索引与地址族 AF 相同) 由多个协议实现组成。

目录 /proc/net 包含各种文件和子目录,其中包含有关网络层的详细信息。文件 /proc/net/protocols 列出了可用的和使用的协议。

在每个 PF 中,协议被分类为不同的类型 sock_type id,例如流式套接字、数据报套接字和原始套接字。TCP 是一种流式套接字,UDP 是一种数据报套接字,原始套接字和 ping 是一种原始套接字。

proto_register id - 注册结构体 proto id - 协议实现
inet_init id 初始化调用中,inetsw_array idproto_ops idproto id 
inet_stream_ops id & tcp_prot id tcp_sendmsg id ...
inet_dgram_ops id & udp_prot id udp_sendmsg id ...
inet_sockraw_opsid
raw_prot id raw_sendmsg id ...
ping_prot id ping_v4_sendmsg id ...
af_unix_init id 初始化调用中
unix_family_opsid
unix_createid
unix_stream_ops id unix_stream_sendmsg id ...
unix_dgram_ops id unix_dgram_sendmsg id ...
unix_seqpacket_ops id unix_seqpacket_sendmsg id ...


📚 参考

man 7 tcp
man 7 udp
man 7 raw
传输层TCP


🚀 高级主题


🗝️ 首字母缩略词

IB — InfiniBand,一种互连标准,与 以太网光纤通道 竞争
IPoIB — InfiniBand 网络上的 IP 网络仿真层
SRP — SCSI RDMA 协议
ULP — 上层协议
iSER — iSCSI 用于 RDMA 的扩展


⚲ 接口

https://github.com/linux-rdma/rdma-core
手册 8 rdma
手册 7 rdma_cm — RDMA 通信管理器
include/uapi/rdmasrc
include/rdmasrc


⚙️ 内部

drivers/infinibandsrc
drivers/infiniband/ulp 源码 — 上层协议
drivers/infiniband/sw 源码 — 软件驱动程序
drivers/infiniband/hw 源码 — 硬件设备驱动程序


📚 参考

InfiniBand 文档
InfiniBand 和 RDMA 接口 文档

🚀 高级主题

⚲ 接口

手册 8 ebtables-nft
手册 8 arptables-nft
手册 8 xtables-nft
手册 8 iptables
手册 8 ip6tables
手册 8 ebtables
手册 8 arptables
ipset
linux/netfilter.hinc
uapi/linux/netfilterinc
net/netfilterinc
net/netns/netfilter.hinc
linux/netfilterinc


⚙️ 内部

net/netfiltersrc


📚 参考

Netfilter Sysfs 变量 文档
Netfilter Conntrack Sysfs 变量 文档
Netfilter 的流表基础设施 文档
nftables
https://wiki.nftables.org/
https://lwn.net/Kernel/Index/#Networking-Packet_filtering

网络设备 接口

[编辑 | 编辑源代码]

⚲ 接口

ip -brief link show
ls -l /sys/class/net
devm_register_netdev id 注册 net_device id, net_device_ops
sk_buff id 套接字缓冲区 (skb)
dev_queue_xmit id 将套接字缓冲区排队到发送队列
linux/netdevice.hinc
linux/skbuff.hinc


👁 示例:drivers/net/loopback.c 源码 - 最著名和最简单的接口 lo


⚙️ 内部

net/core/dev.csrc
函数 loopback_xmit id 接收 skb 并使用 netif_rx id 将其传递回


📚 进一步阅读

手册 8 ip-link – 网络设备配置
手册 8 ip-stats – 管理和显示接口统计信息
手册 7 netdevice – 对 Linux 网络设备进行低级访问
手册 7 packet – 设备级别的包接口
Linux 网络栈中的排队


💾 历史

LDP TLK 第 10 章 网络

网络驱动程序

[编辑 | 编辑源代码]
linux/etherdevice.hinc
netif_rx id - 在 NAPI 之前
input_pkt_queueid
NAPI
NAPI 驱动程序设计
⚲ API
netif_napi_add id 添加 napi_struct id
napi_schedule id - 由中断处理程序调用以安排轮询
netif_receive_skb id - 而不是 netif_rx,最终调用 ip_rcv id
napi_complete_done id - 从自定义 napi->poll() 调用
⚙️ 内部
net_dev_initid
net_rx_actionid
napi_poll id 调用自定义 napi->poll()
👁 示例
e1000_intr id 调用 __napi_schedule id
自定义 napi->poll() e1000e_poll id 调用 napi_complete_done id
ether_setup id 设置以太网网络设备
👁 以太网驱动程序示例:e1000_probe id


⚙️ 内部

drivers/netsrc
drivers/net/wirelesssrc
drivers/net/ethernetsrc


📚 参考

手册 8 ethtool – 查询或控制网络驱动程序和硬件设置
数据链路层: 以太网
GRO - 通用接收卸载
分段卸载 文档
https://wireless.wiki.kernel.org




💾 历史

LDD2:网络驱动程序
LDD3:网络驱动程序
内核分析:网络,2003 年
network_overview


📖 有关网络的进一步阅读

网络接口 文档
网络 文档
https://lwn.net/Kernel/Index/#Networking
https://lartc.org/ – Linux 高级路由和流量控制
手册 8 ip – 显示/操作路由、网络设备、接口和隧道
手册 8 tc – 显示/操作流量控制设置
bcc/ebpf 网络工具
基于 eBPF 的网络、安全和可观察性
Retis – 在 Linux 网络栈及其朋友中跟踪数据包
华夏公益教科书