全文的pdf从这里下载。listen_backlog.pdf
再来个流程图。tcp连接建立流程图.pdf
Linux kernel tcp 连接建立详解
——由listen系统调用的backlog参数引发的长篇大论
目录
Linux kernel tcp 连接建立详解 1
第0章 本文的目的 2
第1章 listen()系统调用的困惑 2
1.1 前提条件 2
1.2 分析client程序 2
1.3 分析server程序 2
1.4 第一次观察程序行为 2
1.5 第二次观察程序行为 5
1.6 第三次观察程序行为 7
1.7 略作猜测与分析 10
第2章 tcp 三次握手代码分析 11
2.1 client/server程序结构 13
2.2 server端listen()系统调用 13
2.3 client端connect()系统调用 19
2.4 server端处理SYN包 23
2.5 client端处理SYN/ACK包 32
2.6 server端处理ACK包 34
第3章 accept()系统调用分析 42
3.1 accept()系统调用的分析 42
3.2 连接请求的生命周期 47
第4章 listen()系统调用的参数backlog详解 48
4.1 listen()系统调用的参数backlog的作用 48
4.2 分析1.4节中程序的行为 49
4.3 分析1.5节中程序的行为 52
4.4 分析1.6节中程序的行为 53
4.5 backlog参数的用法 53
附录1 client.c 54
附录2 server.c 55
第0章 本文的目的
一直以来,对tcp的连接的建立过程只停留在三次握手的层面,阅读代码时发现好多逻辑流程不是很清楚。还有就是对系统调用int listen(int sockfd, int backlog)的第二个参数backlog似懂非懂。它到底是限制server端能同时处理的连接请求数量,还是限制同时建立的连接数量,还是限制等待建立连接队列的长度?
代码面前,了无秘密,关键是得探求。如果你也有同样的困惑,不妨读读本文。
我分析的是v3.12-rc4的代码,commit 0e7a3ed04f0c 。本文偏重于连接建立的函数调用过程、sock状态变化,以及backlog参数,其他的也很重要的内容,如tcp序号、拥塞控制等,但是本文从略,否则可以写本书了。并且本文只关注tcp层,IP层及以下也忽略。
第1章是简单的client/server程序,如果你对第1章中的程序行为全部理解,那么恭喜你,完全可以略过本文。