内容简介
《追踪Linux TCP/IP代码运行·基于2.6内核》以应用程序为线索,详细描述了数据包在协议栈的分段、重组、发送、接收过程,同时分析了路由的初始化和设置过程,主要包括socket应用程序、TCP/IP协议、路由、通知链、邻居子系统等内容。全书涵盖了协议栈的全部知识点,对于广大的读者来说这是一本极其难得的技术资料。同时,书中论述了网络设备的工作原理,解释了RTL8169和嵌入式CS8900、DM9000网卡设备的核心过程。
《追踪Linux TCP/IP代码运行·基于2.6内核》可作为3G网络开发人员、嵌入式通信产品开发人员、网络应用开发人员、网络管理人员及网络爱好者、从事网络方向的本科生、研究生的参考书。
目录
第1章 本书的计划
1.1 基本路线和要求
技术要点:分析路线服务器程序学习要求
1.2 TCP/IP协议层的划分与基本知识
技术要点:协议层知识服务器与客户端的通信路线
1.3 函数到系统调用的过程
技术要点:库函数的真实定义系统调用的总入口及传值
1.4 网络文件系统
技术要点:网络文件系统的特点initcall机制网络文件系统的安装
第2章 socket的创建
2.1 本章几个重要数据结构
技术要点:socket结构、sock结构、sk_buff结构、tcp_sock结构的定义
2.2 分配并初始化socket结构
技术要点:分配socket结构空间分配文件节点
2.3 使用协议族的函数表初始化socket
技术要点:登记函数表定义、注册及初始化协议族结构
2.4 分配并初始化sock结构
技术要点:分配结构空间初始化sock结构及数据包队列头
2.5 TCP协议对sock结构初始化
技术要点:TCP协议的初始化函数tcp_sock等结构的关联
2.6 socket与文件系统的关联
技术要点:分配文件指针和文件号指定文件操作表
第3章 socket地址设置
3.1 地址设置接口
技术要点:地址设置过程查找socket和文件指针复制数据到内核
3.2 地址结构定义
技术要点:结构的定义及赋值协议族的设置函数网络空间结构
3.3 地址类型
技术要点:地址类型的概念 查验地址类型获取路由函数表
3.4 设置地址和端口
技术要点:地址与端口的队列结构地址与端口的查找与建立
3.5 网络空间总管initernet
技术要点:init_net结构的初始化 队列头的初始化
第4章 路由
4.1 路由函数表结构及关系图
技术要点:fib_table结构、fn_zone结构、fib_node结构及fib_info结构的关系
4.2 路由函数表的初始化
技术要点:路由表队列、路由函数表队列的初始化路由规则结构、路由函数表结构、路由区结构的定义子网掩码的作用
4.3 通过路由函数表查找路由信息
技术要点:路由区及路由节点的匹配和查找路由信息、路由跳转结构的查找
4.4 路由的设置及相关结构的初如化
技术要点:设置路由的三条路线路由配置结构的定义路由区的建立路由信息的创建和调整队列节点的链入与摘除路由跳转结构的初始化路由函数表的查找
路由别名结构的建立路由表的冲刷与释放
4.5 基于输出方向的路由表查找与创建
技术要点:路由键值结构的定义路由表结构的定义路由表队列的轮询路由表的创建与查找
4.6 基于输入方向的路由表查找与创建
技术要点:为数据包查找路由表创建转发的路由表
第5章 通知链
5.1 设备通知链节点的挂入
技术要点:通知链节点结构的定义设备配置结构的定义设备通知链的建立
5.2 地址通知链节点的挂入
技术要点:地址通知链的定义和链入
5.3 通知链的调用和执行
技术要点:网络设备结构的登记注册通知节点函数的调用
第6章 netlink概述
6.1 netlink的创建
技术要点:netlink的sock结构定义及初始化
6.2 注册路由的netlink
技术要点:路由的netlink结构定义及注册
6.3 通过netlink通信
技术要点:netlink的信息结构、消息头结构、路由消息结构的定义及初始化netlink数据包的建立及发送
第7章 监听连接请求
7.1 内核的监听函数
技术要点:协议族监听函数的调用连接数的控制监听结构的建立及定义连接请求结构及队列
7.2 内核的监听队列
技术要点:监听队列的链入过程监听队列的睡眠等待和唤醒
第8章 接收连接请求
8.1 接收连接函数
技术要点:协议族接收函数的调用定时等待连接请求
8.2 异步接收方式
技术要点:异步接收实例异步唤醒路线查询客户端sock结构和连接请求结构
8.3 获取连接请求
技术要点:客户端socket、sock结构的对接获取客户端的地址INET协议族结构的定义
第9章 准备连接请求
9.1 内核的连接函数
技术要点:客户端程序及服务器程序的通信效果协议族连接函数的调用源路由的分类和查找TCP协议的socket结构定义端口的查找与复用SYN数据包的建立路由项结构的定义MTU、MSS的作用及设置滑动窗口的初始化
9.2 分配数据包结构和数据块空间
技术要点:创建并初始化数据包共享结构的定义及数据块的分类TCP的控制结构发送队列的链入和计数数据包的结构示意图
9.3 构建、发送TCP数据包
技术要点:TCP头部的定义TCP层的发送过程克隆数据包的建立重发数据包的依据拥塞报告的建立
9.4 进化成IP数据包
技术要点:IP层的发送过程IP选项的定义IP头部的定义及初始化ID编号的生成和设置链路层头部缓存结构的定义邻居子系统的发送函数
9.5 进化成以太网数据包
技术要点:链
试读
1.本书的主要特点
本书以socket应用过程为路线,以函数调用为线索,按照代码的执行线路将整个网络的组织和架构串联成一个整体,这是本书的最大特色。
知识点模块化是本书的另一个特点,全部的知识点被分布到各个章节结合实际场景叙述,有时在函数的过程中登台亮相,也有时随着代码的剖析赫然而出,这种灵活的安排加强了阅读的流畅性。
2.socket的概念与意义
socket这个单词是插座的意思,但是在计算机领域中有时称为插口,也有时称为套接字;无论什么称谓其作用是不变的,它是应用程序在网络通信中的桥梁与纽带。
举一个电话通信的例子,在这个例子中用客户与服务商通电话的过程来说明socket的含义与作用。客户需要打电话给服务商,因此例子中有2部电话就好比2个socket进程,电话号码是它们的socket地址,客户的电话相当于客户端socket;同理,服务商的电话相当于服务器的socket。
现在客户拿起电话开始拔打服务商的电话号码,相当于客户端socket向服务器socket发出连接请求;服务商如果此时正好空闲就可以接听电话,相当于服务器socket在等待连接请求,电话铃响起说明服务器soeket已经接收到了连接请求,此时服务商拿起电话后双方就可以正式通话了,相当于客户端与服务器的socket连接成功;通话过程中客户的声音被传送到服务商的电话中,相当于客户端socket发送数据而服务器socket接收数据;通话完成后,挂起电话则相当于关闭客户端的socket和服务器的socket。
前言/序言
学习过TCP/IP协议的读者可能会感觉面对长篇大论的一堆文字往往不知道从何入手,甚至很多读者在认真阅读之后也无法领会协议的作用,更无法进入内核的协议栈阅读代码,以至于无法从事网络方面的开发与维护。然而,高速发展的网络时代要求技术人员必须快速掌握和运用协议的知识,那么有没有一种有效的方法可以帮助我们实现这一目标呢?相信读者可以在本书中找到答案。
理论的学习固然是基础,但是不一定具备了理论才开始阅读代码,就像以往大家只采取背单词、记语法的方式学英语,结果十几年之后仍然不会说英语,不会用英语;因为这种英语教学方法只停留在理论层上,现代的英语教学则打破了以理论为主线的学习方法,从应用性和实用性出发,极大改变了学习的效果。因此,本书借鉴现代英语的学习模式,选择从实际应用出发,以应用程序为主线进入Linux内核,通过应用程序的工作过程层层解析内核的协议栈,揭示协议栈的工作路线及网络的真实过程,帮助读者彻底掌握协议栈,使其在阅读完本书之后有一种登上泰山顶峰的兴奋之情。目前,市场针对Linux网络的讲解书籍已经很多,但内容基本都是对理论的泛泛而谈,有的书籍缺少主线,有的书籍缺少与实际应用的结合,有的书籍采用的内核版本过于陈旧,这些问题加大了阅读的难度,导致很多读者使用“压箱子底”的办法放弃了学习。相反,本书克服了上述问题,并且在描述每一个关键过程时,采取穿插图片和逐行解释的方式解决了这些难点。
本书针对的是2.6版本的Linux内核,对于内核的进程管理、内存管理、文件系统等内容,读者可以借鉴本书推荐书籍或者直接跳过这些内容只阅读核心部分;对于难以理解的内容可以先放一放,往往在读第二遍时就会自然而解,因为内核的知识点是互为补充的。由于内容繁多,不足之处在所难免,请读者指正。
广州工程技术职业学院冯伟老师对本书的图片编辑提供了帮助,罗燕军、杨永祥、张文盛、李华、倪巍、冯伟、刘国兵、葛德奇、朱德良、罗兵、彭海、白瑜、颜诗敏、傅海荧、李柱栋、盛晓辉、修宸、张泽荣、陈嘉顺、时安营、周丹、江均勇、杨硕、罗伟彬、李洪彬、杨春雷、付金平、缪晓及钟海文也对本书的编辑提供了支持,在此向他们的辛勤付出表示感谢。