基于2.6.20版本的《Linux内核源码剖析--TCP/IP实现》(2)

2020-05-22 00:00:00 调用 接口 结构 定时器 拥塞

第19章 路由表    526
19.1 概念    526
19.1.1 构成的路由的要素    526
19.1.2 特殊路由    528
19.1.3 路由缓存    528
19.2 系统参数    529
19.3 路由表组成结构    529
19.3.1 fib_table结构    532
19.3.2 fn_zone结构    533
19.3.3 fib_node结构    534
19.3.4 fib_alias结构    534
19.3.5 fib_info结构    535
19.3.6 fib_nh结构    537
19.4 路由表的初始化    538
19.5 netlink接口    539
19.5.1 netlink路由表项消息结构    540
19.5.2 inet_rtm_newroute()    542
19.5.3 inet_rtm_delroute()    542
19.6 获取指定的路由表    543
19.7 路由表项的添加    543
19.8 路由表项的删除    549
19.9 外部事件    550
19.9.1 网络设备状态变化事件    551
19.9.2 IP地址变化事件    552
19.9.3 fib_add_ifaddr()    552
19.9.4 fib_del_ifaddr()    554
19.9.5 fib_disable_ip()    557
19.9.6 fib_magic()    557
19.10 选路    558
19.10.1 输入选路:ip_route_input_slow()    558
19.10.2 组播输入选路:ip_route_input_mc()    563
19.10.3 输出选路:ip_route_output_slow()    565
19.10.4 fib_lookup()    570
19.10.5 fn_hash_lookup()    571
19.11 ICMP重定向消息的发送    572
第20章 路由缓存    574
20.1 系统参数    574
20.2 路由缓存的组织结构    575
20.2.1 rtable结构    575
20.2.2 flowi结构    578
20.2.3 dst_entry结构    580
20.2.4 dst_ops结构    582
20.3 初始化    584
20.4 创建路由缓存项    586
20.4.1 创建输入路由缓存项    586
20.4.2 创建输出路由缓存项    589
20.5 添加路由表项到缓存中:rt_intern_hash()    592
20.6 输入路由缓存查询:ip_route_input()    594
20.7 输出路由缓存查询    596
20.7.1 ip_route_output_key    597
20.7.2 __ip_route_output_key()    597
20.8 垃圾回收    598
20.8.1 路由缓存项的过期    598
20.8.2 判断缓存路由表项是否可被删除    599
20.8.3 同步清理    599
20.8.4 异步清理    605
20.8.5 路由缓存项的释放    607
20.9 刷新缓存    607
20.9.1 通过定时器定时刷新    608
20.9.2 网络设备的硬件地址发生改变    608
20.9.3 网络设备状态发生变化    608
20.9.4 给设备添加或删除一个IP地址    609
20.9.5 全局转发状态或设备的转发状态发生变化    609
20.9.6 一条路由被删除    609
20.9.7 通过写/proc的flush文件    609
20.10 ICMP重定向消息的处理    609
20.11 ICMP目的不可达,需要分片消息的处理    613
第21章 路由策略    615
21.1 路由策略组织结构    615
21.1.1 fib_rules_op结构    616
21.1.2 fib_rule结构    617
21.1.3 fib4_rule结构    619
21.2 三个缺省路由策略    620
21.3 IPv4协议族的fib_rules_ops结构实例    620
21.3.1 fib4_rule_action()    620
21.3.2 fib4_rule_match()    621
21.3.3 fib4_rule_configure()    622
21.3.4 fib4_rule_compare()    623
21.3.5 fib4_rule_fill()    623
21.3.6 fib4_rule_default_pref()    624
21.4 netlink接口    624
21.4.1 netlink路由策略消息结构    625
21.4.2 fib_nl_newrule()    626
21.4.3 fib_nl_delrule()    628
21.5 受网络设备状态改变的影响    629
21.6 策略路由的查找    630
第22章 套接口层    632
22.1 socket结构    633
22.2 proto_ops结构    635
22.3 套接口文件系统    636
22.3.1 套接口文件系统类型    637
22.3.2 套接口文件系统超级块操作接口    637
22.3.3 套接口文件的inode    637
22.3.4 sock_alloc_inode()    637
22.3.5 sock_destroy_inode()    638
22.4 套接口文件    638
22.4.1 套接口文件与套接口的绑定    639
22.4.2 根据文件描述符获取套接口    641
22.5 进程、文件描述符和套接口    642
22.6 套接口层的系统初始化    643
22.7 套接口系统调用    644
22.7.1 套接口系统调用入口    645
22.7.2 socket系统调用    648
22.7.3 bind系统调用    656
22.7.4 listen系统调用    660
22.7.5 accept系统调用    660
22.7.6 connect系统调用    662
22.7.7 shutdown系统调用.    664
22.7.8 close系统调用    666
22.7.9 select系统调用的实现    668
第23章 套接口I/O    670
23.1 输出/输入数据的组织    670
23.1.1 msghdr结构    670
23.1.2 verify_iovec()    672
23.1.3 memcpy_toiovec()    673
23.1.4 memcpy_fromiovec()    673
23.1.5 memcpy_fromiovecend()    673
23.1.6 csum_partial_copy_fromiovecend()    673
23.2 输出系统调用    674
23.2.1 sock_sendmsg()    674
23.2.2 sendto系统调用    674
23.2.3 send系统调用    675
23.2.4 sendmsg系统调用    675
23.3 输入系统调用    678
第24章 套接口选项    680
24.1 setsockopt系统调用    680
24.2 ioctl系统调用    685
24.2.1 ioctl在文件系统内的调用过程    685
24.2.2 套接口文件ioctl调用接口的实现    686
24.2.3 套接口层的实现    688
24.3 getsockname系统调用    689
24.4 getpeername系统调用    691
第25章 传输控制块    692
25.1 系统参数    693
25.2 传输描述块结构    693
25.2.1 sock_common结构    693
25.2.2 sock结构    694
25.2.3 inet_sock结构    701
25.3 proto结构    705
25.3.1 proto实例组织结构    708
25.3.2 proto_register()    708
25.3.3 proto_unregister()    710
25.4 传输控制块的内存管理    711
25.4.1 传输控制块的分配和释放    711
25.4.2 普通的发送缓存区的分配    713
25.4.3 发送缓存的分配与释放    717
25.4.4 接收缓存的分配与释放    718
25.4.5 辅助缓存的分配与释放    719
25.5 异步IO机制    720
25.5.1 sk_wake_async()    721
25.5.2 sock_def_wakeup()    722
25.5.3 sock_def_error_report()    723
25.5.4 sock_def_readable()    723
25.5.5 sock_def_write_space()和sk_stream_write_space()    723
25.5.6 sk_send_sigurg()    724
25.5.7 接收到FIN段后通知进程    724
25.5.8 sock_fasync()    725
25.6 传输控制块的同步锁    726
25.6.1 socket_lock_t结构    726
25.6.2 控制用户进程和下半部间同步锁    727
25.6.3 控制下半部间同步锁    731
第26章 TCP:传输控制协议    732
26.1 系统参数    732
26.2 TCP的inet_protosw实例    738
26.3 TCP的net_protocol结构    739
26.4 TCP传输控制块    739
26.4.1 inet_connection_sock结构    739
26.4.2 inet_connection_sock_af_ops结构    743
26.4.3 tcp_sock结构    745
26.4.4 tcp_options_received结构    754
26.4.5 tcp_skb_cb结构    756
26.5 TCP的proto结构和proto_ops结构的实例    757
26.6 TCP状态迁移图    758
26.7 TCP首部    759
26.8 TCP校验和    760
26.8.1 输入TCP段的校验和检测    761
26.8.2 输出TCP段校验和的计算    762
26.9 TCP的初始化    762
26.10 TCP传输控制块的管理    765
26.10.1 inet_hashinfo结构    765
26.10.2 管理除LISTEN状态之外的TCP传输控制块    767
26.10.3 管理LISTEN状态的TCP传输控制块    768
26.11 TCP层的套接口选项    768
26.12 TCP的IOCTL    770
26.13 TCP传输控制块的初始化    770
26.14 TCP的差错处理    771
26.15 TCP传输控制块层的缓存管理    774
26.15.1 缓存管理的算法    775
26.15.2 发送缓存的管理    778
26.15.3 接收缓存的管理    779
第27章 TCP的定时器    780
27.1 初始化    780
27.2 连接建立定时器    781
27.2.1 连接建立定时器处理函数    781
27.2.2 连接建立定时器的激活    785
27.3 重传定时器    785
27.3.1 重传定时器处理函数    785
27.3.2 重传定时器的激活    790
27.4 延迟确认定时器    790
27.4.1 延时确认定时器的处理函数    790
27.4.2 延时确认定时器的激活    792
27.5 持续定时器    792
27.5.1 持续定时器处理函数    792
27.5.2 激活持续定时器    796
27.6 保活定时器    797
27.6.1 保活定时器处理函数    797
27.6.2 激活保活定时器    799
27.7 FIN_WAIT_2定时器    799
27.7.1 FIN_WAIT_2定时器处理函数    799
27.7.2 激活FIN_WAIT_2定时器    800
27.8 TIME_WAIT定时器    800
第28章 TCP连接的建立    801
28.1 服务端建立连接过程    801
28.2 连接相关的数据结构    804
28.2.1 request_sock_queue结构    804
28.2.2 listen_sock结构    805
28.2.3 tcp_request_sock结构    806
28.2.4 request_sock_ops结构    809
28.3 bind系统调用的实现    809
28.3.1 bind端口散列表    809
28.3.2 传输接口层的实现    810
28.4 listen系统调用的实现    813
28.4.1 inet_listen()    813
28.4.2 实现侦听:inet_csk_listen_start()    814
28.4.3 分配连接请求块散列表:reqsk_queue_alloc()    815
28.5 accept系统调用的实现    817
28.5.1 套接口层的实现:inet_accept()    817
28.5.2 传输接口层的实现:inet_csk_accept()    817
28.6 被动打开    820
28.6.1 SYN cookies    820
28.6.2 次握手:接收SYN段    820
28.6.3 第二次握手:发送SYN+ACK段    829
28.6.4 第三次握手:接收ACK段    833
28.7 connect系统调用的实现    849
28.7.1 套接口层的实现:inet_stream_connect()    849
28.7.2 传输接口层的实现    852
28.8 主动打开    852
28.8.1 次握手:发送SYN段    852
28.8.2 第二次握手:接收SYN+ACK段    860
28.8.3 第三次握手:发送ACK段    865
28.9 同时打开    865
28.9.1 SYN_SENT状态接收SYN段    866
28.9.2 SYN_RECV状态接收SYN+ACK段    867
第29章 TCP拥塞控制的实现    868
29.1 拥塞控制引擎    868
29.2 拥塞控制状态机    869
29.2.1 Open状态    870
29.2.2 Disorder状态    870
29.2.3 CWR状态    870
29.2.4 Recovery状态    871
29.2.5 Loss状态    871
29.3 拥塞窗口调整撤销    873
29.3.1 撤销拥塞窗口的检测    874
29.3.2 tcp_undo_cwr()    874
29.3.3 从Disorder拥塞状态撤销    875
29.3.4 从Recovery状态撤销    875
29.3.5 从Recovery拥塞状态撤销    876
29.3.6 从Loss拥塞状态撤销    876
29.4 显式通塞通知    877
29.4.1 IP对ECN的支持    877
29.4.2 TCP对ECN的支持    878
29.5 拥塞控制状态的处理及转换    879
29.5.1 拥塞控制状态的处理:tcp_fastretrans_alert()    880
29.5.2 拥塞避免    889
29.6 拥塞窗口的检测:tcp_cwnd_test()    889
29.7 F-RTO算法    890
29.7.1 进入F-RTO算法处理阶段    890
29.7.2 进行F-RTO算法处理    892
29.8 拥塞窗口的检验    894
29.8.1 tcp_event_data_sent()    895
29.8.2 tcp_cwnd_validate()    895
29.9 支持多拥塞控制算法的机制    896
29.9.1 接口    896
29.9.2 注册拥塞控制算法:tcp_register_congestion_control()    898
29.9.3 注销拥塞控制算法:tcp_unregister_congestion_control()    898
29.9.4 选取某种拥塞控制算法: tcp_set_congestion_control()    899
29.9.5 Linux支持的拥塞控制算法    900
第30章 TCP的输出    901
30.1 引言    901
30.2 大段长度(MSS)    904
30.3 sendmsg系统调用在TCP中的实现    907
30.3.1 分割TCP段    907
30.3.2 套接口层的实现    908
30.3.3 传输接口层的实现    908
30.4 对TCP选项的处理    926
30.4.1 构建SYN段的选项    926
30.4.2 构建非SYN段的选项    928
30.5 Nagle算法    930
30.6 ACK的接收    930
30.6.1 tcp_ack()    931
30.6.2 发送窗口的更新    936
30.6.3 根据SACK选项标记重传队列中段的记分牌    937
30.6.4 重传队列中已经确认段的删除    948
30.7 往返时间测量和RTO的计算    951
30.8 路径MTU发现    953
30.8.1 路径MTU发现原理    953
30.8.2 路径MTU发现时的黑洞    954
30.8.3 有关数据结构的初始化    954
30.8.4 创建路径MTU发现TCP段并发送    954
30.8.5 路径MTU发现失败后处理    958
30.8.6 处理需要分片ICMP目的不可达报文    958
30.8.7 更新当前有效的MSS    959
30.8.8 路径MTU发现成功后处理    960
30.9 TCP重传接口    960
第31章 TCP的输入    964
31.1 引言    964
31.2 TCP接收的总入口    965
31.2.1 接收到prequeue队列    968
31.2.2 有效TCP段的处理    969
31.3 报文的过滤    970
31.3.1 过滤器的数据结构    971
31.3.2 安装过滤器    973
31.3.3 卸载过滤器    975
31.3.4 过滤执行    976
31.4 ESTABLISHED状态的接收    976
31.4.1 首部预测    977
31.4.2 接收处理无负荷的ACK段    979
31.4.3 执行快速路径    980
31.4.4 执行慢速路径    984
31.4.5 数据从内核空间复制到用户空间    987
31.4.6 通过调节接收窗口来进行流量控制    991
31.4.7 确定是否需要发送ACK段(用于接收的数据从内核空间复制到用户空间时)    995
31.5 TCP选项的处理    996
31.5.1 慢速路径中快速解析TCP选项    996
31.5.2 全面解析TCP选项    997
31.6 慢速路径的数据处理    1000
31.6.1 接收处理预期的段    1002
31.6.2 接收处理在接收窗口之外的段    1004
31.6.3 接收处理乱序的段    1005
31.6.4 tcp_ofo_queue()    1008
31.7 带外数据处理    1009
31.7.1 检测紧急指针    1010
31.7.2 读取带外数据    1011
31.8 SACK选项    1012
31.8.1 SACK允许选项    1013
31.8.2 SACK选项    1013
31.8.3 SACK的产生    1013
31.8.4 发送方对SACK的响应    1014
31.8.5 实现    1014
31.9 确认的发送    1015
31.9.1 快速确认模式    1015
31.9.2 处理数据接收事件    1016
31.9.3 发送确认紧急程度和状态    1017
31.9.4 延迟或快速确认    1019
31.10 recvmsg系统调用在TCP中的实现    1020
31.10.1 套接口层的实现    1020
31.10.2 传输接口层的实现    1020
31.11 sk_backlog_rcv接口    1031
第32章 TCP连接的终止    1032
32.1 连接终止过程    1033
32.1.1 正常关闭    1033
32.1.2 同时关闭    1034
32.2 shutdown传输接口层的实现    1034
32.2.1 tcp_shutdown()    1034
32.2.2 tcp_send_fin()    1035
32.3 close传输接口层的实现:tcp_close()    1035
32.4 被动关闭:FIN段的接收处理    1040
32.5 主动关闭    1042
32.5.1 timewait控制块的数据结构    1042
32.5.2 timewait控制块取代TCP传输控制块    1046
32.5.3 启动FIN_WAIT_2或TIME_WAIT定时器    1049
32.5.4 CLOSE_WAIT、LAST_ACK 、FIN_WAIT1、FIN_WAIT2、CLOSING状态处理    1051
32.5.5 FIN_WAIT2和TIME_WAIT状态处理    1054
32.5.6 timewait控制块的2MSL超时处理    1061
第33章 UDP:用户数据报    1065
33.1 引言    1065
33.1.1 UDP首部    1065
33.1.2 UDP的输入与输出    1066
33.2 UDP的inet_protosw结构    1067
33.3 UDP的传输控制块    1067
33.4 UDP的proto结构和proto_ops结构的实例    1069
33.5 UDP的状态    1069
33.6 UDP传输控制块的管理    1069
33.7 bind系统调用的实现    1070
33.8 UDP套接口的关闭    1073
33.9 connect系统调用的实现    1074
33.9.1 udp_disconnect()    1075
33.9.2 ip4_datagram_connect()    1075
33.10 select系统调用的实现    1077
33.11 UDP的IOCTL    1079
33.12 UDP的套接口选项    1079
33.13 UDP校验和    1080
33.13.1 输入UDP数据报的校验和检测    1081
33.13.2 输出UDP数据报校验和的计算    1082
33.14 UDP的输出:sendmsg系统调用    1082
33.14.1 udp_sendmsg()    1083
33.14.2 udp_push_pending_frames()    1090
33.15 UDP的输入    1092
33.15.1 UDP接收的入口:udp_rcv()    1092
33.15.2 UDP组播数据报输入:__udp4_lib_mcast_deliver()    1096
33.15.3 udp_queue_rcv_skb()    1097
33.16 recvmsg系统调用的实现    1099
33.17 UDP的差错处理:udp_err()    1103
33.18 轻量级UDP    1105  


文章来源CU社区:基于2.6.20版本的《Linux内核源码剖析--TCP/IP实现》


相关文章