基本信息·出版社:清华大学出版社 ·页码:690 页 ·出版日期:2010年01月 ·ISBN:9787302207177 ·条形码:9787302207177 ·版本:第1版 ·装帧:平装 ...
商家名称 |
信用等级 |
购买信息 |
订购本书 |
|
|
Linux网络编程 |
|
|
|
Linux网络编程 |
|
基本信息·出版社:清华大学出版社
·页码:690 页
·出版日期:2010年01月
·ISBN:9787302207177
·条形码:9787302207177
·版本:第1版
·装帧:平装
·开本:16
·正文语种:中文
·丛书名:Linux典藏大系
内容简介 《Linux网络编程》内容简介:Linux是目前最流行的开源操作系统,网络功能在Linux下占有核心的地位。《Linux网络编程》循序渐进地从应用层到Linux内核、从基本知识点到综合案例,向读者介绍如何在Linux下进行网络程序设计。《Linux网络编程》内容分为4个部分:Linux程序设计基础部分、Linux用户空间网络编程部分、Linux内核网络编程部分以及综合案例部分。内容包含Linux系统概述、Linux编程环境、Linux文件系统简介、Linux下的进程和线程、TCP/IP协议族、应用层网络服务程序、TCP编程、主机信息获取、数据IO复用、UDP编程、高级套接字、套接字选项、原始套接字、服务器模型、IPv6、Linux内核网络部分结构及分布、netfilter框架内报文处理。为了方便读者学习,《Linux网络编程》最后一个部分介绍了3个综合案例,包括应用层的Web服务器例子、简单的应用层网络协议站例子和内核层网防火墙的例子。
《Linux网络编程》适合广大的Linux平台下的网络程序设计人员和大中专院校学生阅读,尤其是有一定Linux基础知识的编程技术人员。
作者简介 宋敬彬,海信集团国家重点实验室高级工程师。海信数字家庭原型系统的主要设计及实现人员。有十多年的Linux编程经验,对Linux内核和网络协议栈十分熟悉。长期从事嵌入式Linux设备、机顶盒产品、IGRS设备互联的研究和开发工作。目前主要从事数字家庭系统的设计和实现。曾经在技术期刊上发表过多篇技术论文。曾经参加过国家863高性能集群服务器、电子发展基金的IPv6等项目的研究和开发。
孙海滨,山东科技大学信息科学与工程学院副教授。计算机应用技术专业博士、博士后。长期从事计算机应用技术的研究和教学。有多年的Linux应用和开发经验,对网络协议有较深入的研究。目前致力于多媒体信息检索、人工智能、空间推理、地理信息系统等技术的研究。曾经在国内外的核心刊物上发表过多篇学术论文。参与开发了多个应用软件系统。参与国家863计划项目一项。主持开发过山东科技大学“春蕾计划”项目一项。
编辑推荐 《Linux网络编程》:
感谢ChinaUnix.nef技术社区对本系列图书的支持!
China Unix.net是一个以讨论操作系统、软件开发、数据库技术、网络技术及服务器存储等技术为主的大型lT技术社区网站。China Unix.net的宗旨是给所有爱好IT技术、开源技术的朋友提供一个自由、开放和免费的交流空间。China Unix.netAO目标是建成中国最好的开源技术共享社区,为宣传和推动开源技术及自由软件在中国的应用发展做出贡献。China Unix.net的网址为:http://www.chinaunix.net。
内容全面:全书涵盖Linux网络编程从基础到高级开发的方方面面
内容深入:重点讲解了技术性较强的Linux用户空间网络编程及内核网络编程
注重原理:对每个知识点都从原始概念和基本原理进行详细、透彻地分析
插图丰富:对比较复杂和难度较高的内容绘制了220余幅原理图进行讲解
代码经典:书中的示例代码大多是从实际项目总结而来,有很强的实用性
实践性强:贯穿450余个示例、70余个实例及3个案例进行讲解
案例典型:详细介绍了HTTP网络服务器、协议栈和防火墙的实现
资深程序员十年经验总结,深入探讨Linux应用层和内核层的网络编程
详细讲解HTTP服务器、协议栈和防火墙三个典型案例的实际开发过程
一线技术人员全力打造,分享Linux技术盛宴!《Linux网络编程》重点内容及特色
《Linux网络编程》是一本全面、系统、深入介绍Linux网络编程的技术宝典。涉及Linux网络编程基础用户空间网络编程、Linux内核网络编程及Linux网络编程典型案例。
《Linux网络编程》基本涵盖了Linux网络编程的所有知识点,尤其对高级网络编程、原始套接字等高级应用层网络程序设计进行了深入介绍,并给出了丰富的例程。
《Linux网络编程》不仅介绍了用户界面的网络程序设计,还对内核空间的网络程序设计进行了详细的介绍。对netfilter框架进行了很细致的讲解,并给出了一个全面使用netfilter框架的案例。
《Linux网络编程》在对多个主要函数进行介绍时,对用户空间和内核空间的相互作用进行了对比介绍,便于者不仅了解如何使用它们,而且可以更加深入地理解为何这样用,做到知其然并知其所以然,
《Linux网络编程》最后提供的三个典型案例来源于作者的实际项目:总结了应用层的web服务器开发、简单的应用层网络协议栈开发及内核层的网络防火墙开发,可极大地提升读者的应用开发水平。
《Linux网络编程》作者长期致力于Linux网络程序设计,对Linux网络编程有独到的见解和深入的理解。《Linux网络编程》全面总结了他们对Linux网络编程的理解及大量的实践经验,充满了思想的火花。
一线技术人员全力打造,分享Linux技术盛宴!
《Linux网络编程》读者对象
想全面学习Linux网络编程的人员
想深入学习Linux网络编程的人员
想从事Linux嵌入式开发的人员
需要一本案头必备手册的程序员
大中专院校的相关学生
相关社会培训班的学员
其他Linux网络编程爱好者
获取PPT提示
《Linux网络编程》适合培训机构和大中专院校作为教材使用。为了方便教学,《Linux网络编程》专门配备了教学PPT。需要的老师请发电子邮件至bookservice2008@163.com索取。索取时请提供身份信息。
源代码下载提示
《Linux网络编程》所有源代码请到清华大学出版社的网站(www.tup.com-cn)上下载。请先在主页上的搜索栏中输入书名搜索到《Linux网络编程》页面,然后找到下载信息下载即可。
目录 第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操作系统 4
1.2.2 Minix操作系统 4
1.2.3 POSIX 标准 4
1.3 Linux与UNIX的异同 5
1.4 操作系统类型选择和内核版本的选择 5
1.4.1 常见的不同公司发行的Linux异同 6
1.4.2 内核版本的选择 6
1.5 Linux的系统架构 7
1.5.1 Linux内核的主要模块 7
1.5.2 Linux的文件结构 9
1.6 GNU通用公共许可证 10
1.6.1 GPL许可证的历史 10
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 Linux环境下的编辑器 14
2.1.1 vim使用简介 14
2.1.2 使用vim建立文件 15
2.1.3 使用vim编辑文本 16
2.1.4 vim的格式设置 18
2.1.5 vim配置文件.vimrc 19
2.1.6 使用其他编辑器 19
2.2 Linux下的GCC编译器工具集 19
2.2.1 GCC简介 19
2.2.2 编译程序的基本知识 21
2.2.3 单个文件编译成执行文件 22
2.2.4 编译生成目标文件 22
2.2.5 多文件编译 23
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文件简介 34
2.3.1 一个多文件的工程例子 34
2.3.2 多文件工程的编译 36
2.3.3 Makefile的规则 37
2.3.4 Makefile中使用变量 39
2.3.5 搜索路径 43
2.3.6 自动推导规则 44
2.3.7 递归make 44
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 其他的GDB 59
2.5 小结 60
第3章 文件系统简介 61
3.1 Linux下的文件系统 61
3.1.1 Linux下文件的内涵 61
3.1.2 文件系统的创建 62
3.1.3 挂接文件系统 64
3.1.4 索引节点inode 65
3.1.5 普通文件 66
3.1.6 设备文件 66
3.1.7 虚拟文件系统VFS 68
3.2 文件的通用操作方法 72
3.2.1 文件描述符 72
3.2.2 打开创建文件open()、create()函数 72
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 所有用户态进程的产生进程init 100
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 字节序的含义 164
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协议和服务 174
6.3.1 远程登录的基本概念 174
6.3.2 使用TELNET协议进行远程登录的工作过程 174
6.3.3 TELNET协议 174
6.4 NFS协议和服务 176
6.4.1 安装NFS服务器和客户端 176
6.4.2 服务器端的设定 176
6.4.3 客户端的操作 177
6.4.4 showmount命令 177
6.5 自定义网络服务 177
6.5.1 xinetd/inetd 178
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 监听本地端口listen 192
7.2.5 接受一个网络请求accept() 194
7.2.6 连接目标网络服务器connect() 199
7.2.7 写入数据函数write() 200
7.2.8 读取数据函数read() 201
7.2.9 关闭套接字函数close() 201
7.3 服务器/客户端的简单例子 202
7.3.1 例子功能描述 202
7.3.2 服务器网络程序 203
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 信号SIGPIPE 208
7.4.3 信号SIGINT 208
7.5 小结 208
第8章 服务器和客户端信息的获取 210
8.1 字节序 210
8.1.1 大端字节序和小端字节序 210
8.1.2 字节序转换函数 212
8.1.3 一个字节序转换的例子 214
8.2 字符串IP地址和二进制IP地址的转换 217
8.2.1 inet_xxx()函数 217
8.2.2 inet_pton()和inet_ntop()函数 219
8.2.3 使用8.2.1节地址转换函数的例子 220
8.2.4 使用函数inet_pton()和函数inet_ntop()的例子 223
8.3 套接字描述符判定函数issockettype() 223
8.3.1 进行文件描述符判定的函数issockettype() 224
8.3.2 main()函数 224
8.4 IP地址与域名之间的相互转换 225
8.4.1 DNS原理 225
8.4.2 获取主机信息的函数 226
8.4.3 使用主机名获取主机信息的例子 228
8.4.4 函数gethostbyname()不可重入的例子 230
8.5 协议名称处理函数 232
8.5.1 xxxprotoxxx()函数 232
8.5.2 使用协议族函数的例子 233
8.6 小结 236
第9章 数据的IO和复用 237
9.1 IO函数 237
9.1.1 使用recv()函数接收数据 237
9.1.2 使用send()函数发送数据 239
9.1.3 使用readv()函数接收数据 240
9.1.4 使用writev()函数发送数据 240
9.1.5 使用recvmsg()函数接收数据 242
9.1.6 使用sendmsg()函数发送数据 244
9.1.7 IO函数的比较 246
9.2 使用IO函数的例子 246
9.2.1 客户端处理框架的例子 246
9.2.2 服务器端程序框架 248
9.2.3 使用recv()和send()函数 249
9.2.4 使用readv()和write()函数 251
9.2.5 使用recvmsg()和sendmsg()函数 253
9.3 IO模型 256
9.3.1 阻塞IO模型 256
9.3.2 非阻塞IO模型 257
9.3.3 IO复用 257
9.3.4 信号驱动IO模型 258
9.3.5 异步IO模型 258
9.4 select()函数和pselect()函数 259
9.4.1 select()函数 259
9.4.2 pselect()函数 261
9.5 poll()函数和ppoll()函数 262
9.5.1 poll()函数 263
9.5.2 ppoll()函数 264
9.6 非阻塞编程 264
9.6.1 非阻塞方式程序设计介绍 264
9.6.2 非阻塞程序设计的例子 264
9.7 小结 266
第10章 基于UDP协议的接收和发送 267
10.1 UDP编程框架 267
10.1.1 UDP编程框图 267
10.1.2 UDP服务器编程框架 269
10.1.3 UDP客户端编程框架 269
10.2 UDP协议程序设计的常用函数 270
10.2.1 建立套接字socket()和绑定套接字bind() 270
10.2.2 接收数据recvfrom()/recv() 270
10.2.3 发送数据sendto()/send() 275
10.3 UDP接收和发送数据的例子 279
10.3.1 UDP服务器端 279
10.3.2 UDP服务器端数据处理 280
10.3.3 UDP客户端 281
10.3.4 UDP客户端数据处理 281
10.3.5 测试UDP程序 282
10.4 UDP协议程序设计中的几个问题 282
10.4.1 UDP报文丢失数据 282
10.4.2 UDP数据发送中的乱序 284
10.4.3 UDP协议中的connect()函数 287
10.4.4 UDP缺乏流量控制 287
10.4.5 UDP协议中的外出网络接口 289
10.4.6 UDP协议中的数据报文截断 290
10.5 小结 291
第11章 高级套接字 292
11.1 UNIX域函数 292
11.1.1 UNIX域函数的地址结构 292
11.1.2 套接字函数 293
11.1.3 使用UNIX域函数进行套接字编程 293
11.1.4 传递文件描述符 296
11.1.5 socketpair()函数 296
11.1.6 传递文件描述符的例子 297
11.2 广播 302
11.2.1 广播的IP地址 302
11.2.2 广播与单播的比较 303
11.2.3 广播的示例 304
11.3 多播 310
11.3.1 多播的概念 310
11.3.2 广域网的多播 311
11.3.3 多播的编程 311
11.3.4 内核中的多播 313
11.3.5 一个多播例子的服务器端 317
11.3.6 一个多播例子的客户端 318
11.4 数据链路层访问 319
11.4.1 SOCK_PACKET类型 319
11.4.2 设置套接口以捕获链路帧的编程方法 320
11.4.3 从套接口读取链路帧的编程方法 321
11.4.4 定位IP包头的编程方法 322
11.4.5 定位TCP报头的编程方法 323
11.4.6 定位UDP报头的编程方法 325
11.4.7 定位应用层报文数据的编程方法 326
11.4.8 使用SOCK_PACKET编写ARP请求程序的例子 326
11.5 小结 329
第12章 套接字选项 330
12.1 获取和设置套接字选项getsocketopt()/setsocketopt() 330
12.1.1 getsockopt()函数和setsocketopt()函数的介绍 330
12.1.2 套接字选项 331
12.1.3 套接字选项简单示例 332
12.2 SOL_SOCKET协议族选项 336
12.2.1 SO_BROADCAST广播选项 336
12.2.2 SO_DEBUG调试选项 337
12.2.3 SO_DONTROUTE不经过路由选项 337
12.2.4 SO_ERROR错误选项 338
12.2.5 SO_KEEPALIVE保持连接选项 338
12.2.6 SO_LINGER缓冲区处理方式选项 339
12.2.7 SO_OOBINLINE带外数据处理方式选项 342
12.2.8 SO_RCVBUF和SO_SNDBUF缓冲区大小选项 342
12.2.9 SO_RCVLOWAT和SO_SNDLOWAT缓冲区下限选项 343
12.2.10 SO_RCVTIMEO和SO_SNDTIMEO收发超时选项 343
12.2.11 SO_REUSERADDR地址重用选项 344
12.2.12 SO_EXCLUSIVEADDRUSE端口独占选项 344
12.2.13 SO_TYPE套接字类型选项 345
12.2.14 SO_BSDCOMPAT与BSD套接字兼容选项 345
12.2.15 SO_BINDTODEVICE套接字网络接口绑定选项 345
12.2.16 SO_PRIORITY套接字优先级选项 346
12.3 IPPROTO_IP选项 347
12.3.1 IP_HDRINCL选项 347
12.3.2 IP_OPTNIOS选项 347
12.3.3 IP_TOS选项 347
12.3.4 IP_TTL选项 347
12.4 IPPROTO_TCP选项 348
12.4.1 TCP_KEEPALIVE选项 348
12.4.2 TCP_MAXRT选项 348
12.4.3 TCP_MAXSEG选项 349
12.4.4 TCP_NODELAY和TCP_CORK选项 349
12.5 使用套接字选项 351
12.5.1 设置和获取缓冲区大小 351
12.5.2 获取套接字类型的例子 355
12.5.3 使用套接字选项的综合例子 356
12.6 ioctl()函数 361
12.6.1 ioctl()函数的命令选项 361
12.6.2 ioctl()函数的IO请求 363
12.6.3 ioctl()函数的文件请求 365
12.6.4 ioctl()函数的网络接口请求 365
12.6.5 使用ioctl()函数对ARP高速缓存操作 372
12.6.6 使用ioctl()函数发送路由表请求 374
12.7 fcntl()函数 374
12.7.1 fcntl()函数的选项 375
12.7.2 使用fcntl()函数修改套接字非阻塞属性 375
12.7.3 使用fcntl()函数设置信号属主 376
12.8 小结 376
第13章 原始套接字 377
13.1 概述 377
13.2 原始套接字的创建 379
13.2.1 SOCK_RAW选项 379
13.2.2 IP_HDRINCL套接字选项 379
13.2.3 不需要bind()函数 380
13.3 原始套接字发送报文 380
13.4 原始套接字接收报文 380
13.5 原始套接字报文处理时的结构 381
13.5.1 IP头部的结构 381
13.5.2 ICMP头部结构 382
13.5.3 UDP头部结构 384
13.5.4 TCP头部结构 386
13.6 ping的例子 387
13.6.1 协议格式 388
13.6.2 校验和函数 389
13.6.3 设置ICMP发送报文的头部 390
13.6.4 剥离ICMP接受报文的头部 391
13.6.5 计算时间差 392
13.6.6 发送报文 393
13.6.7 接收报文 394
13.6.8 主函数过程 395
13.6.9 主函数main() 397
13.6.10 编译测试 400
13.7 洪水攻击 400
13.8 ICMP洪水攻击 401
13.8.1 ICMP洪水攻击的原理 401
13.8.2 ICMP洪水攻击的例子 401
13.9 UDP洪水攻击 405
13.10 SYN洪水攻击 409
13.10.1 SYN洪水攻击的原理 409
13.10.2 SYN洪水攻击的例子 409
13.11 小结 413
第14章 服务器模型选择 414
14.1 循环服务器 414
14.1.1 UDP循环服务器 414
14.1.2 TCP循环服务器 417
14.2 简单并发服务器 420
14.2.1 并发服务器的模型 420
14.2.2 UDP并发服务器 420
14.2.3 TCP并发服务器 423
14.3 TCP的高级并发服务器模型 426
14.3.1 单客户端单进程,统一accept() 426
14.3.2 单客户端单线程,统一accept() 429
14.3.3 单客户端单线程,各线程独自accept(),使用互斥锁 431
14.4 IO复用循环服务器 435
14.4.1 IO复用循环服务器模型介绍 435
14.4.2 IO复用循环服务器模型的例子 436
14.5 小结 440
第15章 IPv6简介 441
15.1 IPv4的缺陷 441
15.2 IPv6的特点 442
15.3 IPv6的地址 443
15.3.1 IPv6的单播地址 443
15.3.2 可聚集全球单播地址 443
15.3.3 本地使用单播地址 444
15.3.4 兼容性地址 445
15.3.5 IPv6多播地址 446
15.3.6 IPv6任播地址 446
15.3.7 主机的多个IPv6地址 447
15.4 IPv6的头部 447
15.4.1 IPv6头部格式 447
15.4.2 与IPv4头部的对比 448
15.4.3 IPv6的TCP头部 449
15.4.4 IPv6的UDP头部 449
15.4.5 IPv6的ICMP头部 449
15.5 IPv6运行环境 451
15.5.1 加载IPv6模块 451
15.5.2 查看是否支持IPv6 452
15.6 IPv6的结构定义 453
15.6.1 IPv6的地址族和协议族 453
15.6.2 套接字地址结构 453
15.6.3 地址兼容考虑 455
15.6.4 IPv6通用地址 455
15.7 IPv6的套接字函数 456
15.7.1 socket()函数 456
15.7.2 没有发生改变的函数 456
15.7.3 发生改变的函数 457
15.8 IPv6的套接字选项 457
15.8.1 IPv6的套接字选项 457
15.8.2 单播跳限IPV6_UNICAST_HOPS 459
15.8.3 发送和接收多播包 459
15.8.4 IPv6中获得时间戳的ioctl命令 460
15.9 IPv6的库函数 460
15.9.1 地址转换函数的差异 460
15.9.2 域名解析函数的差异 461
15.9.3 测试宏 463
15.10 IPv6的编程的一个简单例子 463
15.10.1 服务器程序 464
15.10.2 客户端程序 465
15.10.3 编译调试 467
15.11 小结 467
第3篇 Linux内核网络编程
第16章 Linux内核中网络部分结构以及分布 470
16.1 概述 470
16.1.1 代码目录分布 470
16.1.2 内核中网络部分流程简介 472
16.1.3 系统提供修改网络流程点 474
16.1.4 sk_buff结构 475
16.1.5 网络协议数据结构inet_protosw 478
16.2 软中断CPU报文队列及其处理 479
16.2.1 Linux内核网络协议层的层间传递手段——软中断 479
16.2.2 网络收发处理软中断的实现机制 481
16.3 socket数据如何在内核中接收和发送 482
16.3.1 socket()的初始化 482
16.3.2 接收网络数据recv() 482
16.3.3 发送网络数据send() 483
16.4 小结 484
第17章 netfilter框架内报文处理 485
17.1 netfilter 485
17.1.1 netfilter简介 485
17.1.2 netfilter框架 486
17.1.3 netfilter检查时的表格 487
17.1.4 netfilter的规则 487
17.2 iptables和netfilter 488
17.2.1 iptables简介 488
17.2.2 iptables的表和链 488
17.2.3 使用iptables设置过滤规则 489
17.3 内核模块编程 492
17.3.1 内核“Hello,World!”程序 492
17.3.2 内核模块的基本架构 494
17.3.3 内核模块加载和卸载过程 496
17.3.4 内核模块初始化和清理函数 497
17.3.5 内核模块初始化和清理过程的容错处理 497
17.3.6 内核模块编译所需的Makefile 498
17.4 5个钩子点 499
17.4.1 netfilter的5个钩子点 499
17.4.2 NF_HOOK宏 500
17.4.3 钩子的处理规则 501
17.5 注册/注销钩子 502
17.5.1 结构nf_hook_ops 502
17.5.2 注册钩子 503
17.5.3 注销钩子 504
17.5.4 注册注销函数 504
17.6 钩子的简单处理例子 505
17.6.1 功能描述 505
17.6.2 需求分析 506
17.6.3 ping回显屏蔽实现 506
17.6.4 禁止向目的IP地址发送数据的实现 506
17.6.5 端口关闭实现 506
17.6.6 动态配置实现 508
17.6.7 可加载内核实现代码 509
17.6.8 应用层测试代码实现 516
17.6.9 编译运行 516
17.7 一点多个钩子的优先级 517
17.8 校验和问题 518
17.9 小结 518
第4篇 综 合 案 例
第18章 一个简单Web服务器的例子SHTTPD 522
18.1 SHTTPD的需求分析 522
18.1.1 SHTTPD启动参数可动态配置的需求 523
18.1.2 SHTTPD的多客户端支持的需求 524
18.1.3 SHTTPD支持方法的需求 525
18.1.4 SHTTPD支持的HTTP协议版本的需求 526
18.1.5 SHTTPD支持头部的需求 527
18.1.6 SHTTPD定位URI的需求 527
18.1.7 SHTTPD支持CGI的需求 528
18.1.8 SHTTPD错误代码的需求 529
18.2 SHTTPD的模块分析和设计 530
18.2.1 SHTTPD的主函数 530
18.2.2 SHTTPD命令行解析的分析设计 531
18.2.3 SHTTPD配置文件解析的分析设计 532
18.2.4 SHTTPD的多客户端支持的分析设计 534
18.2.5 SHTTPD头部解析的分析设计 536
18.2.6 SHTTPD对URI的分析设计 537
18.2.7 SHTTPD支持方法的分析设计 537
18.2.8 SHTTPD支持CGI的分析设计 538
18.2.9 SHTTPD错误处理的分析设计 540
18.3 SHTTPD各模块的实现 542
18.3.1 SHTTPD命令行解析的实现 543
18.3.2 SHTTPD文件配置解析的实现 545
18.3.3 SHTTPD的多客户端支持的实现 547
18.3.4 SHTTPD所请求URI解析的实现 551
18.3.5 SHTTPD方法解析的实现 552
18.3.6 SHTTPD响应方法的实现 552
18.3.7 SHTTPD支持CGI的实现 556
18.3.8 SHTTPD支持HTTP协议版本的实现 559
18.3.9 SHTTPD内容类型的实现 559
18.3.10 SHTTPD错误处理的实现 561
18.3.11 SHTTPD生成目录下文件列表文件的实现 563
18.3.12 SHTTPD主函数的实现 565
18.4 SHTTPD的编译、调试和测试 566
18.4.1 建立源文件 566
18.4.2 制作Makefile 566
18.4.3 制作执行文件 567
18.4.4 使用不同的浏览器测试服务器程序 567
18.5 小结 568
第19章 一个简单网络协议栈的例子SIP 569
19.1 SIP网络协议栈的功能描述 569
19.1.1 SIP网络协议栈的基本功能描述 570
19.1.2 SIP网络协议栈的分层功能描述 570
19.1.3 SIP网络协议栈的用户接口功能描述 571
19.2 SIP网络协议栈的架构 571
19.3 SIP网络协议栈的存储区缓存 572
19.3.1 SIP存储缓冲的结构定义 573
19.3.2 SIP存储缓冲的处理函数 577
19.4 SIP网络协议栈的网络接口层 579
19.4.1 SIP网络接口层的架构 579
19.4.2 SIP网络接口层的数据结构 580
19.4.3 SIP网络接口层的初始化函数 581
19.4.4 SIP网络接口层的输入函数 583
19.4.5 SIP网络接口层的输出函数 586
19.5 SIP网络协议栈的ARP层 588
19.5.1 SIP地址解析层的架构 588
19.5.2 SIP地址解析层的数据结构 588
19.5.3 SIP地址解析层的映射表 590
19.5.4 SIP地址解析层的ARP映射表维护函数 591
19.5.5 SIP地址解析层的ARP网络报文构建函数 593
19.5.6 SIP地址解析层的ARP网络报文收发处理函数 595
19.6 SIP网络协议栈的IP层 598
19.6.1 SIP网际协议层的架构 598
19.6.2 SIP网际协议层的数据结构 599
19.6.3 SIP网际协议层的输入函数 601
19.6.4 SIP网际协议层的输出函数 605
19.6.5 SIP网际协议层的分片函数 606
19.6.6 SIP网际协议层的分片组装函数 607
19.7 SIP网络协议栈的ICMP层 611
19.7.1 SIP控制报文协议的数据结构 611
19.7.2 SIP控制报文协议的协议支持 612
19.7.3 SIP控制报文协议的输入函数 613
19.7.4 SIP控制报文协议的回显应答函数 614
19.8 SIP网络协议栈的UDP层 615
19.8.1 SIP数据报文层的数据结构 615
19.8.2 SIP数据报文层的控制单元 615
19.8.3 SIP数据报文层的输入函数 617
19.8.4 SIP数据报文层的输出函数 618
19.8.5 SIP数据报文层的建立函数 618
19.8.6 SIP数据报文层的释放函数 619
19.8.7 SIP数据报文层的绑定函数 620
19.8.8 SIP数据报文层的发送数据函数 621
19.8.9 SIP数据报文层的校验和计算 622
19.9 SIP网络协议栈的协议无关层 623
19.9.1 SIP协议无关层的系统架构 623
19.9.2 SIP协议无关层的函数形式 624
19.9.3 SIP协议无关层的接收数据函数 624
19.10 SIP网络协议栈的BSD接口层 625
19.10.1 SIP用户接口层的架构 625
19.10.2 SIP用户接口层的套接字建立函数 626
19.10.3 SIP用户接口层的套接字关闭函数 627
19.10.4 SIP用户接口层的套接字绑定函数 627
19.10.5 SIP用户接口层的套接字连接函数 628
19.10.6 SIP用户接口层的套接字接收数据函数 628
19.10.7 SIP用户接口层的发送数据函数 629
19.11 SIP网络协议栈的编译 630
19.11.1 SIP的文件结构 630
19.11.2 SIP的Makefile 631
19.11.3 SIP的编译运行 631
19.12 小结 631
第20章 一个简单防火墙的例子SIPFW 633
20.1 SIPFW防火墙的功能描述 633
20.1.1 SIPFW防火墙对主机进行网络数据过滤的功能描述 633
20.1.2 SIPFW防火墙用户设置防火墙规则的功能描述 634
20.1.3 SIPFW防火墙配置文件等附加功能的功能描述 634
20.2 SIPFW需求分析 634
20.2.1 SIPFW防火墙条件和动作 635
20.2.2 SIPFW防火墙支持过滤的类型和内容 635
20.2.3 SIPFW防火墙过滤的方式和动作 638
20.2.4 SIPFW防火墙的配置文件 640
20.2.5 SIPFW防火墙命令行配置格式 640
20.2.6 SIPFW防火墙的规则文件格式 642
20.2.7 SIPFW防火墙的日志文件数据格式 643
20.2.8 SIPFW防火墙构建所采用的技术方案 644
20.3 使用netlink进行用户空间和内核空间数据交互 645
20.3.1 netlink的用户空间程序设计 645
20.3.2 netlink的内核空间API 648
20.4 使用proc进行内存数据用户空间映射 650
20.4.1 proc虚拟文件系统的结构 650
20.4.2 创建proc虚拟文件 651
20.4.3 删除proc虚拟文件 652
20.4.4 proc文件的写函数 652
20.4.5 proc文件的读函数 653
20.5 内核空间的文件操作函数 654
20.5.1 内核空间的文件结构 654
20.5.2 内核空间的文件建立操作 655
20.5.3 内核空间的文件读写操作 656
20.5.4 内核空间的文件关闭操作 657
20.6 SIPFW防火墙的模块分析和设计 657
20.6.1 SIPFW防火墙的总体架构 657
20.6.2 SIPFW防火墙的用户命令解析 660
20.6.3 SIPFW用户空间与内核空间的交互 663
20.6.4 SIPFW防火墙内核链上的规则处理 666
20.6.5 SIPFW防火墙的PROC虚拟文件系统 668
20.6.6 SIPFW防火墙的配置文件和日志文件处理 669
20.6.7 SIPFW防火墙的过滤模块设计 671
20.7 SIPFW防火墙各功能模块的实现 673
20.7.1 SIPFW防火墙的命令解析代码 674
20.7.2 SIPFW防火墙的过滤规则解析模块代码 678
20.7.3 SIPFW防火墙的网络数据拦截模块代码 680
20.7.4 SIPFW防火墙的PROC虚拟文件系统 681
20.7.5 SIPFW防火墙对配置文件的解析 683
20.7.6 SIPFW防火墙内核模块初始化和退出 684
20.7.7 用户空间处理主函数 685
20.8 编译、调试和测试 686
20.8.1 用户程序和内核程序的Makefile 686
20.8.2 编译及运行 687
20.8.3 下发过滤规则,测试过滤结果 688
20.9 小结 690
……
序言 Linux操作系统已经成为目前最流行的开源操作系统,在服务器、嵌入式系统有着广泛的应用,并且逐步走入个人电脑的桌面操作系统。Linux的网络程序设计在服务器领域、嵌入式领域有着广泛的应用。例如Web服务器、P2P应用、嵌入式网络机顶盒、IPTV机顶盒、手持设备等,上述产品大部分采用了开源的Linux系统。因此,熟悉并且能够编写网络程序代码,构建自己的网络架构程序是十分重要的。
本书全面地介绍了Linux的网络编程技术,并以实例介绍了Linux的应用层网络设计、网络协议栈的实现原理和Linux内核防火墙的技术。学完本书之后,读者可以有编写比较复杂项目的本领。
本书的特点
1.循序渐进,由浅入深
为了方便读者学习,本书首先介绍Linux的开发环境,然后介绍基本的网路程序设计方法,再进行Linux内核的网络设计方法。最后,通过3个综合案例,综合运用上述知识,让读者更深刻地了解网络程序设计的知识。在每一部分的介绍中都是按照由浅入深的方式进行介绍,先介绍基础知识,再结合高级知识进行介绍。
2.技术全面,内容充实
本书基本涵盖了Linux网络程序设计的所有知识面,特别对于高级网络编程、原始套接字等高级应用层网络程序设计给出了全面的介绍和丰富的例子程序。除了用户界面的网络程序设计外,本书还对内核空间的网络程序设计进行了详细的介绍,针对netfilter框架,做了很细致的讲解,并给出了一个全面使用netfilter框架的案例方便读者深入了解。
3.对比讲解,理解深刻
由于Linux程序设计的知识用于空间和内核空间的代码和模块是相互作用的,在多个主要函数介绍过程中,本书对用户空间和内核空间进行交互式的对比介绍,使读者在了解如何使用的情况下,更深入地了解为什么这样用,“知其然并知其所以然”。
4.案例精讲,深入剖析
根据本人多年的项目经验,只有实际接触案例和代码才能够对知识点更深入地了解。本书在介绍了Linux网络程序设计知识点的基础上,通过具有典型意义的3个案例,对各个知识点包括应用层的HTTP协议的Web服务器、协议栈原理的协议栈案例和内核网络的防火墙案例进行了深入剖析。
本书的内容
第1章:为了方便读者对Linux历史文化的了解,这一章从Linux的发展历史、发展要素、发行版本和内核的选择、架构、GPL许可证等几个方面向读者介绍Linux操作系统。
第2章:比较详细地介绍了在Linux环境下进行软件开发所必须的几个方面,包括Linux环境下的编辑器、GCC编译器、Makefile的编写、如何使用GDB进行程序调试等。
第3章:介绍了Linux下的文件系统的概念以及如何使用文件相关函数进行文件操作,通过本章读者可以掌握文件编程。
第4章:对Linux下进程、线程以及之间的通信方法进行了详细的介绍。内容包含进程和线程的概念、进程的产生方式、进程间的IPC通信、Linux下的线程及通信方法。
第5章:重点介绍了TCP/IP的模型和多个主要的协议类型,并对IP地址的概念进行了介绍,最后简单介绍了字节序的概念。
第6章:介绍了用户空间的网络协议,包含HTTP协议、FTP协议、NFS协议和TELNET协议,最后介绍了如何利用xinetd定义自己的网络服务。
第7章:重点介绍了TCP网络程序设计的基础知识,包括套接字地址结构、TCP网络程序流程。对套接字编程的主要函数进行了介绍,并提供了一个简单的例子。
文摘 插图:
Linux操作系统的名称最初并没有被称做Linux。Linus给他的操作系统取的名字是Freax,这个单词的含义是怪诞的、怪物、异想天开的意思。当Torvalds将他的操作系统上传到服务器ftp.funet.fi上的时候,这个服务器的管理员Ari Lemke对Freax这个名称很不赞成,所以将操作系统的名称改为了Linus的谐音Linux,于是这个操作系统的名称就以Linux流传下来。
在Linus的自传Oust for Fun))一书中,Linus解释说:“Ari Lemke,他十分不喜欢Freax这个名字。倒喜欢我当时正在使用的另一个名字Linux,并把我的邮件路径命名为pubOS/Linux。我承认我并没有太坚持。但这一切都是他搞的。所以我既可以不惭愧地说自己不是那么以个人为中心,但是也有一点个人的荣誉感。而且个人认为,Linux是个不错的名字。”实际上,在早期的源文件中仍然使用Freax作为操作系统的名字,可以从Makefile文件中看出此名称的一些蛛丝马迹。