内容简介
第1篇 Linux网络开发基础
第1章 Linux操作系统概述
1.1 Linux发展历史
1.1.1 Linux的诞生和发展
1.1.2 Linux名称的由来
1.2 Linux的发展要素
1.2.1 UNIX操作系统
1.2.2 Minix操作系统
1.2.3 POSIX标准
1.3 Linux与UNIX的异同
1.4操作系统类型选择和内核版本的选择
1.4.1常见的不同公司发行的Linux异同
1.4.2内核版本的选择
1.5 Linux的系统架构
1.5.1 Linux内核的主要模块
1.5.2 Linux的文件结构
1.6 GNU通用公共许可证
1.6.1 GPL许可证的历史
1.6.2 GPL的自由理念
1.6.3 GPL的基本条款
1.6.4关于GPL许可证的争议
1.7 Linux软件开发的可借鉴之处
1.8小结
第2章 Linux编程环境
2.1 Linux环境下的编辑器
2.1.1 Vim使用简介
2.1.2使用Vim建立文件
2.1.3使用Vim编辑文本
2.1.4 Vim的格式设置
2.1.5 Vim配置文件.vimrc
2.1.6使用其他编辑器
2.2 Linux下的GCC编译器工具集
2.2.1 GCC简介
2.2.2编译程序的基本知识
2.2.3单个文件编译成执行文件
2.2.4编译生成目标文件
2.2.5多文件编译
2.2.6预处理
2.2.7编译成汇编语言
2.2.8生成和使用静态链接库
2.2.9生成动态链接库
2.2.10动态加载库
2.2.11 GCC常用选项
2.2.12编译环境的搭建
2.3 Makefile文件简介
2.3.1一个多文件的工程例子
2.3.2多文件工程的编译
2.3.3 Makefile的规则
2.3.4 Makefile中使用变量
2.3.5搜索路径
2.3.6自动推导规则
2.3.7递归make
2.3.8 Makefile中的函数
2.4用GDB调试程序
2.4.1编译可调试程序
2.4.2使用GDB调试程序
2.4.3 GDB常用命令
2.4.4其他的GDB
2.5小结
第3章 文件系统简介
3.1 Linux下的文件系统
3.1.1 Linux下文件的内涵
3.1.2文件系统的创建
3.1.3挂接文件系统
3.1.4索引节点inode
3.1.5普通文件
3.1.6设备文件
3.1.7虚拟文件系统VFS
3.2文件的通用操作方法
3.2.1文件描述符
6.4 NFS协议和服务
6.4.1安装NFS服务器和客户端
6.4.2服务器端的设定
6.4.3客户端的操作
6.4.4 showmount命令
6.5自定义网络服务
6.5.1 xinetd/inetd
6.5.2 xinetd服务配置
6.5.3自定义网络服务
6.6小结
第7章 TCP网络编程基础
7.1套接字编程基础知识
7.1.1套接字地址结构
7.1.2用户层和内核层交互过程
7.2 TCP网络编程流程
7.2.1 TCP网络编程架构
7.2.2创建网络插口函数socket()
7.2.3绑定一个地址端口对函数bind()
7.2.4监听本地端口listen
7.2.5接受一个网络请求函数accept()
7.2.6连接目标网络服务器函数connect()
7.2.7写入数据函数write()
7.2.8读取数据函数read()
7.2.9关闭套接字函数
7.3服务器/客户端的简单例子
7.3.1例子功能描述
7.3.2服务器网络程序
7.3.3服务器读取和显示字符串
7.3.4客户端的网络程序
7.3.5客户端读取和显示字符串
7.3.6编译运行程序
7.4截取信号的例子
7.4.1信号处理
7.4.2信号SIGPIPE
7.4.3信号SIGINT
7.5小结
第8章 服务器和客户端信息的获取
8.1字节序
8.1.1大端字节序和小端字节序
8.1.2字节序转换函数
8.1.3一个字节序转换的例子
8.2字符串IP地址和二进制IP地址的转换
8.2.1 inet_xxx()函数
8.2.2 inet_pton()和inet_ntop()函数
8.2.3使用8.2.1节地址转换函数的例子
8.2.4使用函数inet_ton()和函数inet_ntop()的例子
8.3套接字描述符判定函数issockettype()
8.3.1进行文件描述符判定的函数issockettype()
8.3.2 main()函数
8.4 IP地址与域名之间的相互转换
8.4.1 DNS原理
8.4.2获取主机信息的函数
8.4.3使用主机名获取主机信息的例子
8.4.4函数gethostbyname()不可重入的例子
8.5协议名称处理函数
8.5.1 xxxprotoxxx()函数
8.5.2使用协议族函数的例子
8.6小结
第9章 数据的IO和复用
9.1 IO函数
9.1.1使用recv()函数接收数据
9.1.2使用send()函数发送数据
9.1.3使用readv()函数接收数据
9.1.4使用writev()函数发送数据
9.1.5使用recvmsg()函数接收数据
9.1.6使用sendmsg()函数发送数据
9.1.7IO函数的比较
9.2使用IO函数的例子
9.2.1客户端处理框架的例子
9.2.2服务器端程序框架
9.2.3使用recv()和send()函数
9.2.4使用readv()和write()函数
9.2.5使用recvmsg()和sendmsg()函数
9.3 IO模型
9.3.1阻塞IO模型
9.3.2非阻塞IO模型
9.3.3 IO复用
9.3.4信号驱动IO模型
9.3.5异步IO模型
9.4 select()函数和pselect()函数
9.4.1 select()函数
9.4.2 pselect()函数
9.5 poll()函数和ppoll()函数
9.5.1 poll()函数
9.5.2 ppoll()函数
9.6非阻塞编程
9.6.1非阻塞方式程序设计介绍
9.6.2非阻塞程序设计的例子
9.7小结
第10章 基于UDP协议的接收和发送
10.1 UDP编程框架
10.1.1 UDP编程框图
10.1.2 UDP服务器编程框架
10.1.3 UDP客户端编程框架
10.2 UDP协议程序设计的常用函数
10.2.1建立套接字socket()和绑定套接字bind()
10.2.2接收数据recvfrom()/recv()
10.2.3发送数据sendto()/send()
10.3 UDP接收和发送数据的例子
10.3.1 UDP服务器端
10.3.2 UDP服务器端数据处理
10.3.3 UDP客户端
10.3.4 UDP客户端数据处理
10.3.5测试UDP程序
10.4 UDP协议程序设计中的几个问题
10.4.1 UDP报文丢失数据
10.4.2 UDP数据发送中的乱序
10.4.3 UDP协议中的connect()函数
10.4.4 UDP缺乏流量控制
10.4.5 UDP协议中的外出网络接口
10.4.6 UDP协议中的数据报文截断
10.5小结
第11章 高级套接字
11.1 UNIX域函数
11.1.1 UNIX域函数的地址结构
11.1.2套接字函数
11.1.3使用UNIX域函数进行套接字编程
11.1.4传递文件描述符
11.1.5 socketpair()函数
11.1.6传递文件描述符的例子
11.2广播
11.2.1广播的IP地址
11.2.2广播与单播的比较
11.2.3广播的示例
11.3多播
11.3.1多播的概念
11.3.2广域网的多播
11.3.3多播的编程
11.3.4内核中的多播
11.3.5一个多播例子的服务器端
11.3.6一个多播例子的客户端
11.4数据链路层访问
11.4.1 SOCK_PACKET类型
11.4.2设置套接口以捕获链路帧的编程方法
11.4.3从套接口读取链路帧的编程方法
11.4.4定位IP包头的编程方法
11.4.5定位TCP报头的编程方法
11.4.6定位UDP报头的编程方法
11.4.7定位应用层报文数据的编程方法
11.4.8使用SOCK_PACKET编写ARP请求程序的例子
11.5小结
第12章 套接字选项
12.1获取和设置套接字选项getsocketopt()/setsocketopt()
12.1.1 getsockopt()函数和setsocketopt()函数的介绍
12.1.2套接字选项
12.1.3套接字选项简单示例
12.2 SOL_SOCKET协议族选项
12.2.1 SO_BROADCAST广播选项
12.2.2 SO_DEBUG调试选项
12.2.3 SO_DONTROUTE不经过路由选项
12.2.4 SO_ERROR错误选项
12.2.5 SO_KEEPALIVE保持连接选项
12.2.6 SO_LINGER缓冲区处理方式选项
12.2.7 SO_OOBINLINE带外数据处理方式选项
12.2.8 SO_RCVBUF和SO_SNDBUF缓冲区大小选项
12.2.9 SO_RCVLOWAT和SO_SNDLOWAT缓冲区下限选项
12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收发超时选项
12.2.11 SO_REUSERADDR地址重用选项
12.2.12 SO_EXCLUSIVEADDRUSE端口独占选项
12.2.13 SO_TYPE套接字类型选项
12.2.14 SO_BSDCOMPAT与BSD套接字兼容选项
12.2.15 SO_BINDTODEVICE套接字网络接口绑定选项
12.2.16 SO_PRIORITY套接字优先级选项
12.3 IPPROTO_IP选项
12.3.1 IP_HDRINCL选项
12.3.2 IP_OPTNIOS选项
12.3.3 IP_TOS选项
12.3.4 IP_TTL选项
12.4 IPPROTO_TCP选项
12.4.1 TCP_KEEPALIVE选项
12.4.2 TCP_MAXRT选项
12.4.3 TCP_MAXSEG选项
12.4.4 TCP_NODELAY和TCP_CORK选项
12.5使用套接字选项
12.5.1设置和获取缓冲区大小
12.5.2获取套接字类型的例子
12.5.3使用套接字选项的综合例子
12.6 ioctl()函数
12.6.1 ioctl()函数的命令选项
12.6.2 ioctl()函数的IO请求
12.6.3 ioctl()函数的文件请求
12.6.4 ioctl()函数的网络接口请求
12.6.5使用ioctl()函数对ARP高速缓存操作
12.6.6使用ioctl()函数发送路由表请求
12.7 fcntl()函数
12.7.1 fcntl()函数的选项
12.7.2使用fcntl()函数修改套接字非阻塞属性
12.7.3使用fcntl()函数设置信号属主
12.8小结
第13章 原始套接字
13.1概述
13.2原始套接字的创建
13.2.1 SOCK_RAW选项
13.2.2 IP_HDRINCL套接字选项
13.2.3不需要bind()函数
13.3原始套接字发送报文
13.4原始套接字接收报文
13.5原始套接字报文处理时的结构
13.5.1 IP头部的结构
13.5.2 ICMP头部结构
13.5.3 UDP头部结构
13.5.4 TCP头部结构
13.6 ping的例子
13.6.1协议格式
13.6.2校验和函数
13.6.3设置ICMP发送报文的头部
13.6.4剥离ICMP接受报文的头部
13.6.5计算时间差
13.6.6发送报文
13.6.7接收报文
13.6.8主函数过程
13.6.9主函数main()
13.6.10编译测试
13.7洪水攻击
13.8 ICMP洪水攻击
13.8.1 ICMP洪水攻击的原理
13.8.2 ICMP洪水攻击的例子
13.9 UDP洪水攻击
13.10 SYN洪水攻击
13.10.1 SYN洪水攻击的原理
13.10.2 SYN洪水攻击的例子
13.11小结
第14章 服务器模型选择
14.1循环服务器
14.1.1 UDP循环服务器
14.1.2 TCP循环服务器
14.2简单并发服务器
14.2.1并发服务器的模型
14.2.2 UDP并发服务器
14.2.3 TCP并发服务器
14.3 TCP的高级并发服务器模型
14.3.1单客户端单进程,统一accept()
14.3.2单客户端单线程,统一accept()
14.3.3单客户端单线程,各线程独自accept(),使用互斥锁
14.4 1O复用循环服务器
14.4.1 IO复用循环服务器模型介绍
14.4.2 IO复用循环服务器模型的例子
14.5小结
第15章 IPv6简介
15.1 IPv4的缺陷
15.2 IPv6的特点
15.3 IPv6的地址
15.3.1 IPv6的单播地址
15.3.2可聚集全球单播地址
15.3.3本地使用单播地址
15.3.4兼容性地址
15.3.5 IPv6多播地址
15.3.6 IPv6任播地址
15.3.7主机的多个IPv6地址
15.4 IPv6的头部
15.4.1 IPv6头部格式
15.4.2与IPv4头部的对比
15.4.3 IPv6的TCP头部
15.4.4 IPv6的UDP头部
15.4.5 IPv6的ICMP头部
15.5 IPv6运行环境
15.5.1加载IPv6模块
15.5.2查看是否支持IPv6
15.6 IPv6的结构定义
15.6.1 IPv6的地址族和协议族
15.6.2套接字地址结构
15.6.3地址兼容考虑
15.6.4 IPv6通用地址
15.7 IPv6的套接字函数
15.7.1 socket()函数
15.7.2没有发生改变的函数
15.7.3发生改变的函数
15.8 IPv6的套接字选项
15.8.1 IPv6的套接字选项
15.8.2单播跳限IPV6_UNICAST_HOPS
15.8.3发送和接收多播包
15.8.4 IPv6中获得时间戳的ioctl命令
15.9 IPv6的库函数
15.9.1地址转换函数的差异
15.9.2域名解析函数的差异
15.9.3测试宏
15.10 IPv6的编程的一个简单例子
15.10.1服务器程序
15.10.2客户端程序
15.10.3编译调试
15.11小结
第3篇 Linux内核网络编程
第16章 Linux内核中网络部分结构以及分布
16.1概述
16.1.1代码目录分布
16.1.2内核中网络部分流程简介
16.1.3系统提供修改网络流程点
16.1.4 sk_buff结构
16.1.5网络协议数据结构inet_protosw
16.2软中断CPU报文队列及其处理
16.2.1 Linux内核网络协议层的层间传递手段——软中断
16.2.2网络收发处理软中断的实现机制
16.3 socket数据如何在内核中接收和发送
16.3.1 socket()的初始化
16.3.2接收网络数据recv()
16.3.3发送网络数据send()
16.4小结
第17章 netfilter框架内报文处理
17.1 netfilter
17.1.1 netfilter简介
17.1.2 netfilter框架
17.1.3 netfilter检查时的表格
17.1.4 netfilter的规则
17.2 iptables和netfilter
17.2.1 iptables简介
17.2.2 iptables的表和链
17.2.3使用iptables设置过滤规则
17.3内核模块编程
17.3.1内核“Hello World!”程序
17.3.2内核模块的基本架构
17.3.3内核模块加载和卸载过程
17.3.4内核模块初始化和清理函数
17.3.5内核模块初始化和清理过程的容错处理
17.3.6内核模块编译所需的Makefile
17.4 5个钩子点
17.4.1 netfilter的5个钩子点
17.4.2 NF_HOOK宏
17.4.3钩子的处理规则
17.5注册/注销钩子
17.5.1结构nf_hook_ops
17.5.2注册钩子
17.5.3注销钩子
17.5.4注册注销函数
17.6钩子的简单处理例子
17.6.1功能描述
17.6.2需求分析
17.6.3 ping回显屏蔽实现
17.6.4禁止向目的IP地址发送数据的实现
17.6.5端口关闭实现
17.6.6动态配置实现
17.6.7可加载内核实现代码
17.6.8应用层测试代码实现
17.6.9编译运行
17.7一点多个钩子的优先级
17.8校验和问题
17.9小结
第4篇 综合案例
第18章 一个简单Web服务器的例子SHTTPD
18.1 SHTTPD的需求分析
18.1.1 SHTTPD启动参数可动态配置的需求
18.1.2 SHTTPD的多客户端支持的需求
18.1.3 SHTTPD支持方法的需求
18.1.4 SHTTPD支持的HTTP协议版本的需求
18.1.5 SHTTPD支持头部的需求
18.1.6 SHTTPD定位URI的需求
18.1.7 SHTTPD支持CGI的需求
18.1.8 SHTTPD错误代码的需求
18.2 SHTTPD的模块分析和设计
18.2.1 SHTTPD的主函数
18.2.2 SHTTPD命令行解析的分析设计
18.2.3 SHTTPD配置文件解析的分析设计
18.2.4 SHTTPD的多客户端支持的分析设计
18.2.5 SHTTPD头部解析的分析设计
18.2.6 SHTTPD对URI的分析设计
18.2.7 SHTTPD支持方法的分析设计
18.2.8 SHTTPD支持CGI的分析设计
18.2.9 SHTTPD错误处理的分析设计
18.3 SHTTPD各模块的实现
18.3.1 SHTTPD命令行解析的实现
18.3.2 SHTTPD文件配置解析的实现
18.3.3 SHTTPD的多客户端支持的实现
18.3.4 SHTTPD所请求URI解析的实现
18.3.5 SHTTPD方法解析的实现
18.3.6 SHTTPD响应方法的实现
18.3.7 SHTTPD支持CGI的实现
18.3.8 SHTTPD支持HTTP协议版本的实现
18.3.9 SHTTPD内容类型的实现
18.3.10 SHTTPD错误处理的实现
18.3.11 SHTTPD生成目录下文件列表文件的实现
18.3.12 SHTTPD主函数的实现
18.4 SHTTPD的编译、调试和测试
18.4.1建立源文件
18.4.2制作Makefile
18.4.3制作执行文件
18.4.4使用不同的浏览器测试服务器程序
18.5小结
第19章 一个简单网络协议栈的例子SIP
19.1 SIP网络协议栈的功能描述
19.1.1 SIP网络协议栈的基本功能描述
19.1.2 SIP网络协议栈的分层功能描述
19.1.3 SIP网络协议栈的用户接口功能描述
19.2 SIP网络协议栈的架构
19.3 SIP网络协议栈的存储区缓存
19.3.1 SIP存储缓冲的结构定义
19.3.2 SIP存储缓冲的处理函数
19.4 SIP网络协议栈的网络接口层
19.4.1 SIP网络接口层的架构
19.4.2 SIP网络接口层的数据结构
19.4.3 SIP网络接口层的初始化函数
19.4.4 SIP网络接口层的输入函数
19.4.5 SIP网络接口层的输出函数
19.5 SIP网络协议栈的ARP层
19.5.1 SIP地址解析层的架构
19.5.2 SIP地址解析层的数据结构
19.5.3 SIP地址解析层的映射表
19.5.4 SIP地址解析层的ARP映射表维护函数
19.5.5 SIP地址解析层的ARP网络报文构建函数
19.5.6 SIP地址解析层的ARP网络报文收发处理函数
19.6 SIP网络协议栈的IP层
19.6.1 SIP网际协议层的架构
19.6.2 SIP网际协议层的数据结构
19.6.3 SIP网际协议层的输入函数
19.6.4 SIP网际协议层的输出函数
19.6.5 SIP网际协议层的分片函数
19.6.6 SIP网际协议层的分片组装函数
19.7 SIP网络协议栈的ICMP层
19.7.1 SIP控制报文协议的数据结构
19.7.2 SIP控制报文协议的协议支持
19.7.3 SIP控制报文协议的输入函数
19.7.4 SIP控制报文协议的回显应答函数
19.8 SIP网络协议栈的UDP层
19.8.1 SIP数据报文层的数据结构
19.8.2 SIP数据报文层的控制单元
19.8.3 SIP数据报文层的输入函数
19.8.4 SIP数据报文层的输出函数
19.8.5 SIP数据报文层的建立函数
19.8.6 SIP数据报文层的释放函数
19.8.7 SIP数据报文层的绑定函数
19.8.8 SIP数据报文层的发送数据函数
19.8.9 SIP数据报文层的校验和计算
19.9 SIP网络协议栈的协议无关层
19.9.1 SIP协议无关层的系统架构
19.9.2 SIP协议无关层的函数形式
19.9.3 SIP协议无关层的接收数据函数
19.10 SIP网络协议栈的BSD接口层
19.10.1 SIP用户接口层的架构
19.10.2 SIP用户接口层的套接字建立函数
19.10.3 SIP用户接口层的套接字关闭函数
19.10.4 SIP用户接口层的套接字绑定函数
19.10.5 SIP用户接口层的套接字连接函数
19.10.6 SIP用户接口层的套接字接收数据函数
19.10.7 SIP用户接口层的发送数据函数
19.11 SIP网络协议栈的编译
19.11.1 SIP的文件结构
19.11.2 SIP的Makefile
19.11.3 SIP的编译运行
19.12小结
第20章 一个简单防火墙的例子SIPFW
20.1 SIPFW防火墙的功能描述
20.1.1 SIPFW防火墙对主机进行网络数据过滤的功能描述
20.1.2 SIPFW防火墙用户设置防火墙规则的功能描述
20.1.3 SIPFW防火墙配置文件等附加功能的功能描述
20.2 SIPFW需求分析
20.2.1 SIPFW防火墙条件和动作
20.2.2 SIPFW防火墙支持过滤的类型和内容
20.2.3 SIPFW防火墙过滤的方式和动作
20.2.4 SIPFW防火墙的配置文件
20.2.5 SIPFW防火墙命令行配置格式
20.2.6 SIPFW防火墙的规则文件格式
20.2.7 SIPFW防火墙的日志文件数据格式
20.2.8 SIPFW防火墙构建所采用的技术方案
20.3使用netlink进行用户空间和内核空间数据交互
20.3.1 netlink的用户空间程序设计
20.3.2 netlink的内核空间API
20.4使用proc进行内存数据用户空间映射
20.4.1 proc虚拟文件系统的结构
20.4.2创建proc虚拟文件
20.4.3删除proc虚拟文件
20.4.4 proc文件的写函数
20.4.5 proc文件的读函数
20.5内核空间的文件操作函数
20.5.1内核空间的文件结构
20.5.2内核空间的文件建立操作
20.5.3内核空间的文件读写操作
20.5.4内核空间的文件关闭操作
20.6 SIPFW防火墙的模块分析和设计
20.6.1 SIPFW防火墙的总体架构
20.6.2 SIPFW防火墙的用户命令解析
20.6.3 SIPFW用户空间与内核空间的交互
20.6.4 SIPFW防火墙内核链上的规则处理
20.6.5 SIPFW防火墙的PROC虚拟文件系统
20.6.6 SIPFW防火墙的配置文件和日志文件处理
20.6.7 SIPFW防火墙的过滤模块设计
20.7 SIPFW防火墙各功能模块的实现
20.7.1 SIPFW防火墙的命令解析代码
20.7.2 SIPFW防火墙的过滤规则解析模块代码
20.7.3 SIPFW防火墙的网络数据拦截模块代码
20.7.4 SIPFW防火墙的PROC虚拟文件系统
20.7.5 SIPFW防火墙对配置文件的解析
20.7.6 SIPFW防火墙内核模块初始化和退出
20.7.7用户空间处理主函数
20.8编译、调试和测试
20.8.1用户程序和内核程序的Makefile
20.8.2编译及运行
20.8.3下发过滤规则,测试过滤结果
20.9小结