Linux 網絡硬核系列:TCP/IP 協議棧
今天給大家介紹Linux網絡技術中最核心的部分--TCP/IP協議棧 。
我們先看一下抽象的網絡協議棧模型
TCP/IP四層(參考)模型
再按分層思想看Linux內核協議棧實現框架
自頂向下
Socket/ L4 TCP layer
1. socket layer
socket對象層次結構
socket框架
- socket系統調用(socket,bind,listen,accept,send,recv等)
- BSD socket API
- 協議棧sock抽象適配層
- tcp/udp/icmp/raw/packet/netlink/... socket管理
- socket選項
2. tcp/udp layer
- TCP報文收發
- TCP Socket連接管理
- TCP協議狀態機,定時器處理
- TCP滑動窗口,擁塞控制框架
L3 IP layer
1. IP handle
- 報文分片和重組
- IP協議字段處理,IP選項,Qos,TTL,校驗等處理
- 報文接收(解封裝)和發送(IP協議封裝,提供給上層接口)
- 組播,ICMP協議處理等
2. netlfilter框架
5個HOOK點:
PREROUTING:數據包進入路由表之前
INPUT:通過路由表后目的地為本機
FORWARD:通過路由表后,目的地不為本機
OUTPUT:由本機產生,向外發送
POSTROUTIONG:發送到網卡接口之前。
每個HOOK點都會執行一些函數,大致分為下面幾個表:
NAT表: 用于實現nat功能,端口映射,地址映射等
mangle表: 用來修改報文,例如更改IP標頭的TOS / DSCP / ECN位
filter表:用來過濾報文
raw表:用來提前標記報文不走一些流程(比如不需要建會話)
conntrack表:連接跟蹤表,跟蹤連接會話,用來實現狀態防火墻,NAT功能的基礎,可擴展更多功能。
核心處理流程
主要功能
- 無狀態數據包過濾(IPv4和IPv6)
- 有狀態的數據包過濾(IPv4和IPv6)
- 各種網絡地址和端口轉換,例如NAT / NAPT(IPv4和IPv6)
- 靈活可擴展的基礎架構
- 第三方擴展的API
3. 路由系統
協議棧處理位置
路由子系統架構
- FIB(The Forwarding Information Base )
- 策略路由 Policies
- 路由匹配HASH,LC-tries等
主要功能
三層路由轉發
4. 鄰居系統
- ARP協議(IPV4),NDP協議(IPV6)
- 鄰居表新建,更新,老化機制,狀態轉化等
- API接口
主要功能
- 獲取mac地址
L2 link layer(driver)
1. Link layer
Bridge
- FDB(macforwarding database)管理
- port,bridge對象管理和報文接收,轉發
- STP,vlan協議相關處理
主要功能
- 實現二層mac轉發
鏈路協議
- IEEE 802協議族(STP,VLAN,以太網,無線wifi,令牌環等)
Packt Type
- Protocol handler
- Packet_type list
主要功能
- 鏈路層報文協議分發
Traffic control
- qdisc :通過隊列將數據包緩存起來,用來控制網絡收發的速度
- class :用來表示控制策略
- filter :用來將數據包劃分到具體的控制策略
主要功能
- 提供的流量限速、整形和策略控制機制(Qos)
2. hardware driver layer
- 網絡設備管理
- RPS,RFS,XPS,GRO,GSO,TSO等優化特性
- 網卡軟中斷收發,NAPI,DMA
- 支持各種網卡驅動實現
協議棧文件系統
Proc FileSystem
- /proc/net
- /proc/sys/net
ipv4
core
Sys FileSystem
- /sys/class/net/ethx
主要功能
- 提供協議棧相關配置查詢和設置
最后
整體架構圖