网络功能
外观
< Linux 内核
网络 |
---|
套接字访问 |
地址族: inet, unix, ... |
网络存储 |
协议 |
网络接口 |
网络驱动程序 |
Linux 内核网络功能涵盖从套接字接口到协议再到网卡。
⚲ Shell 接口
- man 8 netstat 打印网络连接、路由表、接口统计信息和其他详细信息
- man 8 ip 显示和配置路由、网络设备、接口和隧道
- man 8 ss - 套接字统计信息实用程序
⚲ API
基本通用和客户端接口
- 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。有关其他选项,请参阅 地址族。
- net_proto_family id->create.
- __sock_createid
- sock_createid
- __sys_connect id ↯ 调用层次结构
📚 参考
🚀 高级主题
🔧 待办事项
⚲ API
另请参阅 文件描述符之间的零拷贝
⚲ API: man 2 uname, man 2 sethostname, man 2 gethostname, man 2 setdomainname man 2 getdomainname
⚙️ 细节
- utsname id 返回来自 nsproxy id 中 uts_namespace id 的 new_utsname id 的可写指针,该指针来自 current id task_struct id。
- CLONE_NEWUTS id,setns id
- kernel/utsname.csrc
📚 参考
地址族
[edit | edit source]⚲ API
- man 2 getsockname
- man 2 getpeername
- 地址族 (AF)域定义地址格式和地址长度socklen_t.
- man 3 inet_ntop,man 3 inet_pton (从 AF 导出 socklen_t)
常用 AF: AF_UNIX id,AF_INET id,AF_NETLINK id。
PF - 协议族索引 (PF_MAX id) 实际上与地址族索引 (AF) 相同。
⚙️ 一些 AF 的内部机制
- man 7 unix ↪ unix_family_ops id - 用于本地 IPC 的套接字
- man 7 ip ↪ inet_family_ops id - IPv4
- man 7 netlink ↪ netlink_family_ops id - 内核和用户空间之间的通信
- man 7 vsock ↪ vsock_family_ops id - VM 和虚拟机管理程序之间的通信
- man 7 packet ↪ packet_family_ops id - 设备级接口
- bt_sock_family_ops id - 蓝牙
总共有超过 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 id,proto_ops id 和 proto id
- 在 af_unix_init id 初始化调用中
📚 参考
RDMA
[edit | edit source]🚀 高级主题
🗝️ 首字母缩略词
- 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 源码 — 硬件设备驱动程序
📚 参考
🚀 高级主题
⚲ 接口
- 手册 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
⚙️ 内部
📚 参考
- 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 网络栈中的排队
💾 历史
- netif_rx id - 在 NAPI 之前
- 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()
- net_rx_actionid
- net_dev_initid
- 👁 示例
- e1000_intr id 调用 __napi_schedule id
- 自定义 napi->poll() e1000e_poll id 调用 napi_complete_done id
- ⚲ API
- ether_setup id 设置以太网网络设备
- 👁 以太网驱动程序示例:e1000_probe id
⚙️ 内部
📚 参考
- 手册 8 ethtool – 查询或控制网络驱动程序和硬件设置
- 数据链路层: 以太网
- GRO - 通用接收卸载
- 分段卸载 文档
- https://wireless.wiki.kernel.org
💾 历史
📖 有关网络的进一步阅读
- 网络接口 文档
- https://lwn.net/Kernel/Index/#Networking
- https://lartc.org/ – Linux 高级路由和流量控制
- 手册 8 ip – 显示/操作路由、网络设备、接口和隧道
- 手册 8 tc – 显示/操作流量控制设置
- bcc/ebpf 网络工具
- 基于 eBPF 的网络、安全和可观察性
- Retis – 在 Linux 网络栈及其朋友中跟踪数据包