網路功能
外觀
< 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 showls -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 網路棧及其朋友中跟蹤資料包