《Linux核心源碼剖析(上下冊)》是2011年出版的圖書,作者是樊東東莫瀾。
基本介紹
- 書名:《Linux核心源碼剖析》
- 作者:樊東東 莫瀾
- ISBN:9787111323730
- 頁數:1062
- 定價:142.00元
- 出版時間:2011-1
內容介紹
作品目錄
前言
第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