跳轉到內容

網路功能

來自華夏公益教科書


網路
套接字訪問
地址族: 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 網路棧及其朋友中跟蹤資料包
華夏公益教科書