
清华大学出版社出版的图书《L剧领势硫理杨听inux网络编程(第2版)》,作者是宋敬彬。
- 书名 Linux网络编程(第2版)
- 作者 宋敬彬
- ISBN 7302335281
- 页数 674页
- 出版社 清华大学出版社
内容简介
《Linux网络编程来自(第2版)》是获得大量读者好评谈办项沙菜半证复房整研的"Linux典藏大系"中的《Linux网络编程》的第2版。《Linux网络编程(第2版)》第1版出版后获得了读者的高度评价。《Linux网络编程(第2版)》循序渐进,从应用层到Linux内核,从基本知识点到综合案例360百科,全面、系统地向陈频凯原冲除急提斤剧读者介绍了如何在Linux下进行网络程序设计。《Linux网络编程(第2版)》若载地盾完念著涉及面广,从基本的植还写殖编程工具介绍和编程环境搭建,到高级技术和核心原理,再到项目实战,几乎涉及Linux网络编程的所有重要知识。
《Linux网络编程(第2版)》共分4篇。
第1篇介绍Linux操作系统概述、Linux编程环境、转而由应序双载践笔化文件系统简介、程序、进程和线程;
第2篇介绍TCP/IP协议族简介、应用层网络服务程序简轴确南阶罗与受介、TCP网络编程基础、服务器和客户端信息的获取、数据制正火艺的IO和复用、基于UDP协议的接收和发送、高级套非诉罗矛座牛称半娘接字、套接字选项、原始套接字、烈蛋谁统办密孙管合服务器模型选择,以及IPv6的简介;
第3篇介绍Linux内核中网络部分结构,以及分布和netfilter框架内报文处理;
第4篇介绍三个网够络编程的实例:Web服务器的例沿另带停若顺顺未子SHTTPD、网络协议栈的例子SIP、防火墙的例子SIPFW。
目录
第1篇 Linux网络开发基础
第1章 Linux久临电酸毫界段李致曾了操作系统概述2
1.1 Linux发展历史2
1.1.1 Linux的诞生和发展2
1.1.2 Linux名称的由来3
1.2 Linux的发展要素3
1.2.1 UNIX操作系统3
1.2.2 Minix操作系统4
1.2.3 POSIX 示改第办标准4
1.3 Linux与UNIX的异同5
1.4 操作系统类型选择和内核版本的选择5
1.4.1 常见的不同公司发行的Linux异同5
1.4.2 内核版本的选择6
1.5 Linux的系统架构7 1.5.1 Linu改已友讨治x内核的主要模块7
1.5.2 Linux的文件结构8
1.6 GNU通用公共许可证9
1.6.1 GPL许可证的历史9
1.6.2 GPL的自由理念10
杆激属检完世简胡清香府1.6.3 GPL的基本条款11
1.6.4 关于GPL许可证的争议12
1.7 Linux软件开发的可借鉴之处12
1.8 小结13
第2章 Linux编程环境14
2.1 L置按雷依顺inux环境下的编辑器14
为 2.1.1 V呼南物家阻环im使用简介14
2.1.2 使用Vim建立文件15
2.1.3 使用Vim编辑文本16
2.1.4 Vim的格式设置18
2.1.5 Vim配置文件.vimrc18
2.1.6 使用其他编辑器19
2.2 Linux下的GCC编译器工具集19
2.2.1 GCC简介19
2.2.2 编译程序的基本知识21
2.2.3 单个文件编译成执行文件21
2.2.4 编译生成目标文件22
2.2.5 多文件编译22
2.2.6 预处理24
2.2.7 编译成汇编语言24
2.2.8 生成和使用静态链接库25
2.2.9 生成动态链接库26
2.2.10 动态加载库29
2.2.11 GCC常用选项31
2.2.12 编译环境的搭建33
2.3 Makefile文件简介33
2.3.1 一个多文件的工程例子33
2.3.2 多文件工程的编译35
2.3.3 Makefile的规则37
2.3.4 Makefile中使用变量39
2.3.5 搜索路径42
2.3.6 自动推导规则43
2.3.7 递归make44
2.3.8 Makefile中的函数46
2.4 用GDB调试程序47
2.4.1 编译可调试程序48
2.4.2 使用GDB调试程序49
2.4.3 GDB常用命令52
2.4.4 其他的GDB59
2.5 小结60
第3章 文件系统简介61
3.1 Linux下的文件系统61
3.1.1 Linux下文件的内涵61
3.1.2 文件系统的创建62
3.1.3 挂接文件系统65
3.1.4 索引节点inode65
3.1.5 普通文件66
3.1.6 设备文件66
3.1.7 虚拟文件系统VFS68
3.2 文件的通用操作方法72
3.2.1 文件描述符72
3.2.2 打开创建文件open()函数、create()函数73
3.2.3 关闭文件close()函数76
3.2.4 读取文件read()函数77
3.2.5 写文件write()函数79
3.2.6 文件偏移lseek()函数80
3.2.7 获得文件状态fstat()函数83
3.2.8 文件空间映射mmap()函数85
3.2.9 文件属性fcntl()函数88
3.2.10 文件输入输出控制ioctl()函数92
3.3 socket文件类型93
3.4 小结93
第4章 程序、进程和线程94
4.1 程序、进程和线程的概念94
4.1.1 程序和进程的差别94
4.1.2 Linux环境下的进程95
4.1.3 进程和线程96
4.2 进程产生的方式96
4.2.1 进程号96
4.2.2 进程复制fork()函数97
4.2.3 system()函数方式98
4.2.4 进程执行exec()函数系列99
4.2.5 所有用户态进程的产生进程init100
4.3 进程间通信和同步101
4.3.1 半双工管道101
4.3.2 命名管道107
4.3.3 消息队列108
4.3.4 消息队列的一个例子114
4.3.5 信号量116
4.3.6 共享内存121
4.3.7 信号124
4.4 Linux下的线程127
4.4.1 多线程编程实例127
4.4.2 Linux下线程创建函数pthread_create()129
4.4.3 线程的结束函数pthread_join()和函数pthread_exit()129
4.4.4 线程的属性130
4.4.5 线程间的互斥132
4.4.6 线程中使用信号量133
4.5 小结136
第2篇 Linux用户层网络编程
第5章 TCP/IP协议族简介138
5.1 OSI网络分层介绍138
5.1.1 OSI网络分层结构138
5.1.2 OSI的7层网络结构139
5.1.3 OSI参考模型中的数据传输140
5.2 TCP/IP协议栈141
5.2.1 TCP/IP协议栈参考模型141
5.2.2 主机到网络层协议143
5.2.3 IP协议144
5.2.4 网际控制报文协议(ICMP)146
5.2.5 传输控制协议(TCP)150
5.2.6 用户数据报文协议(UDP)154
5.2.7 地址解析协议(ARP)156
5.3 IP地址分类与TCP/UDP端口158
5.3.1 因特网中IP地址的分类159
5.3.2 子网掩码(subnet mask address)161
5.3.3 IP地址的配置162
5.3.4 端口163
5.4 主机字节序和网络字节序163
5.4.1 字节序的含义163
5.4.2 网络字节序的转换164
5.5 小结166
第6章 应用层网络服务程序简介167
6.1 HTTP协议和服务167
6.1.1 HTTP协议概述167
6.1.2 HTTP协议的基本过程168
6.2 FTP协议和服务170
6.2.1 FTP协议概述170
6.2.2 FTP协议的工作模式172
6.2.3 FTP协议的传输方式172
6.2.4 一个简单的FTP过程173
6.2.5 常用的FTP工具173
6.3 TELNET协议和服务173
6.3.1 远程登录的基本概念174
6.3.2 使用TELNET协议进行远程登录的工作过程174
6.3.3 TELNET协议174
6.4 NFS协议和服务175
6.4.1 安装NFS服务器和客户端175
6.4.2 服务器端的设定176
6.4.3 客户端的操作176
6.4.4 showmount命令177
6.5 自定义网络服务177
6.5.1 xinetd/inetd177
6.5.2 xinetd服务配置178
6.5.3 自定义网络服务179
6.6 小结180
第7章 TCP网络编程基础181
7.1 套接字编程基础知识181
7.1.1 套接字地址结构181
7.1.2 用户层和内核层交互过程183
7.2 TCP网络编程流程184
7.2.1 TCP网络编程架构184
7.2.2 创建网络插口函数socket()186
7.2.3 绑定一个地址端口对函数bind()189
7.2.4 监听本地端口listen192
7.2.5 接受一个网络请求函数accept()194
7.2.6 连接目标网络服务器函数connect()199
7.2.7 写入数据函数write()200
7.2.8 读取数据函数read()201
7.2.9 关闭套接字函数202
7.3 服务器/客户端的简单例子202
7.3.1 例子功能描述202
7.3.2 服务器网络程序202
7.3.3 服务器读取和显示字符串205
7.3.4 客户端的网络程序205
7.3.5 客户端读取和显示字符串206
7.3.6 编译运行程序206
7.4 截取信号的例子207
7.4.1 信号处理207
7.4.2 信号SIGPIPE207
7.4.3 信号SIGINT208
7.5 小结208
第8章 服务器和客户端信息的获取209
8.1 字节序209
8.1.1 大端字节序和小端字节序209
8.1.2 字节序转换函数211
8.1.3 一个字节序转换的例子213
8.2 字符串IP地址和二进制IP地址的转换216
8.2.1 inet_xxx()函数216
8.2.2 inet_pton()和inet_ntop()函数218
8.2.3 使用8.2.1节地址转换函数的例子219
8.2.4 使用函数inet_pton()和函数inet_ntop()的例子221
8.3 套接字描述符判定函数issockettype()222
8.3.1 进行文件描述符判定的函数issockettype()222
8.3.2 main()函数223
8.4 IP地址与域名之间的相互转换223
8.4.1 DNS原理223
8.4.2 获取主机信息的函数224
8.4.3 使用主机名获取主机信息的例子227
8.4.4 函数gethostbyname()不可重入的例子229
8.5 协议名称处理函数230
8.5.1 xxxprotoxxx()函数231
8.5.2 使用协议族函数的例子232
8.6 小结235
第9章 数据的IO和复用236
9.1 IO函数236
9.1.1 使用recv()函数接收数据236
9.1.2 使用send()函数发送数据238
9.1.3 使用readv()函数接收数据239
9.1.4 使用writev()函数发送数据239
9.1.5 使用recvmsg()函数接收数据241
9.1.6 使用sendmsg()函数发送数据243
9.1.7 IO函数的比较245
9.2 使用IO函数的例子245
9.2.1 客户端处理框架的例子245
9.2.2 服务器端程序框架247
9.2.3 使用recv()和send()函数248
9.2.4 使用readv()和write()函数250
9.2.5 使用recvmsg()和sendmsg()函数252
9.3 IO模型255
9.3.1 阻塞IO模型255
9.3.2 非阻塞IO模型255
9.3.3 IO复用256
9.3.4 信号驱动IO模型256
9.3.5 异步IO模型257
9.4 select()函数和pselect()函数258
9.4.1 select()函数258
9.4.2 pselect()函数260
9.5 poll()函数和ppoll()函数261
9.5.1 poll()函数261
9.5.2 ppoll()函数262
9.6 非阻塞编程263
9.6.1 非阻塞方式程序设计介绍263
9.6.2 非阻塞程序设计的例子263
9.7 小结264
第10章 基于UDP协议的接收和发送265
10.1 UDP编程框架265
10.1.1 UDP编程框图265
10.1.2 UDP服务器编程框架267
10.1.3 UDP客户端编程框架267
10.2 UDP协议程序设计的常用函数267
10.2.1 建立套接字socket()和绑定套接字bind()268
10.2.2 接收数据recvfrom()/recv()268
10.2.3 发送数据sendto()/send()273
10.3 UDP接收和发送数据的例子277
10.3.1 UDP服务器端277
10.3.2 UDP服务器端数据处理278
10.3.3 UDP客户端279
10.3.4 UDP客户端数据处理279
10.3.5 测试UDP程序280
10.4 UDP协议程序设计中的几个问题280
10.4.1 UDP报文丢失数据280
10.4.2 UDP数据发送中的乱序282
10.4.3 UDP协议中的connect()函数284
10.4.4 UDP缺乏流量控制285
10.4.5 UDP协议中的外出网络接口287
10.4.6 UDP协议中的数据报文截断288
10.5 小结289
第11章 高级套接字290
11.1 UNIX域函数290
11.1.1 UNIX域函数的地址结构290
11.1.2 套接字函数291
11.1.3 使用UNIX域函数进行套接字编程291
11.1.4 传递文件描述符293
11.1.5 socketpair()函数294
11.1.6 传递文件描述符的例子295
11.2 广播299
11.2.1 广播的IP地址300
11.2.2 广播与单播的比较300
11.2.3 广播的示例301
11.3 多播307
11.3.1 多播的概念308
11.3.2 广域网的多播308
11.3.3 多播的编程308
11.3.4 内核中的多播310
11.3.5 一个多播例子的服务器端313
11.3.6 一个多播例子的客户端315
11.4 数据链路层访问317
11.4.1 SOCK_PACKET类型317
11.4.2 设置套接口以捕获链路帧的编程方法317
11.4.3 从套接口读取链路帧的编程方法318
11.4.4 定位IP包头的编程方法319
11.4.5 定位TCP报头的编程方法321
11.4.6 定位UDP报头的编程方法322
11.4.7 定位应用层报文数据的编程方法323
11.4.8 使用SOCK_PACKET编写ARP请求程序的例子323
11.5 小结326
第12章 套接字选项328
12.1 获取和设置套接字选项getsocketopt()/setsocketopt()328
12.1.1 getsockopt()函数和setsocketopt()函数的介绍328
12.1.2 套接字选项329
12.1.3 套接字选项简单示例330
12.2 SOL_SOCKET协议族选项334
12.2.1 SO_BROADCAST广播选项334
12.2.2 SO_DEBUG调试选项335
12.2.3 SO_DONTROUTE不经过路由选项335
12.2.4 SO_ERROR错误选项335
12.2.5 SO_KEEPALIVE保持连接选项336
12.2.6 SO_LINGER缓冲区处理方式选项337
12.2.7 SO_OOBINLINE带外数据处理方式选项339
12.2.8 SO_RCVBUF和SO_SNDBUF缓冲区大小选项340
12.2.9 SO_RCVLOWAT和SO_SNDLOWAT缓冲区下限选项340
12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收发超时选项341
12.2.11 SO_REUSERADDR地址重用选项341
12.2.12 SO_EXCLUSIVEADDRUSE端口独占选项342
12.2.13 SO_TYPE套接字类型选项342
12.2.14 SO_BSDCOMPAT与BSD套接字兼容选项342
12.2.15 SO_BINDTODEVICE套接字网络接口绑定选项343
12.2.16 SO_PRIORITY套接字优先级选项344
12.3 IPPROTO_IP选项344
12.3.1 IP_HDRINCL选项344
12.3.2 IP_OPTNIOS选项344
12.3.3 IP_TOS选项344
12.3.4 IP_TTL选项345
12.4 IPPROTO_TCP选项345
12.4.1 TCP_KEEPALIVE选项345
12.4.2 TCP_MAXRT选项346
12.4.3 TCP_MAXSEG选项346
12.4.4 TCP_NODELAY和TCP_CORK选项346
12.5 使用套接字选项348
12.5.1 设置和获取缓冲区大小348
12.5.2 获取套接字类型的例子353
12.5.3 使用套接字选项的综合例子353
12.6 ioctl()函数358
12.6.1 ioctl()函数的命令选项358
12.6.2 ioctl()函数的IO请求360
12.6.3 ioctl()函数的文件请求362
12.6.4 ioctl()函数的网络接口请求362
12.6.5 使用ioctl()函数对ARP高速缓存操作369
12.6.6 使用ioctl()函数发送路由表请求371
12.7 fcntl()函数371
12.7.1 fcntl()函数的选项372
12.7.2 使用fcntl()函数修改套接字非阻塞属性372
12.7.3 使用fcntl()函数设置信号属主372
12.8 小结373
第13章 原始套接字374
13.1 概述374
13.2 原始套接字的创建375
13.2.1 SOCK_RAW选项375
13.2.2 IP_HDRINCL套接字选项376
13.2.3 不需要bind()函数376
13.3 原始套接字发送报文376
13.4 原始套接字接收报文377
13.5 原始套接字报文处理时的结构377
13.5.1 IP头部的结构377
13.5.2 ICMP头部结构378
13.5.3 UDP头部结构381
13.5.4 TCP头部结构382
13.6 ping的例子384
13.6.1 协议格式384
13.6.2 校验和函数385
13.6.3 设置ICMP发送报文的头部386
13.6.4 剥离ICMP接受报文的头部387
13.6.5 计算时间差388
13.6.6 发送报文389
13.6.7 接收报文390
13.6.8 主函数过程391
13.6.9 主函数main()393
13.6.10 编译测试396
13.7 洪水攻击396
13.8 ICMP洪水攻击397
13.8.1 ICMP洪水攻击的原理397
13.8.2 ICMP洪水攻击的例子397
13.9 UDP洪水攻击401
13.10 SYN洪水攻击405
13.10.1 SYN洪水攻击的原理405
13.10.2 SYN洪水攻击的例子405
13.11 小结409
第14章 服务器模型选择410
14.1 循环服务器410
14.1.1 UDP循环服务器410
14.1.2 TCP循环服务器413
14.2 简单并发服务器415
14.2.1 并发服务器的模型416
14.2.2 UDP并发服务器416
14.2.3 TCP并发服务器419
14.3 TCP的高级并发服务器模型421
14.3.1 单客户端单进程,统一accept()422
14.3.2 单客户端单线程,统一accept()425
14.3.3 单客户端单线程,各线程独自accept(),使用互斥锁427
14.4 IO复用循环服务器431
14.4.1 IO复用循环服务器模型介绍431
14.4.2 IO复用循环服务器模型的例子432
14.5 小结436
第15章 IPv6简介437
15.1 IPv4的缺陷437
15.2 IPv6的特点438
15.3 IPv6的地址439
15.3.1 IPv6的单播地址439
15.3.2 可聚集全球单播地址439
15.3.3 本地使用单播地址440
15.3.4 兼容性地址441
15.3.5 IPv6多播地址441
15.3.6 IPv6任播地址442
15.3.7 主机的多个IPv6地址442
15.4 IPv6的头部443
15.4.1 IPv6头部格式443
15.4.2 与IPv4头部的对比444
15.4.3 IPv6的TCP头部444
15.4.4 IPv6的UDP头部444
15.4.5 IPv6的ICMP头部445
15.5 IPv6运行环境447
15.5.1 加载IPv6模块447
15.5.2 查看是否支持IPv6447
15.6 IPv6的结构定义448
15.6.1 IPv6的地址族和协议族448
15.6.2 套接字地址结构448
15.6.3 地址兼容考虑450
15.6.4 IPv6通用地址450
15.7 IPv6的套接字函数451
15.7.1 socket()函数451
15.7.2 没有发生改变的函数451
15.7.3 发生改变的函数452
15.8 IPv6的套接字选项452
15.8.1 IPv6的套接字选项452
15.8.2 单播跳限IPV6_UNICAST_HOPS453
15.8.3 发送和接收多播包454
15.8.4 IPv6中获得时间戳的ioctl命令455
15.9 IPv6的库函数455
15.9.1 地址转换函数的差异455
15.9.2 域名解析函数的差异455
15.9.3 测试宏458
15.10 IPv6的编程的一个简单例子458
15.10.1 服务器程序458
15.10.2 客户端程序460
15.10.3 编译调试461
15.11 小结462
第3篇 Linux内核网络编程
第16章 Linux内核中网络部分结构以及分布464
16.1 概述464
16.1.1 代码目录分布464
16.1.2 内核中网络部分流程简介466
16.1.3 系统提供修改网络流程点468
16.1.4 sk_buff结构469
16.1.5 网络协议数据结构inet_protosw471
16.2 软中断CPU报文队列及其处理473
16.2.1 Linux内核网络协议层的层间传递手段--软中断473
16.2.2 网络收发处理软中断的实现机制475
16.3 socket数据如何在内核中接收和发送476
16.3.1 socket()的初始化476
16.3.2 接收网络数据recv()476
16.3.3 发送网络数据send()477
16.4 小结477
第17章 netfilter框架内报文处理478
17.1 netfilter478
17.1.1 netfilter简介478
17.1.2 netfilter框架479
17.1.3 netfilter检查时的表格480
17.1.4 netfilter的规则480
17.2 iptables和netfilter481
17.2.1 iptables简介481
17.2.2 iptables的表和链481
17.2.3 使用iptables设置过滤规则483
17.3 内核模块编程485
17.3.1 内核"Hello World!"程序485
17.3.2 内核模块的基本架构487
17.3.3 内核模块加载和卸载过程489
17.3.4 内核模块初始化和清理函数490
17.3.5 内核模块初始化和清理过程的容错处理490
17.3.6 内核模块编译所需的Makefile491
17.4 5个钩子点492
17.4.1 netfilter的5个钩子点492
17.4.2 NF_HOOK宏493
17.4.3 钩子的处理规则494
17.5 注册/注销钩子494
17.5.1 结构nf_hook_ops494
17.5.2 注册钩子495
17.5.3 注销钩子496
17.5.4 注册注销函数497
17.6 钩子的简单处理例子498
17.6.1 功能描述498
17.6.2 需求分析498
17.6.3 ping回显屏蔽实现498
17.6.4 禁止向目的IP地址发送数据的实现499
17.6.5 端口关闭实现499
17.6.6 动态配置实现499
17.6.7 可加载内核实现代码501
17.6.8 应用层测试代码实现508
17.6.9 编译运行508
17.7 一点多个钩子的优先级508
17.8 校验和问题509
17.9 小结510
第4篇 综合案例
第18章 一个简单Web服务器的例子SHTTPD512
18.1 SHTTPD的需求分析512
18.1.1 SHTTPD启动参数可动态配置的需求513
18.1.2 SHTTPD的多客户端支持的需求515
18.1.3 SHTTPD支持方法的需求515
18.1.4 SHTTPD支持的HTTP协议版本的需求516
18.1.5 SHTTPD支持头部的需求517
18.1.6 SHTTPD定位URI的需求517
18.1.7 SHTTPD支持CGI的需求518
18.1.8 SHTTPD错误代码的需求519
18.2 SHTTPD的模块分析和设计519
18.2.1 SHTTPD的主函数520
18.2.2 SHTTPD命令行解析的分析设计521
18.2.3 SHTTPD配置文件解析的分析设计523
18.2.4 SHTTPD的多客户端支持的分析设计523
18.2.5 SHTTPD头部解析的分析设计526
18.2.6 SHTTPD对URI的分析设计526
18.2.7 SHTTPD支持方法的分析设计527
18.2.8 SHTTPD支持CGI的分析设计527
18.2.9 SHTTPD错误处理的分析设计530
18.3 SHTTPD各模块的实现532
18.3.1 SHTTPD命令行解析的实现532
18.3.2 SHTTPD文件配置解析的实现535
18.3.3 SHTTPD的多客户端支持的实现536
18.3.4 SHTTPD所请求URI解析的实现540
18.3.5 SHTTPD方法解析的实现541
18.3.6 SHTTPD响应方法的实现541
18.3.7 SHTTPD支持CGI的实现545
18.3.8 SHTTPD支持HTTP协议版本的实现548
18.3.9 SHTTPD内容类型的实现548
18.3.10 SHTTPD错误处理的实现550
18.3.11 SHTTPD生成目录下文件列表文件的实现552
18.3.12 SHTTPD主函数的实现554
18.4 SHTTPD的编译、调试和测试555
18.4.1 建立源文件555
18.4.2 制作Makefile555
18.4.3 制作执行文件555
18.4.4 使用不同的浏览器测试服务器程序556
18.5 小结557
第19章 一个简单网络协议栈的例子SIP558
19.1 SIP网络协议栈的功能描述558
19.1.1 SIP网络协议栈的基本功能描述558
19.1.2 SIP网络协议栈的分层功能描述559
19.1.3 SIP网络协议栈的用户接口功能描述559
19.2 SIP网络协议栈的架构560
19.3 SIP网络协议栈的存储区缓存561
19.3.1 SIP存储缓冲的结构定义561
19.3.2 SIP存储缓冲的处理函数565
19.4 SIP网络协议栈的网络接口层567
19.4.1 SIP网络接口层的架构568
19.4.2 SIP网络接口层的数据结构568
19.4.3 SIP网络接口层的初始化函数570
19.4.4 SIP网络接口层的输入函数571
19.4.5 SIP网络接口层的输出函数574
19.5 SIP网络协议栈的ARP层577
19.5.1 SIP地址解析层的架构577
19.5.2 SIP地址解析层的数据结构577
19.5.3 SIP地址解析层的映射表579
19.5.4 SIP地址解析层的ARP映射表维护函数580
19.5.5 SIP地址解析层的ARP网络报文构建函数581
19.5.6 SIP地址解析层的ARP网络报文收发处理函数583
19.6 SIP网络协议栈的IP层586
19.6.1 SIP网际协议层的架构586
19.6.2 SIP网际协议层的数据结构587
19.6.3 SIP网际协议层的输入函数589
19.6.4 SIP网际协议层的输出函数593
19.6.5 SIP网际协议层的分片函数594
19.6.6 SIP网际协议层的分片组装函数595
19.7 SIP网络协议栈的ICMP层599
19.7.1 SIP控制报文协议的数据结构599
19.7.2 SIP控制报文协议的协议支持600
19.7.3 SIP控制报文协议的输入函数601
19.7.4 SIP控制报文协议的回显应答函数602
19.8 SIP网络协议栈的UDP层603
19.8.1 SIP数据报文层的数据结构603
19.8.2 SIP数据报文层的控制单元603
19.8.3 SIP数据报文层的输入函数605
19.8.4 SIP数据报文层的输出函数606
19.8.5 SIP数据报文层的建立函数606
19.8.6 SIP数据报文层的释放函数607
19.8.7 SIP数据报文层的绑定函数607
19.8.8 SIP数据报文层的发送数据函数608
19.8.9 SIP数据报文层的校验和计算609
19.9 SIP网络协议栈的协议无关层610
19.9.1 SIP协议无关层的系统架构611
19.9.2 SIP协议无关层的函数形式611
19.9.3 SIP协议无关层的接收数据函数612
19.10 SIP网络协议栈的BSD接口层613
19.10.1 SIP用户接口层的架构613
19.10.2 SIP用户接口层的套接字建立函数613
19.10.3 SIP用户接口层的套接字关闭函数614
19.10.4 SIP用户接口层的套接字绑定函数614
19.10.5 SIP用户接口层的套接字连接函数615
19.10.6 SIP用户接口层的套接字接收数据函数615
19.10.7 SIP用户接口层的发送数据函数616
19.11 SIP网络协议栈的编译617
19.11.1 SIP的文件结构617
19.11.2 SIP的Makefile618
19.11.3 SIP的编译运行618
19.12 小结618
第20章 一个简单防火墙的例子SIPFW620
20.1 SIPFW防火墙的功能描述620
20.1.1 SIPFW防火墙对主机进行网络数据过滤的功能描述620
20.1.2 SIPFW防火墙用户设置防火墙规则的功能描述621
20.1.3 SIPFW防火墙配置文件等附加功能的功能描述621
20.2 SIPFW需求分析621
20.2.1 SIPFW防火墙条件和动作621
20.2.2 SIPFW防火墙支持过滤的类型和内容622
20.2.3 SIPFW防火墙过滤的方式和动作625
20.2.4 SIPFW防火墙的配置文件626
20.2.5 SIPFW防火墙命令行配置格式627
20.2.6 SIPFW防火墙的规则文件格式628
20.2.7 SIPFW防火墙的日志文件数据格式630
20.2.8 SIPFW防火墙构建所采用的技术方案630
20.3 使用netlink进行用户空间和内核空间数据交互631
20.3.1 netlink的用户空间程序设计632
20.3.2 netlink的内核空间API635
20.4 使用proc进行内存数据用户空间映射637
20.4.1 proc虚拟文件系统的结构637
20.4.2 创建proc虚拟文件638
20.4.3 删除proc虚拟文件639
20.4.4 proc文件的写函数639
20.4.5 proc文件的读函数640
20.5 内核空间的文件操作函数641
20.5.1 内核空间的文件结构641
20.5.2 内核空间的文件建立操作641
20.5.3 内核空间的文件读写操作642
20.5.4 内核空间的文件关闭操作643
20.6 SIPFW防火墙的模块分析和设计644
20.6.1 SIPFW防火墙的总体架构644
20.6.2 SIPFW防火墙的用户命令解析645
20.6.3 SIPFW用户空间与内核空间的交互649
20.6.4 SIPFW防火墙内核链上的规则处理651
20.6.5 SIPFW防火墙的PROC虚拟文件系统654
20.6.6 SIPFW防火墙的配置文件和日志文件处理655
20.6.7 SIPFW防火墙的过滤模块设计657
20.7 SIPFW防火墙各功能模块的实现660
20.7.1 SIPFW防火墙的命令解析代码660
20.7.2 SIPFW防火墙的过滤规则解析模块代码664
20.7.3 SIPFW防火墙的网络数据拦截模块代码666
20.7.4 SIPFW防火墙的PROC虚拟文件系统668
20.7.5 SIPFW防火墙对配置文件的解析670
20.7.6 SIPFW防火墙内核模块初始化和退出671
20.7.7 用户空间处理主函数672
20.8 编译、调试和测试673
20.8.1 用户程序和内核程序的Makefile673
20.8.2 编译及运行674
20.8.3 下发过滤规则,测试过滤结果674
20.9 小结676