Linux kernel tcp 连接建立详解——由listen系统调用的backlog参数引发的长篇大论

本文主要是介绍Linux kernel tcp 连接建立详解——由listen系统调用的backlog参数引发的长篇大论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

全文的pdf从这里下载。img_e25d4fb2f8de1caf41a735ec53088516.pnglisten_backlog.pdf

再来个流程图。img_e25d4fb2f8de1caf41a735ec53088516.pngtcp连接建立流程图.pdf


Linux kernel 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.1 client/server程序结构 13

2.2 serverlisten()系统调用 13

2.3 clientconnect()系统调用 19

2.4 server端处理SYN 23

2.5 client端处理SYN/ACK 32

2.6 server端处理ACK 34

3accept()系统调用分析 42

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

3.2 连接请求的生命周期 47

4listen()系统调用的参数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章中的程序行为全部理解,那么恭喜你,完全可以略过本文。

这篇关于Linux kernel tcp 连接建立详解——由listen系统调用的backlog参数引发的长篇大论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/539578

相关文章

Linux磁盘分区、格式化和挂载方式

《Linux磁盘分区、格式化和挂载方式》本文详细介绍了Linux系统中磁盘分区、格式化和挂载的基本操作步骤和命令,包括MBR和GPT分区表的区别、fdisk和gdisk命令的使用、常见的文件系统格式以... 目录一、磁盘分区表分类二、fdisk命令创建分区1、交互式的命令2、分区主分区3、创建扩展分区,然后

Linux中chmod权限设置方式

《Linux中chmod权限设置方式》本文介绍了Linux系统中文件和目录权限的设置方法,包括chmod、chown和chgrp命令的使用,以及权限模式和符号模式的详细说明,通过这些命令,用户可以灵活... 目录设置基本权限命令:chmod1、权限介绍2、chmod命令常见用法和示例3、文件权限详解4、ch

Java调用Python代码的几种方法小结

《Java调用Python代码的几种方法小结》Python语言有丰富的系统管理、数据处理、统计类软件包,因此从java应用中调用Python代码的需求很常见、实用,本文介绍几种方法从java调用Pyt... 目录引言Java core使用ProcessBuilder使用Java脚本引擎总结引言python

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Linux内核之内核裁剪详解

《Linux内核之内核裁剪详解》Linux内核裁剪是通过移除不必要的功能和模块,调整配置参数来优化内核,以满足特定需求,裁剪的方法包括使用配置选项、模块化设计和优化配置参数,图形裁剪工具如makeme... 目录简介一、 裁剪的原因二、裁剪的方法三、图形裁剪工具四、操作说明五、make menuconfig

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

详解Java中的敏感信息处理

《详解Java中的敏感信息处理》平时开发中常常会遇到像用户的手机号、姓名、身份证等敏感信息需要处理,这篇文章主要为大家整理了一些常用的方法,希望对大家有所帮助... 目录前后端传输AES 对称加密RSA 非对称加密混合加密数据库加密MD5 + Salt/SHA + SaltAES 加密平时开发中遇到像用户的

什么是cron? Linux系统下Cron定时任务使用指南

《什么是cron?Linux系统下Cron定时任务使用指南》在日常的Linux系统管理和维护中,定时执行任务是非常常见的需求,你可能需要每天执行备份任务、清理系统日志或运行特定的脚本,而不想每天... 在管理 linux 服务器的过程中,总有一些任务需要我们定期或重复执行。就比如备份任务,通常会选在服务器资

Springboot使用RabbitMQ实现关闭超时订单(示例详解)

《Springboot使用RabbitMQ实现关闭超时订单(示例详解)》介绍了如何在SpringBoot项目中使用RabbitMQ实现订单的延时处理和超时关闭,通过配置RabbitMQ的交换机、队列和... 目录1.maven中引入rabbitmq的依赖:2.application.yml中进行rabbit