第1章 绪论 1
3 Z2 P" ^) A R v, k2 _( k) A1.1 Linux网络栈 2
! h% M' m. o& G! D) Q1.2 网络设备 4, [( p: P" h ?8 \" {4 n* ^
1.2.1 网络设备中的NAPI 59 }' G6 }5 Y* _' g3 B
1.2.2 数据包的收发 5; d8 y3 X l1 Y( A. P; b
1.2.3 套接字缓冲区 78 t, r" w$ p# K- Y' u: Z2 O
1.3 Linux内核网络开发模型 10
) J2 j n& S6 [+ c6 ^, z1.4 总结 12 ~& s0 a( u9 l7 L% Y( g9 M
第2章 Netlink套接字 13: t8 L6 l2 I' T* K n4 v1 X1 {- g
2.1 Netlink簇 13
, P2 _. `# n$ M' Y" q2.1.1 Netlink套接字库 15, n3 S: E J% q7 B7 L. r
2.1.2 结构sockaddr_nl 15( _4 g4 Q% t' D$ C }; {# _
2.1.3 用于控制TCP/IP联网的用户
# J0 p+ h+ Y5 Q# K! N, K空间包 15
@+ P9 C' d2 d+ M9 O2.1.4 内核Netlink套接字 16; w" j7 | g: `
2.1.5 Netlink消息报头 20
# h8 k; `/ Q7 l" k2 G/ }" F2.1.6 NETLINK_ROUTE消息 227 k: h/ J# U. Q% T9 i* [
2.1.7 在路由选择表中添加和删除
# ?1 }6 G3 B6 Q) G路由选择条目 24, F7 J4 Q6 a& k8 i3 u5 A
2.2 通用Netlink协议 25! S+ N: l8 a, B- v/ p& _4 x: I
2.2.1 创建和发送通用Netlink消息 29
& h& x7 Y s4 n4 m# {2 |2.2.2 套接字监视接口 31
4 Q, }9 k* h1 C# N0 x) B. T3 V2.3 总结 32
5 _2 J3 g! m0 G H2 n$ @5 v2.4 快速参考 32& t7 u1 T4 U+ S1 C
第3章 Internet控制消息协议(ICMP) 36
& C& V9 n `, Z* @" q3 c3.1 ICMPv4 36
5 N6 C' [( o2 s( |3 V9 F3.1.1 ICMPv4的初始化 37
) n2 u6 v2 H* O' W9 Q& L3.1.2 ICMPv4报头 38
6 S5 C8 g7 r8 Z8 M3.1.3 接收ICMPv4消息 42
+ c+ A# ~/ @. I3 K! n! ]3.1.4 发送ICMPv4消息:目的地
8 j; `5 ` `& M K/ R4 q不可达 43
2 k j4 s% r4 A3 ^6 W3.2 ICMPv6 471 N# L5 U( s& o9 ]" W/ y
3.2.1 ICMPv6初始化 47
- L. N4 d' }+ ?6 u+ R$ o9 N3.2.2 ICMPv6报头 48
1 ]0 o2 y7 _+ e- j6 l3.2.3 接收ICMPv6消息 49
) W2 J. L7 Q( f2 |$ i; N+ F: _3.2.4 发送ICMPv6消息 52
+ C0 ~* y: G: \" t- S3.3 ICMP套接字(ping套接字) 553 [) m' W/ G9 H, Z& ^" t% {
3.4 总结 56. w+ d7 D8 m9 l" [% s
3.5 快速参考 56/ K0 T' ~' Z+ ^/ s% s9 F$ O
3.5.1 方法 56( u+ j, V4 G5 V+ D
3.5.2 表格 572 N, R- |9 m3 Z, B6 d3 G' {. O
3.5.3 procfs条目 58
9 L% c. i6 j$ q, W* ?3.5.4 使用iptables创建“目的地6 J) J9 Z6 G7 R. _
不可达”消息 59
, G; M/ r" I8 ?/ b# f/ O第4章 IPv4 61
+ Z: k5 e0 i+ r4.1 IPv4报头 62
& } d& G+ {0 M5 P4.2 IPv4的初始化 63
' A. ]1 L4 ~+ |! F B4.3 接收IPv4数据包 64
0 N7 t: X. T) k# s# o, @4.4 接收IPv4组播数据包 67
4 M; b/ o: e3 z9 [# f0 r( F# P4.5 IP选项 69
( z3 S) A) ]$ y, h' S0 C) u4.5.1 时间戳选项 71" }4 c9 f, y1 G7 M
4.5.2 记录路由选项 74
- H. S; M; ~' i9 P* Z% ^8 `8 u0 W4.5.3 IP选项和分段 82
( `' K% n7 ~) K2 N# s% L# c( @4.5.4 创建IP选项 847 h7 L5 q a, c8 \- ~4 D: F" ^
4.6 发送IPv4数据包 85
, l3 T* Z, @6 f% }' R9 A! l4.7 分段 89
+ l( X5 y% V3 H8 u) ?4.7.1 快速路径 90
3 R; s u ?- V' ~' {4.7.2 慢速路径 93
; s/ L' ?4 P8 U- R. I" M) Y5 f4.8 重组 94
: i' T. Q. H% s1 F$ [* z9 C4.9 转发 99
) B/ G7 P& m0 h4.10 总结 101
' H0 c0 c; Z3 m" ^, a# ?4.11 快速参考 1015 d& \- L0 J5 x! D" u/ e
4.11.1 方法 102
/ K W& L& `- G) Y9 N- q1 y4.11.2 宏 1045 Z$ P8 s) o/ ^& v5 h9 r
第5章 IPv4路由选择子系统 105
0 }; K, d: L8 l8 X3 x5.1 转发和FIB 1058 i( N d3 r; j( n
5.2 在路由选择子系统中进行查找 107
+ r4 V1 G- B) H. n5.3 FIB表 110
& F, h% p4 k+ e# H1 a: K3 D5.3.1 FIB信息 110
0 C9 U/ R3 s4 c2 ^( z5.3.2 缓存 115
% B: H. F9 s0 v1 @, k5.3.3 下一跳 115) f% s; }6 x0 N% }# T
5.3.4 策略路由选择 117$ I. \& _4 Q$ A7 U
5.3.5 FIB别名 118
, R8 q D5 k+ v; e2 s5.4 ICMPv4重定向消息 121
! w8 C+ [# A4 T5 N+ |: ^$ H4 ]5.4.1 生成ICMPv4重定向消息 122
) X+ T, C+ q6 \# k u8 N; p5.4.2 接收ICMPv4重定向消息 123* q8 r s. b% O B
5.4.3 IPv4路由选择缓存 125$ j, o% d8 k. C* s5 N
5.5 总结 126% h3 I# U! K" Z( t& _* p
5.6 快速参考 126* P/ E, [7 v, F# E7 s# g
5.6.1 方法 1276 S6 C9 ]( F# f& p
5.6.2 宏 128
' x& o3 { a4 U( S4 V! D5.6.3 表 128, Q9 f( i: u1 l0 J+ \
5.6.4 路由标志 129& W3 m/ o- t! _9 G" n4 k- C
第6章 高级路由选择 131
& D; b& X& L" T0 j7 J5 N6.1 组播路由选择 131* \9 s( m& {: [3 @! x3 G
6.1.1 IGMP 132
1 l0 K3 Q( L2 j6.1.2 组播路由选择表 133
$ U* i- ]& g3 m6.1.3 组播转发缓存(MFC) 134
m" b: K6 z2 U- a6.1.4 组播路由器 136# ?2 R. I- e# f; r j0 _
6.1.5 vif设备 137
: |1 p5 J- Q0 Z9 G6.1.6 IPv4组播接收路径 138: D/ R7 d$ q2 a& H
6.1.7 方法ip_mr_forward() 141
8 R$ j6 N9 n5 a6.1.8 方法ipmr_queue_xmit() 143
% f" z6 B- ]# F- K* k8 z6.1.9 方法ipmr_forward_finish() 145
{, ^" S w3 J& c* m, e6.1.10 组播流量中的TTL 146* Y& V- B: y& z& g' O! }; Y
6.2 策略路由选择 146
0 ?$ W& H( k: ~; [+ r6 z6.2.1 策略路由选择的管理 147. V* k3 m f- X# t9 e- ?2 Y7 |" l" ^
6.2.2 策略路由选择的实现 147
$ U: S8 t8 _2 {( Y+ P% w6.3 多路径路由选择 148( N6 c4 F3 v' C/ V
6.4 总结 149# F/ f) t1 ^# p0 n% x- Y4 P
6.5 快速参考 149
/ h" \; a0 P' h5 h$ |0 w( H0 b7 T6.5.1 方法 149
4 z& f/ q3 M' h8 a! w9 l6.5.2 宏 151+ L4 y8 Q( l' q4 i$ k
6.5.3 procfs组播条目 1529 P- M3 I5 S8 [( O0 t4 w
6.5.4 表 152
9 Q% a [5 t8 Z' a: a$ f! s第7章 Linux邻接子系统 153
/ J. Z6 \* L" L- \7.1 邻接子系统的核心 153: M6 c- A6 |2 ~' m2 S5 B; l! Y
7.1.1 创建和释放邻居 160
! B8 @! f3 F1 l4 N7.1.2 用户空间和邻接子系统之间
0 Y4 O# ~% m: N- d2 R5 e5 b, H的交互 161
1 f" w9 v6 A8 f* u7.1.3 处理网络事件 163, R/ t% c$ r E3 s7 E2 H; V7 L+ K# q
7.2 ARP协议(IPv4) 163. r+ s1 S2 ~ V3 e& D
7.2.1 ARP:发送请求 1657 s0 r" U4 d/ X
7.2.2 ARP:接收请求和应答 168( z& [; X% N8 b& X/ L4 v4 h) M& n
7.3 NDISC协议(IPv6) 1749 @' Y# T _7 C* R9 [5 c: C/ `+ g ~% c
7.3.1 重复地址检测(DAD) 174( e8 P; ?( ?+ ]* p" m- `
7.3.2 NIDSC:发送请求 176
* i) q# ?0 s6 R7.3.3 NDISC:接收邻居请求和/ Y4 I9 g! s- G1 }
通告 1791 I$ b( B5 I9 Y. r8 ~# m+ M6 c. T
7.4 总结 185( F" d- ^0 J+ J) m' s
7.5 快速参考 186) {' U9 D1 [+ [+ q' T5 \% A4 n
7.5.1 方法 186
* G, B3 V1 G, g8 L7.5.2 宏 189- ~# h+ {* k0 @" y; v
7.5.3 结构neigh_statistics 190
0 J8 @( E! [, j" u7.5.4 表 1910 j/ E" T5 m1 P% l" m
第8章 IPv6 1921 i& G- J" O/ u* F, B6 `
8.1 IPv6简介 192
Y" _, b3 h$ s$ C9 k8.2 IPv6地址 193' B6 _# n# v/ \. C) ~+ j
8.2.1 特殊地址 193$ D, E7 T8 x4 C X, u
8.2.2 组播地址 194& \0 F$ T# q O0 v3 }- E; n
8.3 IPv6报头 195' Y: G- e5 K" Y `) T# n4 |' c8 h
8.4 扩展报头 197
, _, ~. R9 O" u$ n8.5 IPv6初始化 199. s/ C2 s# |0 E( Y7 `0 F0 J3 l. @3 c
8.6 自动配置 2006 v& L; _+ o1 \8 y8 g9 S, o9 F% K* ], C
8.7 接收IPv6数据包 2018 z, W# M; _. h C1 m
8.7.1 本地投递 204 Z, k3 U3 S. J4 S
8.7.2 转发 206+ F+ I0 K* Y7 i6 s
8.8 接收IPv6组播流量 2100 A! n% L6 d1 q
8.9 组播侦听者发现(MLD) 211
; v. e/ Q! {! L7 z& B$ r7 x8.9.1 加入和退出组播组 212* a6 u- E# ?1 j5 q' P; V0 i& P+ j% V
8.9.2 MLDv2组播侦听者报告 2156 C1 b7 c6 d& w9 R, `$ q
8.9.3 组播源过滤 215$ d' u% {8 Y. W& L
8.10 发送IPv6数据包 220
Y7 L$ t. A0 z8.11 IPv6路由选择 221' F% L, m) v& ~
8.12 总结 221
! a% Y0 ]6 k, `: U+ K1 d8.13 快速参考 221
1 H# c9 @9 O$ l5 K2 h/ |! h8.13.1 方法 221. \0 s7 H# E$ J7 R0 S
8.13.2 宏 2242 K( J7 q) y( q) ?3 X; M9 u4 E7 W
8.13.3 表 224
3 D/ g4 E+ o/ E: `% n. J8.13.4 特殊地址 225; g/ o1 I. O) p& o) X# z3 a
8.13.5 IPv6路由选择表的管理 226* q( s& [. g$ A1 l3 I
第9章 Netfilter 227/ u9 q) I f* c/ V+ C
9.1 Netfilter框架 227
/ ?0 R% S# j# v, p9.2 Netfilter挂接点 228$ j. q- R7 P' f, W* I7 K/ H
注册Netfilter钩子回调函数 229
X5 i5 X: r7 z6 q- z9.3 连接跟踪 230' T' C( s8 L/ O0 n) U& u% t; R
9.3.1 连接跟踪的初始化 231, b. s6 m8 n: ?/ k4 K
9.3.2 连接跟踪条目 234% t9 C% ^; P3 ^, \9 H1 k
9.3.3 连接跟踪辅助方法和期望
+ K0 d: ^- n8 }7 T- C0 k y* }连接 238
" D6 r9 K) u0 Y+ `' l9.3.4 iptables 2412 g3 f( g/ U8 r) @% {
9.3.5 投递到当前主机 2437 f+ a4 L2 R$ S
9.3.6 转发数据包 245$ Q6 H! r5 a. a7 m1 w) F; H5 k
9.3.7 网络地址转换(NAT) 245
+ c( c- D, ^. O! o( h: d9.3.8 NAT钩子回调函数和连接
7 F) V: u0 k! k! k+ s% G i/ G: s跟踪钩子回调函数 247( _; K) C4 r3 M& O- Z
9.3.9 NAT钩子回调函数 250
2 Q: F( q6 R6 k9.3.10 连接跟踪扩展 2523 z& x! ~- N# H. m: R
9.4 总结 2531 e8 G, ^5 w8 t+ `& M
9.5 快速参考 253
3 g. \+ G2 P* l9.5.1 方法 253# ^, N5 D" x7 O+ w: Q
9.5.2 宏 255
2 V: w' y) b/ T$ c9.5.3 表 255
6 u$ U( G! ~) P3 S0 d6 \5 J/ p9.5.4 工具和库 256
0 G; _& s; R7 b( k$ B4 \第10章 IPsec 257; |) z4 o) N1 d. O
10.1 概述 257
5 r6 E. c4 N: ^) S) I10.2 Internet密钥交换(IKE) 257# G2 G3 Z2 L( Y. h' e, @) Q
10.3 IPsec和加密 2598 g6 c! m7 H# l1 {/ g- S9 [' z9 _
10.4 XFRM框架 259
" M- Q! o2 Y& Z0 {( Y; v10.4.1 XFRM的初始化 260
& N4 O0 D0 c! M7 N+ |" k$ I$ r10.4.2 XFRM策略 260
9 }+ n" X5 z9 c6 F) o10.4.3 XFRM状态(安全关联) 2632 e# R( h* j4 S
10.5 IPv4 ESP的实现 266: b- s! j, a* r2 h
10.6 接收IPsec数据包(传输模式) 268- E& {0 x; C6 l0 z/ h
10.7 发送IPsec数据包(传输模式) 2719 |8 @' l* u" r8 \6 @% ^' i
10.8 XFRM查找 2720 G% R0 y6 j9 F9 ~5 W* W
10.9 IPsec的NAT穿越功能 275
/ ]; d9 y. n+ N5 @; y10.10 总结 276, y8 m% V3 n% x5 W
10.11 快速参考 276
' ~2 m" c$ f$ x; }$ b10.11.1 方法 276# r& a: f$ T) A! y' I+ V
10.11.2 表 278: r# ]" `1 V- H0 R# n. U! Z2 W9 k
第11章 第4层协议 280
' C0 h$ H* ~& J' n11.1 套接字 280
D4 @& `: y' m# |11.2 创建套接字 281" z0 \! y. k8 H6 i1 ^2 i
11.3 用户数据包协议(UDP) 2854 `" P' ]/ j* K+ j: q: ]
11.3.1 UDP的初始化 2864 h* c- G7 [2 v! U, a7 k7 K2 I' Q. v- `
11.3.2 发送UDP数据包 287
% r- U+ r) _* Z. f11.3.3 接收来自网络层(L3)的' i0 a: F3 E. M: y4 |+ @5 j7 p
UDP数据包 290
7 Z2 f3 x# _' Z. l! i% F @) d, [11.4 传输控制协议(TCP) 293! b7 ^" Z! V$ R
11.4.1 TCP报头 293
! r/ Y$ s7 E& O1 r; F11.4.2 TCP的初始化 295& f3 p, b* k% A+ }8 @! f8 O4 V3 A
11.4.3 TCP定时器 296! W$ |6 ~7 h: ]7 f+ N w4 X
11.4.4 TCP套接字的初始化 297
$ {1 F6 m2 q1 N0 _ g; D! z11.4.5 TCP连接的建立 297
( [6 `/ W/ \6 ]! _11.4.6 接收来自网络层(L3)的2 F E3 v: ^5 U5 J( p! ]# A0 u
TCP数据包 298
; y2 @; T1 p/ C9 M1 i& Y11.4.7 发送TCP数据包 299" i0 V$ O; P" z+ j' A6 I
11.5 流控制传输协议(SCTP) 300, h7 o9 v, M4 R/ ~% J: p+ K% Y
11.5.1 SCTP数据包和数据块 301) v; Y$ H6 K" C5 F
11.5.2 SCTP块头 302
2 ]; F, r! b& X3 m2 s3 U, T& p11.5.3 SCTP块 302 java8.com+ a- v F% K9 K0 W1 `" W1 z2 t
11.5.4 SCTP关联 303
( g2 w6 e; |. w$ C8 F" a; W11.5.5 建立SCTP关联 305
: S) r1 [3 H1 ~$ G( L& B11.5.6 接收SCTP数据包 305( h- ^: I0 ^# @. L
11.5.7 发送SCTP数据包 306
1 x; `. M1 c9 n0 X5 M11.5.8 SCTP心跳 306$ n: U& _7 I) h& x! P
11.5.9 SCTP多流 306
- u7 x: Y( {7 g1 g11.5.10 SCTP多宿主 307
4 E, G" ^0 Y4 X ]- ]- @; i5 W* Z11.6 数据报拥塞控制协议(DCCP) 307
) ^1 `3 ]7 [* n$ |+ _! U* A! l11.6.1 DCCP报头 307
" x5 i, Q/ x5 `. {+ j" U- S11.6.2 DCCP的初始化 3
; i7 i6 z' r8 I; N! t! v. _