原文是openoffice写的,图片什么不太好弄,我只把目录和第一章放在这里。

全文的pdf从这里下载。Linux kernel tcp 连接建立详解——由listen系统调用的backlog参数引发的长篇大论-LMLPHPlisten_backlog.pdf

再来个流程图。Linux kernel tcp 连接建立详解——由listen系统调用的backlog参数引发的长篇大论-LMLPHPtcp连接建立流程图.pdf


Linuxkernel tcp 连接建立详解

                         ——listen系统调用的backlog参数引发的长篇大论


目录

Linux kernel tcp 连接建立详解 1

0章本文的目的 2

1listen()系统调用的困惑 2

1.1 前提条件 2

1.2 分析client程序 2

1.3 分析server程序 2

1.4 第一次观察程序行为 2

1.5 第二次观察程序行为 5

1.6 第三次观察程序行为 7

1.7 略作猜测与分析 10

2tcp 三次握手代码分析 11

2.1client/server程序结构 13

2.2serverlisten()系统调用 13

2.3clientconnect()系统调用 19

2.4server端处理SYN 23

2.5client端处理SYN/ACK 32

2.6server端处理ACK 34

3accept()系统调用分析 42

3.1accept()系统调用的分析 42

3.2 连接请求的生命周期 47

4listen()系统调用的参数backlog详解 48

4.1listen()系统调用的参数backlog的作用 48

4.2 分析1.4节中程序的行为 49

4.3 分析1.5节中程序的行为 52

4.4 分析1.6节中程序的行为 53

4.5backlog参数的用法 53

附录1client.c54

附录2server.c55

0章本文的目的

一直以来,对tcp的连接的建立过程只停留在三次握手的层面,阅读代码时发现好多逻辑流程不是很清楚。还有就是对系统调用intlisten(int sockfd, intbacklog)的第二个参数backlog似懂非懂。它到底是限制server端能同时处理的连接请求数量,还是限制同时建立的连接数量,还是限制等待建立连接队列的长度?

代码面前,了无秘密,关键是得探求。如果你也有同样的困惑,不妨读读本文。

我分析的是v3.12-rc4的代码,commit0e7a3ed04f0c 。本文偏重于连接建立的函数调用过程、sock状态变化,以及backlog参数,其他的也很重要的内容,如tcp序号、拥塞控制等,但是本文从略,否则可以写本书了。并且本文只关注tcp层,IP层及以下也忽略。

1章是简单的client/server程序,如果你对第1章中的程序行为全部理解,那么恭喜你,完全可以略过本文。

11-06 07:38