上 冊 目 錄
前言
第1章 預備知識 1
1.1 應用層配置診斷工具 2
1.1.1 iputils 2
1.1.2 net-tools 2
1.1.3 iproute2 2
1.2 內核空間與用戶空間的接口 2
1.2.1 procfs 2
1.2.2 sysctl(/proc/sys目錄) 4
1.2.3 sysfs(/sys文件係統) 5
1.2.4 ioctl係統調用 6
1.2.5 netlink套接口 6
1.3 網絡I/O加速 6
1.3.1 TSO/GSO 7
1.3.2 I/O AT 8
1.4 其他 8
1.4.1 slab分配器 9
1.4.2 RCU 9
第2章 網絡體係結構概述 10
2.1 引言 10
2.2 協議簡介 10
2.3 網絡架構 11
2.4 係統調用接口 11
2.5 協議無關接口 12
2.6 傳輸層協議 12
2.7 套接口緩存 13
2.8 設備無關接口 14
2.9 設備驅動程序 14
2.10 網絡模塊源代碼組織 14
第3章 套接口緩存 15
3.1 引言 15
3.2 sk_buff結構 15
3.2.1 網絡參數和內核數據結構 16
3.2.2 SKB組織相關的變量 19
3.2.3 數據存儲相關的變量 20
3.2.4 通用的成員變量 21
3.2.5 標誌性變量 24
3.2.6 特性相關的成員變量 25
3.3 skb_shared_info結構 25
3.3.1 "零拷貝"技術 25
3.3.2 對聚閤分散I/O數據的支持 27
3.3.3 對GSO的支持 30
3.3.4 訪問skb_shared_info結構 31
3.4 管理函數 31
3.4.1 SKB的緩存池 31
3.4.2 分配SKB 32
3.4.3 釋放SKB 34
3.4.4 數據預留和對齊 36
3.4.5 剋隆和復製SKB 38
3.4.6 鏈錶管理函數 42
3.4.7 添加或刪除尾部數據 42
3.4.8 拆分數據:skb_split() 44
3.4.9 重新分配SKB的綫性數據區:
pskb_expand_head() 46
3.4.10 其他函數 46
第4章 網絡模塊初始化 48
4.1 引言 48
4.2 網絡模塊初始化順序 48
4.3 優化基於宏的標記 49
4.4 網絡設備處理層初始化 52
第5章 網絡設備 55
5.1 PCI設備 55
5.1.1 PCI驅動程序相關結構 55
5.1.2 注冊PCI驅動程序 57
5.2 與網絡設備有關的數據結構 59
5.2.1 net_device結構 59
5.2.2 網絡設備有關結構的組織 71
5.2.3 相關函數 72
5.3 網絡設備的注冊 73
5.3.1 設備注冊的時機 73
5.3.2 分配net_device結構空間 73
5.3.3 網絡設備注冊過程 75
5.3.4 注冊設備的狀態遷移 79
5.3.5 設備注冊狀態通知 79
5.3.6 引用計數 80
5.4 網絡設備的注銷 80
5.4.1 設備注銷的時機 80
5.4.2 網絡設備注銷過程 81
5.5 網絡設備的啓用 86
5.6 網絡設備的禁用 88
5.7 與電源管理交互 89
5.7.1 掛起設備 90
5.7.2 喚醒設備 90
5.8 偵測連接狀態改變 91
5.8.1 調度處理連接狀態改變事件 91
5.8.2 linkwatch標誌 95
5.9 從用戶空間配置設備相關
信息 95
5.9.1 ethtool 95
5.9.2 媒體獨立接口 97
5.10 虛擬網絡設備 97
第6章 IP編址 99
6.1 接口和IP地址 99
6.1.1 主IP地址、從屬IP地址和
IP彆名 99
6.1.2 IP地址的組織 99
6.1.3 in_device結構 100
6.1.4 in_ifaddr結構 101
6.2 函數 102
6.2.1 inetdev_init() 102
6.2.2 inetdev_destroy() 104
6.2.3 inet_select_addr() 104
6.2.4 inet_confirm_addr() 106
6.2.5 inet_addr_onlink() 107
6.2.6 inetdev_by_index() 107
6.2.7 inet_ifa_byprefix() 108
6.2.8 inet_abc_len() 108
6.3 IP地址的設置 109
6.3.1 netlink接口 109
6.3.2 inet_insert_ifa() 111
6.3.3 inet_del_ifa() 112
6.4 ioctl 115
6.5 inetaddr_chain通知鏈 121
第7章 接口層的輸入 122
7.1 係統參數 122
7.2 接口層的ioctl 123
7.2.1 SIOCxIFxxx類命令 123
7.2.2 SIOCETHTOOL 126
7.2.3 私有命令 127
7.3 初始化 127
7.4 softnet_data結構 128
7.5 NAPI方式 130
7.5.1 網絡設備中斷例程 131
7.5.2 網絡輸入軟中斷 131
7.5.3 輪詢處理 133
7.6 非NAPI方式 134
7.7 接口層輸入報文的處理 137
7.7.1 報文接收例程 137
7.7.2 netif_receive_skb() 138
7.7.3 dev_queue_xmit_nit() 141
7.8 響應CPU狀態的變化 142
7.9 netpoll 143
7.9.1 netpoll相關結構 143
7.9.2 注冊netpoll實例 145
7.9.3 netpoll的輸入 148
7.9.4 netpoll的輸齣 156
7.9.5 tx_work工作隊列 159
7.9.6 netpoll實例:netconsole 160
第8章 接口層的輸齣 163
8.1 輸齣接口 163
8.1.1 dev_queue_xmit() 163
8.1.2 dev_hard_start_xmit() 167
8.1.3 e100的輸齣接口:
e100_xmit_frame() 168
8.2 網絡輸齣軟中斷 168
8.2.1 netif_schedule() 168
8.2.2 net_tx_action() 169
8.3 網絡設備不支持GSO時的
處理 170
8.3.1 dev_gso_cb私有控製塊 171
8.3.2 dev_gso_segment() 171
8.3.3 skb_gso_segment() 172
第9章 流量控製 174
9.1 通過流量控製後輸齣 174
9.1.1 dev_queue_xmit() 175
9.1.2 qdisc_restart() 176
9.2 構成流量控製的三種元素 178
9.2.1 排隊規則 179
9.2.2 類 186
9.2.3 過濾器 189
9.3 默認的FIFO排隊規則 192
9.3.1 pfifo_fast_init() 194
9.3.2 pfifo_fast_reset() 194
9.3.3 pfifo_fast_enqueue() 194
9.3.4 pfifo_fast_dequeue() 195
9.3.5 pfifo_fast_requeue() 195
9.4 netlink的tc接口 195
9.5 排隊規則的創建接口 197
9.5.1 類的創建接口 201
9.5.2 過濾器的創建接口 204
第10章 Internet協議族 209
10.1 net_proto_family結構 209
10.2 inet_protosw結構 210
10.3 net_protocol結構 212
10.4 Internet協議族的初始化 214
第11章 IP:網際協議 217
11.1 引言 217
11.1.1 IP首部 218
11.1.2 IP數據報的輸入與輸齣 219
11.2 IP的私有信息控製塊 220
11.3 係統參數 220
11.4 初始化 223
11.5 IP層套接口選項 223
11.6 ipv4_devconf結構 227
11.7 套接口的錯誤隊列 229
11.7.1 添加ICMP差錯信息 231
11.7.2 添加由本地産生的差錯信息 232
11.7.3 讀取錯誤信息 233
11.8 報文控製信息 235
11.8.1 IP控製信息塊 235
11.8.2 報文控製信息的輸齣 235
11.8.3 報文控製信息的輸入 236
11.9 對端信息塊 237
11.9.1 係統參數 239
11.9.2 對端信息塊的創建和查找 239
11.9.3 對端信息塊的刪除 241
11.9.4 垃圾迴收 242
11.10 IP數據報的輸入處理 244
11.10.1 IP數據報輸入到本地 247
11.10.2 IP數據報的轉發 249
11.11 IP數據報的輸齣處理 253
11.11.1 IP數據報輸齣到設備 253
11.11.2 TCP輸齣的接口 255
11.11.3 UDP輸齣的接口 261
11.12 IP層對GSO的支持 275
11.12.1 inet_gso_segment() 275
11.12.2 inet_gso_send_check() 277
第12章 IP選項處理 278
12.1 IP選項 278
12.1.1 選項列錶的結束符 279
12.1.2 空操作 279
12.1.3 安全選項 279
12.1.4 嚴格源路由選項 280
12.1.5 寬鬆源路由選項 281
12.1.6 記錄路由選項 282
12.1.7 流標識選項 282
12.1.8 時間戳選項 283
12.1.9 路由器警告選項 283
12.2 ip_options結構 284
12.3 在IP數據報中構建IP選項 285
12.4 復製IP數據報中選項到指
定的ip_options結構 286
12.5 處理待發送IP分片中的
選項 290
12.6 解析IP選項 291
12.7 還原在校驗IP選項時修改的
IP選項 297
12.8 處理轉發IP數據報中的IP
選項 298
12.9 處理IP數據報的源路由
選項 299
12.10 解析並處理IP首部中的IP
選項 300
12.11 路由警告選項的處理 301
12.12 由控製信息生成IP選項
信息塊 302
第13章 IP的分片與組裝 303
13.1 係統參數 303
13.2 分片 303
13.2.1 快速分片 306
13.2.2 慢速分片 309
13.3 組裝 312
13.3.1 ipq結構 312
13.3.2 ipq散列錶和鏈錶的維護 315
13.3.3 ipq散列錶的重組 316
13.3.4 超時IP分片的清除 317
13.3.5 垃圾收集 318
13.3.6 相關分片組裝函數 319
13.3.7 分片組裝 327
第14章 ICMP:Internet控製
報文協議 330
14.1 ICMP報文結構 330
14.2 注冊ICMP報文類型 330
14.3 係統參數 330
14.4 ICMP的初始化 332
14.5 輸入處理 333
14.5.1 差錯處理 337
14.5.2 重定嚮處理 342
14.5.3 請求迴顯 343
14.5.4 時間戳請求 345
14.5.5 地址掩碼請求和應答 346
14.6 輸齣處理 346
14.6.1 發送ICMP報文 346
14.6.2 發送迴顯應答和時間戳
應答報文 350
第15章 IP組播 353
15.1 初始化 353
15.2 虛擬接口 354
15.2.1 虛擬接口的添加 355
15.2.2 虛擬接口的刪除:
vif_delete() 358
15.2.3 查找虛擬接口:ipmr_find_vif() 358
15.3 組播轉發緩存 358
15.3.1 組播轉發緩存的創建 361
15.3.2 組播轉發緩存的刪除 361
15.3.3 組播轉發緩存的查找 361
15.3.4 嚮組播路由守護進程發送
報告 362
15.4 臨時組播轉發緩存 364
15.4.1 臨時組播轉發緩存隊列 365
15.4.2 創建臨時組播轉發緩存 365
15.4.3 用於超時而刪除臨時組播
轉發緩存的定時器 367
15.4.4 釋放臨時組播緩存項中保存的
臨時組播報文 368
15.5 外部事件 369
15.6 組播套接口選項 369
15.6.1 IP_MULTICAST_TTL 369
15.6.2 IP_MULTICAST_LOOP 370
15.6.3 IP_MULTICAST_IF 370
15.6.4 IP_ADD_MEMBERSHIP 372
15.6.5 IP_DROP_MEMBERSHIP 372
15.6.6 IP_MSFILTER 373
15.6.7 IP_BLOCK_SOURCE和
IP_UNBLOCK_SOURCE 375
15.6.8 IP_ADD_SOURCE_MEMBERSHIP
和IP_DROP_SOURCE_
MEMBERSHIP 375
15.6.9 MCAST_JOIN_GROUP 376
15.6.10 MCAST_LEAVE_GROUP 377
15.6.11 MCAST_BLOCK_SOURCE和
MCAST_UNBLOCK_SOURCE 377
15.6.12 MCAST_JOIN_SOURCE_GROUP
和MCAST_LEAVE_SOURCE_
GROUP 377
15.6.13 MCAST_MSFILTER 378
15.7 組播選路套接口選項 378
15.7.1 MRT_INIT 379
15.7.2 MRT_DONE 379
15.7.3 MRT_ADD_VIF和MRT_
DEL_VIF 380
15.7.4 MRT_ADD_MFC和MRT_
DEL_MFC 380
15.7.5 MRT_ASSERT 380
15.8 組播的ioctl 380
15.8.1 SIOCGETVIFCNT 380
15.8.2 SIOCGETSGCNT 380
15.9 組播報文的輸入 381
15.10 組播報文的轉發 383
15.10.1 ip_mr_forward() 383
15.10.2 ipmr_queue_xmit() 385
15.11 組播報文的輸齣 388
第16章 IGMP:Internet組
管理協議 390
16.1 in_device結構中的組播參數 390
16.2 ip_mc_list結構 391
16.3 係統參數 393
16.4 IGMP的版本與協議結構 393
16.4.1 IGMP的版本 393
16.4.2 第一版和第二版的IGMP
報文結構 395
16.4.3 第三版的IGMP查詢報文結構 395
16.4.4 第三版的IGMP報告結構 396
16.5 IGMP報文的輸入 398
16.6 函數 399
16.6.1 ip_mc_find_dev() 399
16.6.2 ip_check_mc() 400
16.7 成員關係查詢 400
16.8 成員關係報告 404
16.8.1 最近離開組播組列錶的維護 404
16.8.2 is_in() 404
16.8.3 add_grec() 406
16.8.4 普通查詢的報告 409
16.8.5 V1和V2的報告以及V3的
當前狀態記錄報告 410
16.8.6 主動發送組關係報告 413
16.9 維護套接口組播狀態 416
16.9.1 套接口加入組播組 417
16.9.2 套接口離開組播組 418
16.10 維護網絡設備組播狀態 419
16.10.1 被阻止的組播源列錶的維護 421
16.10.2 網絡設備加入組播組 421
16.10.3 網絡設備離開組播組 425
16.11 ip_mc_source() 430
16.12 ip_mc_msfilter() 434
16.13 網絡設備組播硬件地址的
管理 436
第17章 鄰居子係統 437
17.1 什麼是鄰居子係統 437
17.2 係統參數 437
17.3 鄰居子係統的結構 438
17.3.1 neigh_table結構 438
17.3.2 neighbour結構 441
17.3.3 neigh_ops結構 444
17.3.4 neigh_parms結構 445
17.3.5 pneigh_entry結構 447
17.3.6 neigh_statistics結構 447
17.3.7 hh_cache結構 448
17.4 鄰居錶的初始化 449
17.5 鄰居項的狀態機 450
17.6 鄰居項的添加與刪除 452
17.6.1 netlink接口 452
17.6.2 ioctl 456
17.6.3 路由錶項與鄰居項的綁定 456
17.6.4 接收到的並非請求的應答 456
17.7 鄰居項的創建與初始化 456
17.7.1 neigh_alloc() 456
17.7.2 neigh_create() 457
17.8 鄰居項散列錶的擴容 459
17.9 鄰居項的查找 460
17.9.1 neigh_lookup() 460
17.9.2 neigh_lookup_nodev() 461
17.9.3 __neigh_lookup ()和
neigh_lookup_errno() 461
17.10 鄰居項的更新 461
17.11 垃圾迴收 465
17.11.1 同步迴收 465
17.11.2 異步迴收 466
17.12 外部事件 468
17.13 鄰居項狀態處理定時器 469
17.14 代理項 472
17.14.1 代理項的查找、添加和刪除 472
17.14.2 延時處理代理的請求報文 472
17.15 輸齣函數 474
17.15.1 丟棄 474
17.15.2 慢速發送 474
17.15.3 快速發送 477
第18章 ARP:地址解析協議 480
18.1 ARP報文格式 480
18.2 係統參數 481
18.3 注冊ARP報文類型 483
18.4 ARP初始化 483
18.5 ARP的鄰居項函數指針錶 483
18.6 ARP錶 484
18.7 函數 485
18.7.1 arp_error_report() 485
18.7.2 arp_solicit() 485
18.7.3 arp_ignore() 486
18.7.4 arp_filter() 488
18.8 IPv4中鄰居項的初始化 488
18.9 ARP報文的創建 490
18.10 ARP的輸齣 490
18.11 ARP的輸入 491
18.11.1 arp_rcv() 491
18.11.2 arp_process() 492
18.12 ARP代理 497
18.12.1 arp_process() 498
18.12.2 arp_fwd_proxy() 499
18.12.3 parp_redo() 500
18.13 ARP的ioctl 500
18.14 外部事件 501
18.15 路由錶項與鄰居項的綁定 502
第19章 路由錶 503
19.1 什麼是路由錶 503
19.1.1 路由的要素 503
19.1.2 特殊路由 505
19.1.3 路由緩存 505
19.2 係統參數 506
19.3 路由錶組成結構 506
19.3.1 fib_table結構 508
19.3.2 fn_zone結構 510
19.3.3 fib_node結構 511
19.3.4 fib_alias結構 511
19.3.5 fib_info結構 512
19.3.6 fib_nh結構 515
19.4 路由錶的初始化 516
19.5 netlink接口 517
19.5.1 netlink路由錶項消息結構 517
19.5.2 inet_rtm_newroute() 519
19.5.3 inet_rtm_delroute() 520
19.6 獲取指定的路由錶 520
19.7 路由錶項的添加 520
19.8 路由錶項的刪除 526
19.9 外部事件 528
19.9.1 網絡設備狀態變化事件 528
19.9.2 IP地址變化事件 529
19.9.3 fib_add_ifaddr() 529
19.9.4 fib_del_ifaddr() 531
19.9.5 fib_disable_ip() 534
19.9.6 fib_magic() 534
19.10 選路 535
19.10.1 輸入選路:
ip_route_input_slow() 535
19.10.2 組播輸入選路:
ip_route_input_mc() 539
19.10.3 輸齣選路:
ip_route_output_slow() 541
19.10.4 fib_lookup() 546
19.10.5 fn_hash_lookup() 548
19.11 ICMP重定嚮消息的發送 548
下 冊 目 錄
第20章 路由緩存 551
20.1 係統參數 551
20.2 路由緩存的組織結構 552
20.2.1 rtable結構 552
20.2.2 flowi結構 555
20.2.3 dst_entry結構 556
20.2.4 dst_ops結構 559
20.3 初始化 561
20.4 創建路由緩存項 563
20.4.1 創建輸入路由緩存項 563
20.4.2 創建輸齣路由緩存項 565
20.5 添加路由錶項到緩存中:
rt_intern_hash() 568
20.6 輸入路由緩存查詢:
ip_route_input() 571
20.7 輸齣路由緩存查詢 573
20.7.1 ip_route_output_key() 573
20.7.2 __ip_route_output_key() 573
20.8 垃圾迴收 575
20.8.1 路由緩存項的過期 575
20.8.2 判斷緩存路由錶項是否
可被刪除 575
20.8.3 同步清理 576
20.8.4 異步清理 580
20.8.5 路由緩存項的釋放 582
20.9 刷新緩存 582
20.9.1 通過定時器定時刷新 584
20.9.2 網絡設備的硬件地址發生
改變 584
20.9.3 網絡設備狀態發生變化 584
20.9.4 給設備添加或刪除一個
IP地址 584
20.9.5 全局轉發狀態或設備的轉發
狀態發生變化 584
20.9.6 一條路由被刪除 585
20.9.7 通過寫/proc的flush文件 585
20.10 ICMP重定嚮消息的處理 585
20.11 ICMP目的不可達,需要分片
消息的處理 588
第21章 路由策略 590
21.1 路由策略組織結構 590
21.1.1 fib_rules_ops結構 590
21.1.2 fib_rule結構 592
21.1.3 fib4_rule結構 594
21.2 三個默認路由策略 595
21.3 IPv4協議族的fib_rules_ops
結構實例 595
21.3.1 fib4_rule_action() 595
21.3.2 fib4_rule_match() 596
21.3.3 fib4_rule_configure() 596
21.3.4 fib4_rule_compare() 598
21.3.5 fib4_rule_fill() 598
21.3.6 fib4_rule_default_pref() 599
21.4 netlink接口 599
21.4.1 netlink路由策略消息結構 599
21.4.2 fib_nl_newrule() 600
21.4.3 fib_nl_delrule() 602
21.5 受網絡設備狀態改變的影響 604
21.6 策略路由的查找 604
第22章 套接口層 606
22.1 socket結構 607
22.2 proto_ops結構 608
22.3 套接口文件係統 610
22.3.1 套接口文件係統類型 610
22.3.2 套接口文件係統超級塊操作
接口 610
22.3.3 套接口文件的inode 611
22.3.4 sock_alloc_inode() 611
22.3.5 sock_destroy_inode() 612
22.4 套接口文件 612
22.4.1 套接口文件與套接口的綁定 612
22.4.2 根據文件描述符獲取套接口 614
22.5 進程、文件描述符和套接口 615
22.6 套接口層的係統初始化 616
22.7 套接口係統調用 617
22.7.1 套接口係統調用入口 617
22.7.2 socket係統調用 621
22.7.3 bind係統調用 629
22.7.4 listen係統調用 632
22.7.5 accept係統調用 633
22.7.6 connect係統調用 635
22.7.7 shutdown係統調用 636
22.7.8 close係統調用 638
22.7.9 select係統調用的實現 640
第23章 套接口I/O 641
23.1 輸齣/輸入數據的組織 641
23.1.1 msghdr結構 641
23.1.2 verify_iovec() 643
23.1.3 memcpy_toiovec() 644
23.1.4 memcpy_fromiovec() 644
23.1.5 memcpy_fromiovecend() 644
23.1.6 csum_partial_copy_
fromiovecend() 644
23.2 輸齣係統調用 644
23.2.1 sock_sendmsg() 644
23.2.2 sendto係統調用 645
23.2.3 send係統調用 646
23.2.4 sendmsg係統調用 646
23.3 輸入係統調用 649
第24章 套接口選項 650
24.1 setsockopt係統調用 650
24.2 ioctl係統調用 655
24.2.1 ioctl在文件係統內的調用過程 655
24.2.2 套接口文件ioctl調用接口的
實現 655
24.2.3 套接口層的實現 658
24.3 getsockname係統調用 659
24.4 getpeername係統調用 660
第25章 傳輸控製塊 661
25.1 係統參數 662
25.2 傳輸描述塊結構 662
25.2.1 sock_common結構 662
25.2.2 sock結構 663
25.2.3 inet_sock結構 670
25.3 proto結構 674
25.3.1 proto實例組織結構 677
25.3.2 proto_register() 677
25.3.3 proto_unregister() 679
25.4 傳輸控製塊的內存管理 680
25.4.1 傳輸控製塊的分配和釋放 680
25.4.2 普通的發送緩存區的分配 682
25.4.3 發送緩存的分配與釋放 685
25.4.4 接收緩存的分配與釋放 686
25.4.5 輔助緩存的分配與釋放 688
25.5 異步IO機製 688
25.5.1 sk_wake_async() 689
25.5.2 sock_def_wakeup() 690
25.5.3 sock_def_error_report() 690
25.5.4 sock_def_readable() 691
25.5.5 sock_def_write_space()和
sk_stream_write_space() 691
25.5.6 sk_send_sigurg() 692
25.5.7 接收到FIN段後通知進程 692
25.5.8 sock_fasync() 693
25.6 傳輸控製塊的同步鎖 694
25.6.1 socket_lock_t結構 694
25.6.2 控製用戶進程和下半部間
同步鎖 695
25.6.3 控製下半部間同步鎖 698
第26章 TCP:傳輸控製協議 699
26.1 係統參數 699
26.2 TCP的inet_protosw實例 705
26.3 TCP的net_protocol結構 705
26.4 TCP傳輸控製塊 706
26.4.1 inet_connection_sock結構 706
26.4.2 inet_connection_sock_af_ops
結構 710
26.4.3 tcp_sock結構 711
26.4.4 tcp_options_received結構 721
26.4.5 tcp_skb_cb結構 723
26.5 TCP的proto結構和proto_ops
結構的實例 725
26.6 TCP狀態遷移圖 725
26.7 TCP首部 726
26.8 TCP校驗和 727
26.8.1 輸入TCP段的校驗和檢測 728
26.8.2 輸齣TCP段校驗和的計算 729
26.9 TCP的初始化 729
26.10 TCP傳輸控製塊的管理 731
26.10.1 inet_hashinfo結構 732
26.10.2 管理除LISTEN狀態之外的
TCP傳輸控製塊 733
26.10.3 管理LISTEN狀態的
TCP傳輸控製塊 734
26.11 TCP層的套接口選項 735
26.12 TCP的ioctl 736
26.13 TCP傳輸控製塊的初始化 737
26.14 TCP的差錯處理 737
26.15 TCP傳輸控製塊層的緩存
管理 741
26.15.1 緩存管理的算法 741
26.15.2 發送緩存的管理 744
26.15.3 接收緩存的管理 745
第27章 TCP的定時器 746
27.1 初始化 746
27.2 連接建立定時器 747
27.2.1 連接建立定時器處理函數 747
27.2.2 連接建立定時器的激活 751
27.3 重傳定時器 751
27.3.1 重傳定時器處理函數 751
27.3.2 重傳定時器的激活 756
27.4 延遲確認定時器 756
27.4.1 延時確認定時器的處理函數 756
27.4.2 延時確認定時器的激活 758
27.5 持續定時器 758
27.5.1 持續定時器處理函數 758
27.5.2 激活持續定時器 762
27.6 保活定時器 763
27.6.1 保活定時器處理函數 763
27.6.2 激活保活定時器 764
27.7 FIN_WAIT_2定時器 764
27.7.1 FIN_WAIT_2定時器處理函數 765
27.7.2 激活FIN_WAIT_2定時器 765
27.8 TIME_WAIT定時器 766
第28章 TCP連接的建立 767
28.1 服務端建立連接過程 767
28.2 連接相關的數據結構 770
28.2.1 request_sock_queue結構 770
28.2.2 listen_sock結構 771
28.2.3 tcp_request_sock結構 771
28.2.4 request_sock_ops結構 774
28.3 bind係統調用的實現 775
28.3.1 bind端口散列錶 775
28.3.2 傳輸接口層的實現 775
28.4 listen係統調用的實現 779
28.4.1 inet_listen() 779
28.4.2 實現偵聽:
inet_csk_listen_start() 780
28.4.3 分配連接請求塊散列錶:
reqsk_queue_alloc() 781
28.5 accept係統調用的實現 782
28.5.1 套接口層的實現:
inet_accept() 782
28.5.2 傳輸接口層的實現:
inet_csk_accept() 783
28.6 被動打開 785
28.6.1 SYN cookies 785
28.6.2 第一次握手:接收SYN段 786
28.6.3 第二次握手:
發送SYN+ACK段 793
28.6.4 第三次握手:接收ACK段 798
28.7 connect係統調用的實現 813
28.7.1 套接口層的實現:
inet_stream_connect() 813
28.7.2 傳輸接口層的實現 815
28.8 主動打開 816
28.8.1 第一次握手:發送SYN段 816
28.8.2 第二次握手:
接收SYN+ACK段 823
28.8.3 第三次握手:發送ACK段 828
28.9 同時打開 828
28.9.1 SYN_SENT狀態接收SYN段 828
28.9.2 SYN_RECV狀態接收
SYN+ACK段 830
第29章 TCP擁塞控製的實現 831
29.1 擁塞控製引擎 831
29.2 擁塞控製狀態機 832
29.2.1 Open狀態 833
29.2.2 Disorder狀態 833
29.2.3 CWR狀態 833
29.2.4 Recovery狀態 834
29.2.5 Loss狀態 834
29.3 擁塞窗口調整撤銷 836
29.3.1 撤銷擁塞窗口的檢測 837
29.3.2 tcp_undo_cwr() 837
29.3.3 從Disorder擁塞狀態撤銷 838
29.3.4 從Recovery狀態撤銷 838
29.3.5 從Recovery擁塞狀態撤銷 839
29.3.6 從Loss擁塞狀態撤銷 839
29.4 顯式擁塞通知 840
29.4.1 IP對ECN的支持 841
29.4.2 TCP對ECN的支持 841
29.5 擁塞控製狀態的處理及轉換 843
29.5.1 擁塞控製狀態的處理:
tcp_fastretrans_alert() 843
29.5.2 擁塞避免 852
29.6 擁塞窗口的檢測:
tcp_cwnd_test() 852
29.7 F-RTO算法 853
29.7.1 進入F-RTO算法處理階段 853
29.7.2 進行F-RTO算法處理 855
29.8 擁塞窗口的檢驗 857
29.8.1 tcp_event_data_sent() 857
29.8.2 tcp_cwnd_validate() 858
29.9 支持多擁塞控製算法的機製 859
29.9.1 接口 859
29.9.2 注冊擁塞控製算法:tcp_register_
congestion_control() 861
29.9.3 注銷擁塞控製算法:tcp_unregister_
congestion_control() 861
29.9.4 選取某種擁塞控製算法: tcp_set_
congestion_control() 861
29.9.5 Linux支持的擁塞控製算法 862
第30章 TCP的輸齣 864
30.1 引言 864
30.2 最大段長度(MSS) 867
30.3 sendmsg係統調用在TCP中的
實現 870
30.3.1 分割TCP段 871
30.3.2 套接口層的實現 871
30.3.3 傳輸接口層的實現 871
30.4 對TCP選項的處理 889
30.4.1 構建SYN段的選項 889
30.4.2 構建非SYN段的選項 892
30.5 Nagle算法 893
30.6 ACK的接收 894
30.6.1 tcp_ack() 894
30.6.2 發送窗口的更新 899
30.6.3 根據SACK選項標記重傳
隊列中段的記分牌 900
30.6.4 重傳隊列中已經確認段的刪除 910
30.7 往返時間測量和RTO的計算 913
30.8 路徑MTU發現 915
30.8.1 路徑MTU發現原理 915
30.8.2 路徑MTU發現時的黑洞 916
30.8.3 有關數據結構的初始化 916
30.8.4 創建路徑MTU發現TCP段並
發送 916
30.8.5 路徑MTU發現失敗後處理 920
30.8.6 處理需要分片ICMP目的
不可達報文 920
30.8.7 更新當前有效的MSS 921
30.8.8 路徑MTU發現成功後處理 922
30.9 TCP重傳接口 922
第31章 TCP的輸入 926
31.1 引言 926
31.2 TCP接收的總入口 927
31.2.1 接收到prequeue隊列 930
31.2.2 有效TCP段的處理 931
31.3 報文的過濾 932
31.3.1 過濾器的數據結構 933
31.3.2 安裝過濾器 935
31.3.3 卸載過濾器 937
31.3.4 過濾執行 938
31.4 ESTABLISHED狀態的接收 938
31.4.1 首部預測 939
31.4.2 接收處理無負荷的ACK段 941
31.4.3 執行快速路徑 942
31.4.4 執行慢速路徑 945
31.4.5 數據從內核空間復製到用戶
空間 948
31.4.6 通過調節接收窗口進行
流量控製 952
31.4.7 確定是否需要發送ACK段
(用於接收的數據從內核空
間復製到用戶空間時) 956
31.5 TCP選項的處理 957
31.5.1 慢速路徑中快速解析TCP選項 957
31.5.2 全麵解析TCP選項 958
31.6 慢速路徑的數據處理 961
31.6.1 接收處理預期的段 963
31.6.2 接收處理在接收窗口之外的段 965
31.6.3 接收處理亂序的段 966
31.6.4 tcp_ofo_queue() 969
31.7 帶外數據處理 970
31.7.1 檢測緊急指針 970
31.7.2 讀取帶外數據 972
31.8 SACK信息 973
31.8.1 SACK允許選項 973
31.8.2 SACK選項 974
31.8.3 SACK的産生 974
31.8.4 發送方對SACK的響應 975
31.8.5 實現 975
31.9 確認的發送 975
31.9.1 快速確認模式 976
31.9.2 處理數據接收事件 977
31.9.3 發送確認緊急程度和狀態 978
31.9.4 延遲或快速確認 979
31.10 recvmsg係統調用在TCP中的
實現 980
31.10.1 套接口層的實現 980
31.10.2 傳輸接口層的實現 980
31.11 sk_backlog_rcv接口 991
第32章 TCP連接的終止 992
32.1 連接終止過程 993
32.1.1 正常關閉 993
32.1.2 同時關閉 994
32.2 shutdown傳輸接口層的
實現 994
32.2.1 tcp_shutdown() 994
32.2.2 tcp_send_fin() 995
32.3 close傳輸接口層的實現:
tcp_close() 995
32.4 被動關閉:FIN段的接收
處理 999
32.5 主動關閉 1002
32.5.1 timewait控製塊的數據
結構 1002
32.5.2 timewait控製塊取代TCP傳輸
控製塊 1006
32.5.3 啓動FIN_WAIT_2或TIME_WAIT
定時器 1008
32.5.4 CLOSE_WAIT、LAST_ACK、
FIN_WAIT1、FIN_WAIT2與
CLOSING狀態處理 1010
32.5.5 FIN_WAIT2和TIME_WAIT
狀態處理 1013
32.5.6 timewait控製塊的2MSL
超時處理 1020
第33章 UDP:用戶數據報 1023
33.1 引言 1023
33.1.1 UDP首部 1023
33.1.2 UDP的輸入與輸齣 1024
33.2 UDP的inet_protosw結構 1024
33.3 UDP的傳輸控製塊 1025
33.4 UDP的proto結構和proto_ops
結構的實例 1027
33.5 UDP的狀態 1027
33.6 UDP傳輸控製塊的管理 1027
33.7 bind係統調用的實現 1028
33.8 UDP套接口的關閉 1031
33.9 connect係統調用的實現 1032
33.9.1 udp_disconnect() 1033
33.9.2 ip4_datagram_connect() 1033
33.10 select係統調用的實現 1034
33.11 UDP的ioctl 1037
33.12 UDP的套接口選項 1037
33.13 UDP校驗和 1038
33.13.1 輸入UDP數據報校驗和的
計算 1038
33.13.2 輸齣UDP數據報校驗和的
計算 1039
33.14 UDP的輸齣:sendmsg係統
調用 1040
33.14.1 udp_sendmsg() 1040
33.14.2 udp_push_pending_frames() 1047
33.15 UDP的輸入 1048
33.15.1 UDP接收的入口:
udp_rcv() 1048
33.15.2 UDP組播數據報輸入:
__udp4_lib_mcast_deliver() 1052
33.15.3 udp_queue_rcv_skb() 1053
33.16 recvmsg係統調用的實現 1055
33.17 UDP的差錯處理:
udp_err() 1059
33.18 輕量級UDP 1061
參考文獻 1063
· · · · · · (
收起)