没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Understanding Linux Kernel
version 4.4.0
TCP Protocol Part
Linux 4.4.0 内核源码分析
TCP 实现
2020 年 3 月 10 日
目录
1 准备部分 1
1.1 用户层 TCP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 探寻 tcp_prot,地图 get~ . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 RFC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3.1 RFC793 : Transmission Control Protocol . . . . . . . . . . . . . 2
1.3.2 RFC1323 : TCP Extensions for High Performance . . . . . . . . 5
1.3.3 RFC1337 : TIME-WAIT Assassination Hazards in TCP . . . . . 6
1.3.4 RFC2018 : TCP Selective Acknowledgement Options . . . . . . . 8
1.3.5 RFC2525 : Known TCP Implementation Problems . . . . . . . . 9
1.3.6 RFC3168 : The Addition of Explicit Congestion Notification (ECN)
to IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.3.7 RFC6937 : Proportional Rate Reduction for TCP . . . . . . . . 10
1.3.8 RFC7413 : TCP Fast Open(Draft) . . . . . . . . . . . . . . . . . 10
2 网络子系统相关核心数据结构 12
2.1 网络子系统数据结构架构 . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2 sock 底层数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.1 sock_common . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
2.2.2 sock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2.3 request_sock . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.4 sk_buff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.2.5 msghdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3 inet 层相关数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.1 ip_options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.3.2 inet_request_sock . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.3.3 inet_connection_sock_af_ops . . . . . . . . . . . . . . . . . . 24
2.3.4 inet_connect_sock . . . . . . . . . . . . . . . . . . . . . . . . . 25
i
2.3.5 inet_timewait_sock . . . . . . . . . . . . . . . . . . . . . . . . 26
2.3.6 sockaddr & sockaddr_in . . . . . . . . . . . . . . . . . . . . . . 27
2.3.7 ip_options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
2.4 路由相关数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.4.1 dst_entry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
2.4.2 rtable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
2.4.3 flowi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5 TCP 层相关数据结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.1 tcphdr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
2.5.2 tcp_options_received . . . . . . . . . . . . . . . . . . . . . . . 32
2.5.3 tcp_sacktag_state . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.4 tcp_sock . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
2.5.5 tcp_fastopen_cookie . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.6 tcp_fastopen_request . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.7 tcp_request_sock . . . . . . . . . . . . . . . . . . . . . . . . . . 38
2.5.8 tcp_skb_cb . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
3 TCP 输出 41
3.1 数据发送接口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.1 tcp_sendmsg . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.1.2 tcp_sendmsg_fastopen . . . . . . . . . . . . . . . . . . . . . . . 46
3.1.3 TCP Push 操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.2 输出到 IP 层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.1 tcp_write_xmit . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
3.2.2 tcp_transmit_skb . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.2.3 tcp_select_window(struct sk_buff *skb) . . . . . . . . . . . . . 54
4 TCP 输入 58
4.1 Linux 内核网络数据接收流程概览 . . . . . . . . . . . . . . . . . . . . . . 58
4.2 自底向上调用与自顶向下调用 . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.1 自底向上处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
4.2.2 自顶向下处理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
5 TCP 建立连接 77
5.1 TCP 主动打开-客户 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.1 基本流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.1.2 第一次握手:构造并发送 SYN 包 . . . . . . . . . . . . . . . . . . 77
5.1.3 第二次握手:接收 SYN+ACK 包 . . . . . . . . . . . . . . . . . . 82
5.1.4 第三次握手: 发送 ACK 包 . . . . . . . . . . . . . . . . . . . . . . 93
5.2 TCP 被动打开-服务器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
5.2.1 基本流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
ii
5.2.2 第一次握手:接受 SYN 段 . . . . . . . . . . . . . . . . . . . . . 95
5.2.3 第二次握手:发送 SYN+ACK 段 . . . . . . . . . . . . . . . . . . 103
5.2.4 第三次握手:接收 ACK 段 . . . . . . . . . . . . . . . . . . . . . 107
6 TCP 拥塞控制 113
6.1 拥塞控制实现 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1.1 拥塞控制状态机 . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
6.1.2 显式拥塞通知 (ECN) . . . . . . . . . . . . . . . . . . . . . . . . . 118
6.1.3 拥塞控制状态的处理及转换 . . . . . . . . . . . . . . . . . . . . . 120
6.2 拥塞控制引擎 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
6.2.1 接口 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
6.2.2 CUBIC 拥塞控制算法 . . . . . . . . . . . . . . . . . . . . . . . . 127
7 TCP 释放连接 138
7.1 tcp_shutdown . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
7.2 主动关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
7.2.1 第一次握手: 发送 FIN . . . . . . . . . . . . . . . . . . . . . . . . 139
7.2.2 第二次握手: 接收 ACK . . . . . . . . . . . . . . . . . . . . . . . 145
7.2.3 第三次握手: 接受 FIN . . . . . . . . . . . . . . . . . . . . . . . . 149
7.2.4 第四次握手: 发送 ACK . . . . . . . . . . . . . . . . . . . . . . . 152
7.2.5 同时关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
7.2.6 TIME_WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
7.3 被动关闭 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.3.1 基本流程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
7.3.2 第一次握手: 接收 FIN . . . . . . . . . . . . . . . . . . . . . . . . 157
7.3.3 第二次握手: 发送 FIN 的 ACK . . . . . . . . . . . . . . . . . . . 159
7.3.4 第三次握手: 发送 FIN . . . . . . . . . . . . . . . . . . . . . . . . 159
7.3.5 第四次握手: 接收 FIN 的 ACK . . . . . . . . . . . . . . . . . . . 160
8 非核心代码分析 161
8.1 BSD Socket 层 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
8.1.1 msg_flag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
8.1.2 数据报类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
8.1.3 Sock CheckSum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
8.1.4 SK Stream . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
8.1.5 sk_stream_wait_connect . . . . . . . . . . . . . . . . . . . . . . 165
8.1.6 pskb_may_pull . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
8.2 Inet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
8.2.1 __inet_stream_connect . . . . . . . . . . . . . . . . . . . . . . 167
8.2.2 inet_hash_connect && __inet_hash_connect . . . . . . . . . 169
8.2.3 inet_csk_reqsk_queue_add . . . . . . . . . . . . . . . . . . . . 171
iii
8.2.4 inet_twsk_put . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.3 TCP 相关参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
8.3.1 TCP 标志宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
8.3.2 函数宏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.4 TCP CheckSum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
8.4.1 tcp_checksum_complete . . . . . . . . . . . . . . . . . . . . . . 178
8.4.2 tcp_v4_checksum_init . . . . . . . . . . . . . . . . . . . . . . . 179
8.5 TCP Initialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
8.5.1 TCP Initialize Handle . . . . . . . . . . . . . . . . . . . . . . . . 179
8.6 TCP Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
8.6.1 TCP Options Handle . . . . . . . . . . . . . . . . . . . . . . . . . 182
8.7 TCP PAWS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
8.7.1 TCP PAWS Flags . . . . . . . . . . . . . . . . . . . . . . . . . . 188
8.7.2 tcp_paws_check . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
8.7.3 tcp_paws_reject . . . . . . . . . . . . . . . . . . . . . . . . . . 189
8.8 TCP TimeStamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
8.8.1 tcp_store_ts_recent . . . . . . . . . . . . . . . . . . . . . . . . 190
8.8.2 tcp_replace_ts_recent . . . . . . . . . . . . . . . . . . . . . . 190
8.9 TCP ACK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
8.9.1 ACK Check . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
8.9.2 ACK Update . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
8.10 TCP Window . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
8.10.1 Window Compute . . . . . . . . . . . . . . . . . . . . . . . . . . 196
8.10.2 Window Update . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
8.11 TCP Urgent Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.11.1 相应标识 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.11.2 TCP Urgent Check . . . . . . . . . . . . . . . . . . . . . . . . . . 199
8.11.3 TCP Urgent Deal . . . . . . . . . . . . . . . . . . . . . . . . . . 201
8.12 Congestion Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
8.12.1 COngestion Control Flag . . . . . . . . . . . . . . . . . . . . . . 202
8.12.2 Congestion Control Window . . . . . . . . . . . . . . . . . . . . . 202
8.12.3 Congestion Control Window Undo . . . . . . . . . . . . . . . . . 204
8.12.4 About Restransmit . . . . . . . . . . . . . . . . . . . . . . . . . . 212
8.13 TCP Finish . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
8.13.1 Time Compute . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
8.14 TCP Close . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.14.1 TCP Close Flags . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.14.2 TCP State Machine . . . . . . . . . . . . . . . . . . . . . . . . . 213
8.14.3 tcp_done . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
iv
剩余238页未读,继续阅读
资源评论
xiongmaokuaile
- 粉丝: 4
- 资源: 50
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 车辆下层控制器设计,发动机模型及逆模型,主要是将车辆加速度信号转化为对于的节气门与制动压力信号,matlab与carsim联合仿
- comsol电缆温度场仿真,电缆载流量仿真 单芯电力电缆 海底电缆载流量COMSOL仿真,电缆 海缆温度瞬态仿真模型 电磁热,电
- 三相维也纳整流器的仿真模型 控制算法采用电压和电流双闭环控制 外部电压环路为PI控制器,内部电流环路为bang bang
- 数据分析工作流程源码 MATLAB
- Python 数学计算与温度换算程序详解
- C# 中事件与委托应用示例,一个很简单的入门demo
- C++串口通信与数据移位实现方法详解.txt
- 通过GPIO控制LED灯 python语言和树莓派
- 问题汇总_C语言、数据结构.docx
- 2023-04-06-项目笔记 - 第二百七十七阶段 - 4.4.2.275全局变量的作用域-275 -2025.10.05
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功