上 册 目 录
         前言 
         第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
      · · · · · ·     (
收起)