《TCP/IP架构、设计与应用 Linux版》PDF下载

  • 购买积分:20 如何计算积分?
  • 作  者:(印)塞斯,(印)文卡特苏鲁著
  • 出 版 社:北京:清华大学出版社
  • 出版年份:2010
  • ISBN:9787302229261
  • 页数:736 页
图书介绍:本书介绍了Linux中TCP/IP的设计与实现,从简单的客户端服务器应用程序到复杂的执行过程,还举例阐述了相关的实现,以帮助读者深入理解本书的内容。

第1章 引言 1

1.1 TCP/IP协议栈概述 2

1.1.1 沿协议栈向下的处理过程 2

1.1.2 沿协议栈向上的处理过程 4

1.2 Linux 2.4.20的源码组织结构 6

1.3 TCP/IP协议栈和内核控制路径 9

1.4 版本2.4之后Linux内核的可抢占性 10

1.4.1 Linux系统调用 13

1.4.2 添加新的系统调用 14

1.5 Linux进程和线程 16

1.5.1 fork() 17

1.5.2 线程 17

1.5.3 内核线程 18

1.6 内核同步机制 20

1.6.1 信号量 20

1.6.2 原子操作 21

1.6.3 旋转锁 21

1.7 TCP/IP应用编程接口 22

1.7.1 服务器应用 23

1.7.2 客户端应用 25

1.7.3 套接字选项 27

1.7.4 选项值 27

1.8 Shutdown 33

1.8.1 关闭功能在内核的实现 33

1.8.2 发送关闭 33

1.8.3 接收关闭 34

1.9 I/O 35

1.9.1 read() 35

1.9.2 write() 35

1.9.3 recv() 35

1.9.4 send() 35

1.9.5 select() 36

1.10 TCP状态 36

1.10.1 部分关闭 41

1.10.2 部分关闭的tcpdump输出 43

1.11 本章总结 43

第2章 协议基础 45

2.1 TCP 46

2.2 TCP选项(RFC 1323) 49

2.2.1 mss选项 50

2.2.2 窗口缩放选项 50

2.2.3 时间戳选项 51

2.2.4 有选择确认选项 51

2.3 TCP数据流 53

2.4 延时确认 60

2.5 Nagle算法(RFC 896) 62

2.6 TCP滑动窗口协议 64

2.7 最大化TCP吞吐量 71

2.8 TCP定时器 73

2.8.1 重传定时器 73

2.8.2 persistent定时器 74

2.8.3 keepalive定时器 75

2.8.4 TIME_WAIT定时器 75

2.9 TCP拥塞控制 76

2.10 TCP性能和可靠性 76

2.10.1 RTTD 77

2.10.2 SACK/DSACK 77

2.10.3 窗口缩放 77

2.11 IP(Internet协议) 78

2.12 路由 79

2.13 netstat 80

2.14 traceroute 81

2.15 ICMP 84

2.16 Ping 84

2.17 ARP/RARP 86

2.18 本章总结 88

第3章 套接字的内核实现 89

3.1 套接字层 90

3.2 VFS和套接字 91

3.3 协议套接字注册 92

3.4 结构inet_protosw 94

3.5 内核中的套接字组织结构 95

3.6 socket 96

3.7 inet_create(见源码3-4) 97

3.8 套接字调用流程图 104

3.9 本章总结 105

第4章 TCP连接设置的内核实现 107

4.1 连接设置 108

4.1.1 服务器端设置 108

4.1.2 服务器端操作 109

4.2 BIND 109

4.2.1 套接字BIND相关的数据结构 110

4.2.2 TCP bind的hash桶 110

4.2.3 tcp_ehash 111

4.2.4 tcp_listening_hash 112

4.2.5 tcp_bhash 112

4.2.6 tcp_hashinfo 113

4.2.7 tcp_bind_hashbucket(见图4-6) 114

4.2.8 tcp_bind_bucket 114

4.2.9 bind() 115

4.2.10 sys_bind() 115

4.2.11 sockfd_lookup() 116

4.2.12 fget() 116

4.2.13 inet_bind() 116

4.2.14 tcp_v4_get_port() 117

4.2.15 tcp_bind_conflict() 119

4.3 LISTEN 121

4.3.1 sys_listen() 122

4.3.2 inet_listen() 122

4.3.3 tcp_listen_start() 122

4.3.4 listen控制流 125

4.3.5 结构open_request 126

4.3.6 accept队列已满 131

4.3.7 链接在tcp_ehash hash表中的已建立套接字 134

4.3.8 当三次握手未完成时连接请求的状态 134

4.3.9 当三次握手完成后连接请求的状态 135

4.4 内核对连接请求的处理 136

4.4.1 SYN队列处理 137

4.4.2 accept队列处理 138

4.4.3 处理新连接请求的流程 140

4.5 ACCEPT 140

4.5.1 inet_accept() 143

4.5.2 当三次握手完成且应用程序接受后链接inode和套接字数据结构 143

4.5.3 新连接已建立后链接VFS和内核套接字数据结构 146

4.5.4 新已接受连接套接字的文件表入口项 146

4.5.5 接受新建立连接的流控制 147

4.6 客户端设置 147

4.6.1 客户端操作 147

4.6.2 connect 147

4.6.3 tcp_v4_connect() 148

4.6.4 ip_route_connect() 148

4.6.5 生成连接请求的流控制 149

4.6.6 tcp_v4_hash_connect() 151

4.6.7 _tcp_v4_check_established() 152

4.6 8 tcp_connect() 155

4.6.9 tcp_transmit_skb() 157

4.7 本章总结 159

第5章 sk_buff和协议头 161

5.1 结构sk_buff 162

5.2 结构skb_shared_info(见图5-3) 166

5.3 sk_buff和DMA-skb_frag_struct 166

5.3.1 DMA和分段sk_buff 167

5.3.2 sk_buff和IP分段 167

5.3.3 sk_buff和分段 169

5.4 sk_buff的例程操作 169

5.4.1 alloc_skb() 169

5.4 2 skb_reserve() 170

5.4.3 skb_put() 171

5.4.4 skb_push() 173

5.4.5 skb_pull() 174

5.5 构建向下遍历协议层时的协议头 175

5.5.1 TCP头的添加 175

5.5.2 IP头的添加 176

5.5.3 链路层头的添加 177

5.6 解析向上遍历协议层时的协议头 178

5.6.1 sk_buff指向链路层驱动要处理的链路层头 178

5.6.2 sk_buff指向IP层要处理的IP头 179

5.6.3 sk_buff指向TCP层要处理的TCP头 180

5.7 本章总结 181

第6章 sk_buff在不同协议层的处理 183

6.1 TCP/IP协议栈向下的报文处理 184

6.1.1 从套接字层到设备的报文传输路径 185

6.1.2 TCP报文沿协议栈向下处理的内核路径 187

6.2 准备传输的报文 192

6.3 报文向下处理的内核流 193

6.4 协议栈向上的报文处理过程 195

6.4.1 从设备(接收)到套接字层的报文处理路径 198

6.4.2 TCP报文沿协议栈向上的内核处理路径 198

6.5 沿协议栈向上的报文内核流程 205

6.6 本章总结 205

第7章 TCP发送 207

7.1 TCP分段单元 207

7.1.1 无分散-聚集支持下的分段单元处理 208

7.1.2 无分散-聚集支持的分段处理 210

7.1.3 通过套接字写1mss字节的数据 211

7.2 分散-聚集支持的分段处理 212

7.2.1 有分散-聚集支持的分段处理 215

7.2.2 应用程序向套接字写Y字节的数据 216

7.2 3 can_coalesce() 216

7.2.4 tcp_copy_to_page() 217

7.2.5 tcp_mark_push() 217

7.2 6 forced_push() 218

7.2.7 tcp_push() 218

7.2.8 _tcp_push_pending_frames() 219

7.2 9 tcp_snd_test() 220

7.2.10 tcp_nagle_check() 220

7.2.11 tcp_minshall_check() 221

7.2.12 tcp_write_xmit() 221

7.2.13 update_send_head() 223

7.2.14 tcp_push_one() 224

7.2.15 skb_entail() 224

7.3 发送OOB数据 225

7.4 TCP分段单元和发送处理流程 226

7.5 分段和发送机制的函数调用流 227

7.6 本章总结 229

第8章 TCP接收 231

8.1 排队机制 231

8.1.1 tcp_rcv_established()的处理 232

8.1.2 tcp_prequeue() 234

8.1.3 队列处理 235

8.1.4 tcp_data_wait() 239

8.1.5 tcp_prequeue_process() 240

8.1.6 lock_sock() 241

8.1.7 _lock_sock() 241

8.1.8 release_sock() 242

8.1.9 _release_sock() 242

8.2 接收队列中TCP数据的处理 243

8.2.1 cleanup_rbuf() 246

8.2.2 skb_copy_datagram_iovec() 248

8.2.3 从接收缓冲区读取无分页的数据 250

8.2.4 应用程序读取X个字节 250

8.2.5 应用程序读取n个字节(1mss=n) 251

8.2.6 应用程序读取n-X个字节 252

8.2.7 从分页缓冲区读取数据 253

8.2.8 应用程序读取n个字节 253

8.2.9 应用程序读取1页的数据 254

8.3 TCP紧急数据处理 255

8.3.1 紧急字节读取的OOB数据模式 255

8.3.2 tcp_recv_urg() 256

8.3.3 紧急模式处理和紧急字节读取的内联数据模式 257

8.4 通过TCP套接字接收数据的数据流图 260

8.5 本章总结 266

第9章 TCP内存管理 267

9.1 发送端TCP内存管理 267

9.1.1 select_size() 270

9.1.2 tcp_alloc_pskb() 271

9.1.3 alloc_skb() 272

9.1.4 tcp_alloc_page() 273

9.1.5 skb_charge() 274

9.1.6 tcp_mem_schedule() 274

9.1.7 tcp_free_skb() 276

9.1.8 sock_wfree() 277

9.1.9 tcp_write_space() 277

9.1.10 tcp_mem_reclaim() 278

9.1.11 _tcp_mem_reclaim() 279

9.1.12 wait_for_tcp_memory() 279

9.2 接收端TCP内存管理 282

9.2.1 tcp_prune_queue() 285

9.2.2 tcp_clamp_window() 286

9.2.3 tcp_collapse_ofo_queue() 288

9.2.4 tcp_collapse() 289

9.2.5 _skb_queue_purge() 296

9.3 接收缓冲区内存释放 296

9.4 TCP内存管理中的系统级控制参数 296

9.5 本章总结 298

第10章 TCP定时器 299

10.1 Linux中的定时器 300

10.1.1 mod_timer() 300

10.1.2 detach_timer() 301

10.1.3 del_timer() 301

10.1.4 执行定时器例程的时机 302

10.2 TCP重传定时器 302

10.2.1 安装重传定时器的时机 302

10.2.2 重置或者取消重传定时器的时机 303

10.2.3 tcp_enter_loss() 306

10.2.4 tcp_retransmit_skb() 308

10.2.5 tcp_retrans_try_collapse() 309

10.2.6 skb_cloned() 311

10.3 零窗口探测定时器 312

10.3.1 首次安装探测定时器的时机 312

10.3.2 取消连接探测定时器的时机 313

10.3.3 tcp_ack_probe() 313

10.3.4 窗口探测定时器的工作原理 314

10.3.5 tcp_probe_timer() 314

10.3.6 tcp_send_probeO() 315

10.3.7 tcp_write_wakeup() 316

10.4 延时确认定时器 318

10.4.1 ACK的调度时机 319

10.4.2 ACK数据段的发送时机和发送处理过程 320

10.4.3 快速ACK模式 321

10.4.4 _tcp_ack_snd_check() 321

10.4.5 tcp_ack_snd_check() 322

10.4.6 tcp_send_delayed_ack() 323

10.4.7 tcp_delack_timer() 324

10.4.8 tcp_reset_xmit_timer() 326

10.4.9 tcp_write_timer() 327

10.4.10 tcp_clear_xmit_timer() 328

10.5 keepalive定时器 329

10.5.1 激活keepalive定时器的时机 330

10.5.2 如何重置定时器 330

10.5.3 tcp_keepalive_timer() 330

10.6 SYN-ACK定时器 333

10.6.1 SYN-ACK定时器激活的时机 333

10.6.2 SYN-ACK定时器停止的时机 333

10.6.3 tcp_synack_timer() 334

10.7 TIME_WAIT定时器 338

10.7.1 TIME_WAIT定时器的触发时机 338

10.7.2 tcp_time_wait() 338

10.7.3 tcp_tw_schedule() 339

10.7.4 非再生模式 341

10.7.5 再生模式 342

10.7.6 tcp_twkill() 345

10.7.7 tcp_twcal_tick() 347

10.7.8 _tcp_tw_hashdance() 350

10.8 本章总结 352

第11章 TCP核心处理 353

11.1 传入TCP数据段处理 354

11.1.1 预测标志 354

11.1.2 构建预测标志 355

11.1.3 使用快速路径的条件 357

11.1.4 使用慢速路径的时机 357

11.1.5 使用快速路径的时机 358

11.1.6 与预测标志相关的注意点 358

11.2 快速路径处理 359

11.3 慢速路径处理 362

11.3.1 tcp_sequence() 363

11.3.2 tcp_replace_ts_recent() 364

11.3.3 tcp_event_data_recv() 365

11.3.4 tcp_incr_quickack() 367

11.3.5 tcp_grow_window() 367

11.3.6 _tcp_grow_window() 369

11.3.7 计算通告窗口 370

11.3.8 tcp_rrceive_window() 370

11.3.9 tcp_select_window() 371

11.3.10 tcp_space() 372

11.3.11 tcp_data_snd_check() 372

11.3.12 _tcp_data_snd_check() 373

11.3.13 tcp_paws_discard() 373

11.4 传入ACK的处理 375

11.4.1 tcp_packets_in_flight() 378

11.4.2 tcp_ack_is_dubious() 379

11.4.3 tcp_cong_avoid() 380

11.4.4 tcp_ack_update_window() 381

11.4.5 tcp_may_update_window() 382

11.4.6 tcp_clean_rtx_queue() 382

11.5 处理SACK块 385

11.6 重定序长度 392

11.7 处理TCP紧急指针 395

11.8 在慢速路径中处理数据段 399

11.8.1 tcp_sack_new_ofo_skb() 407

11.8.2 tcp_sack_maybe_coalesce() 409

11.8.3 tcp_sack_extend() 410

11.8.4 tcp_ofo_queue() 411

11.8.5 tcp_sack_remove() 415

11.9 TCP核心处理 417

11.10 本章总结 418

第12章 TCP状态处理 419

12.1 拥塞状态处理概述 420

12.2 TCP状态 422

12.2.1 TCP_CA_CWR 422

12.2.2 从TCP_CA_CWR状态撤消 423

12.3 在恢复状态中处理重复/部分确认 423

12.3.1 tcp_remove_reno_sacks() 424

12.3.2 tcp_try_undo_partial() 425

12.4 在丢失状态中处理重复/部分确认 426

12.4.1 tcp_try_undo_loss() 427

12.4.2 tcp_check_sack_reneging() 429

12.5 TCP状态的默认处理 429

12.5.1 tcp_time_to_recover() 432

12.5.2 tcp_head_timedout() 434

12.5.3 tcp_try_to_open() 435

12.5.4 tcp_update_scoreboard() 436

12.5.5 tcp_xmit_retransmit_queue() 438

12.5.6 tcp_packet_delayed() 440

12.6 当确认超过tp→high_seq时TCP非正常状态的处理 440

12.6.1 TCP_CA_Loss 441

12.6.2 TCP_CA_CWR 441

12.6.3 TCP_CA_Disorder 443

12.6.4 tcp_try_undo_dsack 444

12.6.5 TCP_CA_Recovery 444

12.6.6 tcp_add_reno_sack() 446

12.6.7 tcp_check_reno_reordering() 446

12.6.8 tcp_may_undo() 447

12.6.9 tcp_packet_delayed() 447

12.6.10 tcp_undo_cwr() 448

12.6.11 tcp_mark_head_lost() 449

12.6.12 tcp_sync_left_out() 450

12.7 本章总结 450

第13章 netlink套接字 453

13.1 netlink套接字介绍 453

13.2 启动时netlink套接字的注册和初始化 454

13.3 内核netlink套接字的创建 455

13.4 用户netlink套接字的创建 457

13.5 netlink数据结构 459

13.5.1 nl_table 459

13.5.2 rtnetlink_link 460

13.6 其他重要的数据结构 463

13.6.1 nlmsghdr结构 463

13.6.2 msghdr结构 463

13.7 netlink报文格式 464

13.8 netlink套接字例子——添加qdisc的tc命令 465

13.8.1 用户空间中添加qdisc的tc命令流 465

13.8.2 内核空间的tc命令 466

13.9 内核空间中的tc命令流程图 470

13.10 本章总结 471

第14章 IP路由 473

14.1 路由 475

14.2 基于策略的路由 477

14.3 多路径 478

14.4 记录路由选项(RFC 791)以及Linux栈的处理 482

14.5 源路由 483

14.5.1 严格记录路由 483

14.5.2 松散记录路由 483

14.5.3 SRR处理实现 484

14.6 路由表和路由缓存的Linux内核实现 490

14.7 路由缓存实现概述 491

14.8 管理路由缓存 496

14.8.1 本地连接的路由缓存 498

14.8.2 _sk_dst_check() 499

14.8.3 链接失效并报告给路由子系统 500

14.8.4 dst_link_failure() 501

14.8.5 ipv4_link_failure() 501

14.8.6 dst_set_expires() 501

14.8.7 传入报文的路由缓存 502

14.8.8 路由缓存计数器 503

14.8.9 rt_periodic_timer 504

14.8.10 rt_may_expire() 506

14.8.11 dst_free() 507

14.8.12 _dst_free() 508

14.8.13 dst_destroy() 509

14.8.14 dst_run_gc() 509

14.8.15 关闭接口和rt_flush_timer 511

14.8.16 rt_cashe_flush() 512

14.9 转发信息库的实现概述 513

14.9.1 结构fib_table 515

14.9.2 结构fn_hash 516

14.9.3 结构fn_zone 516

14.9.4 结构fib_node 517

14.9.5 结构fib_info 519

14.9.6 结构fib_nh 520

14.9.7 结构fib_rule 521

14.10 使用ip命令在路由表中添加新的表项(RT Netlink接口) 522

14.10.1 当使用向路由表中添加一个表项的路由选项运行ip命令时的情况 523

14.10.2 inet_rtm_newroute() 523

14.10.3 结构rtmsg 524

14.10.4 结构kern_rta 525

14.10.5 fn_hash_insert() 525

14.10.6 fn_new_zone() 528

14.10.7 fib_create_info() 530

14.10.8 fn_hash_insert() 531

14.11 当使用向路由表中添加一个表项的规则选项运行ip命令时的情况 532

14.11.1 inet_rtm_newrule() 532

14.11.2 FIB初始化 534

14.12 FIB遍历流程图 538

14.12.1 ip_route_output() 539

14.12.2 ip_route_output_key() 539

14.12.3 ip_route_output_slow() 540

14.12.4 ip_dev_find() 551

14.12.5 _in_dev_get() 552

14.12.6 inet_select_addr() 553

14.12.7 路由范围 554

14.12.8 fib_lookup() 555

14.13 本章总结 563

第15章 Linux中的IP服务质量(IP QoS) 565

15.1 简介 565

15.2 Linux流量控制的基本组件 566

15.3 Linux中pfifo_fast排队规则的实现 567

15.4 排队规则数据结构 570

15.4.1 结构Qdisc 570

15.4.2 结构Qdisc_ops 571

15.4.3 结构Qdisc_class_ops 572

15.4.4 结构cbq_class 573

15.5 tc用户程序及其内核实现细节 575

15.5.1 tc_modify_qdisc() 576

15.5.2 qdisc_create() 578

15.5.3 cbq_init() 579

15.5.4 qdisc_graft() 580

15.5.5 dev_graft_qdisc() 581

15.6 为CBQ创建类别层次的tc命令 582

15.6.1 tc_ctl_tclass() 582

15.6.2 cbq_change_class() 584

15.7 过滤器 585

15.8 u32过滤器实现 589

15.9 路由过滤器实现 592

15.10 enqueue 596

15.10.1 cbq_enqueue() 596

15.10.2 cbq_classify() 597

15.10.3 cbq_enqueue()函数概述 598

15.11 CBQ的Linux实现概述 599

15.12 cbq_dequeue() 599

15.12.1 从net/dev/core.c 601

15.12.2 qdisc_run() 602

15.12.3 qdisc_restart() 603

15.12.4 cbq_dequeue() 604

15.12.5 cbq_dequeue_l() 605

15.12.6 cbq_dequeue_prio() 605

15.13 本章总结 609

第16章 IP Filter防火墙 611

16.1 Netfilter Hook框架 612

16.2 IP协议栈上的Netfilter Hook 613

16.2.1 用于传出报文的钩子 614

16.2.2 用于传入报文的钩子 615

16.3 Neffilter Hook注册 616

16.4 Netfilter Hook处理 618

16.4.1 nf_hook_slow() 618

16.4.2 nf_iterate() 619

16.4.3 结构nf_hook_ops 620

16.5 兼容性框架 620

16.6 ipchains 624

16.6.1 使用ipchains过滤 625

16.6.2 ipchains的规则链 626

16.6.3 结构ipchain 626

16.6.4 结构ip_fwkernel 627

16.6.5 结构ip_reent 627

16.6.6 结构ip_fw 628

16.6.7 ipchams中表的组织结构 628

16.7 使用ipchains过滤报文 629

16.7.1 ip_fw_check() 629

16.7.2 ip_rule_match() 632

16.8 iptables 634

1 6.9 iptables过滤规则和目标组织 635

16.9.1 结构ipt_table 636

16.9.2 结构ipt_table_info 636

16.9.3 结构ipt_entry 638

16.9.4 结构ipt_entry_match 639

16.9.5 结构ipt_tcp 640

16.9.6 结构ipt_entry_target 641

16.9.7 结构ipt_standard_target 641

16.10 iptables过滤规则和目标的组织结构 641

16.11 使用iptables过滤报文 641

16.11.1 ipt_do_table() 642

16.11.2 IPT_MATCH_ITERATE 645

16.12 本章总结 646

第17章 网络软中断 647

17.1 使用软中断的原因和触发机制 648

17.1.1 传输 648

17.1.2 接收 648

17.2 处理软中断 651

17.3 软中断的注册 654

17.4 报文接收以及Rx软中断的延迟处理 655

17.5 网络Rx软中断的处理 659

17.6 报文传输与软中断 663

17.7 本章总结 672

第18章 报文的传输和接收 675

18.1 传输和接收报文的DMA环缓冲区 675

18.2 报文接收处理 676

18.2.1 支持DMA的报文接收处理流程 677

18.2.2 环缓冲区的接收处理 677

18.3 报文传输处理 679

18.3.1 DMA支持的报文传输处理过程 679

18.3.2 传输环缓冲区 680

18.4 报文传输和接收的实现 682

18.4.1 struct etrax_eth_descr 683

18.4.2 struct etrax_dma_descr 683

18.4.3 设备的初始化 684

18.4.4 DMA传输环缓冲区的初始化 685

18.4.5 DMA接收环缓冲区的初始化 686

18.5 处理报文接收的Rx中断 688

18.5.1 Rx DMA缓冲区的初始化 689

18.5.2 e100_rx() 689

18.5.3 产生Rx中断前DMA缓冲区接收到三个报文时的Rx描述符 690

18.5.4 从DMA缓冲区中取出第一个报文交给操作系统Rx中断处理程序后的Rx描述符 691

18.6 报文传输 693

18.6.1 e100_send_packet() 693

18.6.2 初始化后的Tx DMA环缓冲区描述符 694

18.6.3 e100_hardware_send_packet() 696

18.6.4 设备DMATx环缓冲区中有两个报文时的处理 696

18.6.5 e100tx_interrupt() 697

18.6.6 传输了第一个报文并且中断已产生时的情形 698

18.7 本章总结 699

第19章 lkcd和TCP/IP协议栈的调试 701

19.1 lkcd源码和补丁 702

19.2 套接字 702

19.3 查看接收套接字缓冲区 704

19.4 查看发送套接字缓冲区 705

19.5 TCP分段单元 708

19.6 发送拥塞窗口和ssthresh 709

19.7 重传和路由 711

19.8 查看连接队列和SYN队列 712

19.9 使用lcrash来查看路由和IP服务质量 715

19.10 使用lcrash调试CBQ(基于类别的)排队规则 717

19.11 u32过滤器 718

19.12 路由过滤器 724

19.13 FIB表的lcrash输出 724

19.14 使用tc命令建立路由过滤器 728

19.15 NETLINK数据结构 731

19.15.1 nl_table 731

19.15.2 rtnetlink_link 732

19.16 本章总结 733

第20章 展望 735