产品特色
编辑推荐
本书采用Python 3,涵盖网络编程所有经典话题,包括网络协议、网络数据及错误、电子邮件、服务器架构,以及HTTP及Web应用程序,对新的SSL支持、异步I/O循环的编写方法、跨站脚本以及跨站请求伪造攻击网站的原理及保护方法等内容也有详尽介绍。
本书既适合想要深入理解使用Python来解决网络相关的问题或是构建网络应用程序的Python程序员,也适合所有Web应用程序开发人员、系统集成者或系统管理员。
内容简介
本书针对想要深入理解使用Python来解决网络相关问题或是构建网络应用程序的技术人员,结合实例讲解了网络协议、网络数据及错误、电子邮件、服务器架构和HTTP及Web应用程序等经典话题。具体内容包括:全面介绍Python3中新提供的SSL支持,异步I/O循环的编写,用Flask框架在Python代码中配置URL,跨站脚本以及跨站请求伪造攻击网站的原理及保护方法,等等。
作者简介
Brandon Rhodes,Dropbox工程师,早期使用Python的程序员之一,热心于传播Python,经常在各类Python主题大会上演讲。
John Goerzen,eFolder公司IT与工程部副总裁,同时也是具有影响力的作家、系统管理者和Python程序员,自1996年起就是Debian GNU/Linux操作系统开发组的成员,拥有近20年的软件开发经验。
目录
第 1 章 客户端/服务器网络编程简介 1
1.1 基础:协议栈与库 1
1.2 应用层 4
1.3 协议的使用 5
1.4 一个原始的网络会话 6
1.5 层层深入 8
1.6 编码与解码 9
1.7 网际协议 10
1.8 IP 地址 11
1.9 路由 12
1.10 数据包分组 13
1.11 进一步学习 IP 14
1.12 小结 15
第 2 章 UDP 16
2.1 端口号 17
2.2 套接字 18
2.2.1 混杂客户端与垃圾回复 22
2.2.2 不可靠性、退避、阻塞和超时 23
2.2.3 连接 UDP 套接字 27
2.2.4 请求 ID:好主意 28
2.3 绑定接口 29
2.4 UDP 分组 31
2.5 套接字选项 33
2.6 广播 33
2.7 小结 35
第 3 章 TCP 37
3.1 TCP 工作原理 37
3.2 何时使用 TCP 38
3.3 TCP 套接字的含义 39
3.4 一个简单的 TCP 客户端和服务器 40
3.4.1 每个会话使用一个套接字 43
3.4.2 地址已被占用 44
3.5 绑定接口 46
3.6 死锁 46
3.7 已关闭连接,半开连接 51
3.8 像使用文件一样使用 TCP 流 52
3.9 小结 53
第 4 章 套接字名与 DNS 54
4.1 主机名与套接字 54
4.1.1 套接字的 5 个坐标 55
4.1.2 IPv6 56
4.2 现代地址解析 57
4.2.1 使用 getaddrinfo() 为服务器
绑定端口 58
4.2.2 使用 getaddrinfo() 连接服务 59
4.2.3 使用 getaddrinfo() 请求规范主机名 60
4.2.4 其他 getaddrinfo() 标记 61
4.2.5 原始的名称服务程序 62
4.2.6 在代码中使用 getsockaddr() 62
4.3 DNS 协议 64
4.3.1 为何不使用原始 DNS 66
4.3.2 使用 Python 进行 DNS 查询 66
4.3.3 解析邮箱域名 68
4.4 小结 70
第 5 章 网络数据与网络错误 71
5.1 字节与字符串 71
5.1.1 字符串 72
5.1.2 二进制数与网络字节顺序 75
5.2 封帧与引用 77
5.3 pickle 与自定义定界符的格式 82
5.4 XML 与 JSON 83
5.5 压缩 84
5.6 网络异常 85
5.6.1 抛出更具体的异常 87
5.6.2 捕捉与报告网络异常 87
5.7 小结 88
第 6 章 TLS/SSL 90
6.1 TLS 无法保护的信息 90
6.2 可能出问题的地方 91
6.3 生成证书 93
6.4 TLS 负载移除 . 95
6.5 Python 3.4 默认上下文 96
6.6 手动选择加密算法与完美前向安全 102
6.7 支持 TLS 的协议 104
6.8 了解细节 105
6.9 小结 111
第 7 章 服务器架构 112
7.1 浅谈部署 112
7.2 一个简单的协议 114
7.3 单线程服务器 117
7.4 多线程与多进程服务器 120
7.5 异步服务器 122
7.5.1 回调风格的 asyncio 126
7.5.2 协程风格的 asyncio 127
7.5.3 遗留模块 asyncore 129
7.5.4 两全其美的方法 130
7.6 在 inetd 下运行 131
7.7 小结 133
第 8 章 缓存与消息队列 134
8.1 使用 Memcached 134
8.2 散列与分区 137
8.3 消息队列 140
8.4 小结 145
第 9 章 HTTP 客户端 147
9.1 Python 客户端库 147
9.2 端口、加密与封帧 149
9.3 方法 151
9.4 路径与主机 152
9.5 状态码 152
9.6 缓存与验证 155
9.7 传输编码 157
9.8 内容协商 158
9.9 内容类型 160
9.10 HTTP 认证 160
9.11 cookie 162
9.12 连接、Keep-Alive 和 httplib 163
9.13 小结 164
第 10 章 HTTP 服务器 166
10.1 WSGI 166
10.2 异步服务器与框架 168
10.3 前向代理与反向代理 169
10.4 4 种架构 170
10.4.1 在 Apache 下运行 Python 171
10.4.2 纯粹的 Python HTTP服务器的兴起 172
10.4.3 反向代理的优势 172
10.5 平台即服务 173
10.6 GET 与 POST 模式和 REST 的问题 174
10.7 不使用 Web 框架编写 WSGI 可调用对象 176
10.8 小结 180
第 11 章 万维网 181
11.1 超媒体与 URL 181
11.1.1 解析与构造 URL 182
11.1.2 相对 URL 184
11.2 超文本标记语言 186
11.3 读写数据库 189
11.4 一个糟糕的 Web 应用程序(使用 Flask) 190
11.5 表单和 HTTP 方法 195
11.5.1 表单使用了错误方法的情况 197
11.5.2 安全的 cookie 与不安全的 cookie 198
11.5.3 非持久型跨站脚本 200
11.5.4 持久型跨站脚本 201
11.5.5 跨站请求伪造 202
11.5.6 改进的应用程序 203
11.6 使用 Django 编写的账单应用程序 205
11.7 选择 Web 框架 209
11.8 WebSocket 210
11.9 网络抓取 211
11.9.1 获取页面 212
11.9.2 抓取页面 215
11.9.3 递归抓取 217
11.10 小结 221
第 12 章 电子邮件的构造与解析 222
12.1 电子邮件消息格式 222
12.2 构造电子邮件消息 224
12.3 添加 HTML 与多媒体 226
12.4 添加内容 231
12.5 解析电子邮件消息 232
12.6 遍历 MIME 部件 234
12.7 邮件头编码 236
12.8 解析日期 237
12.9 小结 238
第 13 章 SMTP 239
13.1 电子邮件客户端与 Web 邮件服务 239
13.1.1 最开始使用命令行发送电子邮件 239
13.1.2 客户端的兴起 240
13.1.3 转移到 Web 邮件 241
13.2 SMTP 的使用方法 243
13.2.1 发送电子邮件 244
13.2.2 邮件头与信封接收者 245
13.2.3 多跳 246
13.3 SMTP 库简介 247
13.4 错误处理与会话调试 248
13.5 从 EHLO 获取信息 251
13.6 使用安全套接层和传输层安全协议 253
13.7 认证的 SMTP 255
13.8 关于 SMTP 的小贴士 257
13.9 小结 257
第 14 章 POP 258
14.1 POP 服务器的兼容性 258
14.2 连接与认证 259
14.3 获取邮箱信息 261
14.4 消息的下载与删除 263
14.5 小结 265
第 15 章 IMAP 266
15.1 在 Python 中使用 IMAP 267
15.1.1 IMAPClient 269
15.1.2 查看文件夹 271
15.1.3 消息号与 UID 272
15.1.4 消息范围 272
15.1.5 摘要信息 272
15.1.6 下载整个邮箱 274
15.1.7 单独下载消息 276
15.1.8 标记并删除消息 281
15.1.9 删除消息 282
15.1.10 搜索 282
15.1.11 操作文件夹与消息 284
15.1.12 异步性 285
15.2 小结 285
第 16 章 Telnet 和 SSH 286
16.1 命令行自动化 286
16.1.1 命令行扩展与引用 287
16.1.2 UNIX 命令行参数几乎可以包含任意字符 288
16.1.3 对字符进行引用 290
16.1.4 糟糕的 Windows 命令行 291
16.1.5 终端的特别之处 292
16.1.6 终端的缓冲行为 295
16.2 Telnet 296
16.3 SSH:安全 shell 300
16.3.1 SSH 概述 300
16.3.2 SSH 主机密钥 301
16.3.3 SSH 认证 303
16.3.4 shell 会话与独立命令 304
16.3.5 SFTP:通过 SSH 进行文件传输 308
16.3.6 其他特性 310
16.4 小结 311
第 17 章 FTP 313
17.1 何时不使用 FTP 313
17.1.1 通信信道 314
17.1.2 在 Python 中使用 FTP 315
17.1.3 ASCII 和二进制文件 316
17.1.4 二进制下载进阶功能介绍 318
17.1.5 上传数据 319
17.1.6 二进制上传进阶功能介绍 320
17.1.7 错误处理 321
17.1.8 目录扫描 322
17.1.9 目录检测以及递归下载 324
17.1.10 目录的创建以及文件和目录的删除 326
17.1.11 安全地操作 FTP 326
17.2 小结 326
第 18 章 RPC 328
18.1 RPC 的特性 329
18.1.1 XML-RPC 330
18.1.2 JSON-RPC 336
18.1.3 自文档的数据 339
18.1.4 关于对象:Pyro 和 RPyC 340
18.1.5 RPyC 例子 341
18.1.6 RPC、Web 框架和消息
队列 343
18.1.7 从网络错误中恢复 344
18.2 小结 344
网络世界的基石:深入解析现代网络通信的原理与实践 在数字浪潮席卷全球的今天,网络通信早已不再是遥不可及的神秘领域,而是支撑着我们日常生活、工作乃至整个社会运转的基石。从每一次网页的加载,到每一次即时消息的传递,背后都凝聚着无数精巧的网络协议和高效的编程实践。本书旨在为读者揭示网络通信的底层奥秘,并通过一系列贴近实际的案例,带领大家掌握构建强大、可靠、高效网络应用的必备技能。 我们身处一个互联互通的时代,信息的交换、数据的传输、服务的提供,无不依赖于纵横交错的网络。理解网络的工作原理,掌握网络编程的技巧,已成为现代软件工程师不可或缺的核心竞争力。无论你是初涉网络编程的开发者,还是希望深入理解网络底层机制的资深工程师,本书都能为你提供宝贵的知识和实用的指导。 网络协议的演进与核心组件 网络通信并非凭空产生,而是遵循着一系列既定的规则,即网络协议。本书将从最基础的网络模型入手,详细阐述TCP/IP协议族的演进历程及其核心组成部分。我们将深入剖析IP协议如何实现全球范围内的地址分配和数据包路由,理解TCP协议如何保障数据的可靠传输、流量控制和拥塞避免,以及UDP协议在追求低延迟和高吞吐量场景下的独特优势。 了解这些基础协议,就好比掌握了建造高楼大厦的地基。我们将逐一讲解IP地址的版本(IPv4与IPv6)及其地址规划,ARP协议如何实现IP地址与MAC地址的映射,ICMP协议在网络诊断中的作用,以及DNS协议如何将人类可读的域名解析为机器可识别的IP地址。这些协议的相互协作,构成了互联网通信的骨架。 传输层:可靠性与效率的平衡艺术 传输层是网络通信中承上启下的关键环节,它在应用层和网络层之间架起了桥梁。本书将重点讲解TCP和UDP这两个传输层协议的内部机制。对于TCP,我们将深入探讨其三次握合与四次挥手的连接建立与关闭过程,理解序列号、确认应答、超时重传等机制如何确保数据的按序、无差错到达。我们还会详细解析滑动窗口机制如何实现流量控制,以及慢启动、拥塞避免、快重传、快恢复等算法如何动态地适应网络拥塞状况,实现传输效率的最大化。 对于UDP,虽然它不提供可靠性保证,但在需要极低延迟的应用中,如实时音视频传输、在线游戏等,其轻量级和高效性显得尤为重要。本书将阐述UDP的报文结构,以及如何通过应用层设计来弥补UDP在可靠性上的不足。 应用层协议:构建丰富多彩的网络服务 在TCP/IP协议族的支持下,各种各样的应用层协议应运而生,它们定义了不同网络应用的数据交换格式和通信规则。本书将精选最具代表性的应用层协议进行深入讲解。 HTTP/HTTPS:万维网的基石。我们将详细解析HTTP协议的请求方法(GET, POST等)、状态码、头部信息,理解HTTP/1.0, HTTP/1.1, HTTP/2以及HTTP/3在性能和功能上的演进。对于HTTPS,我们将探讨SSL/TLS协议的工作原理,理解证书验证、对称加密与非对称加密在保护数据传输安全中的作用。 DNS:互联网的电话簿。理解DNS协议的工作流程,包括递归查询与迭代查询,以及各种DNS记录类型(A, AAAA, MX, CNAME等)的含义和用途,对于构建和管理网络服务至关重要。 FTP/SFTP:文件传输的标准。我们将介绍FTP协议的控制连接与数据连接分离的工作模式,以及SFTP(SSH File Transfer Protocol)作为一种更安全的替代方案。 SMTP/POP3/IMAP:电子邮件的沟通之道。理解电子邮件是如何通过这三种协议在服务器之间传递、用户如何接收和管理邮件的完整流程。 Socket API:编程接口的核心。本书的重点之一将是深入讲解Socket API,这是绝大多数网络编程的起点。我们将通过大量的代码示例,演示如何使用Socket API创建TCP客户端和服务器,以及UDP客户端和服务器。从创建Socket、绑定端口、监听连接,到接受连接、发送和接收数据,再到关闭连接,我们将一步步引导读者掌握Socket编程的精髓。 并发与多线程:应对高并发网络请求的挑战 现代网络应用需要处理大量的并发连接。本书将系统地介绍处理高并发网络请求的常见技术和策略。 多线程编程:讲解如何使用线程来处理独立的客户端请求,避免一个客户端的阻塞影响其他客户端。我们将探讨线程的创建、同步、互斥锁、条件变量等概念,以及如何在网络编程中合理运用多线程。 多进程编程:介绍多进程模型在某些场景下的优势,如更高的隔离性。但也会讨论进程间通信的复杂性。 I/O多路复用:这是处理大量并发连接的关键技术。我们将深入讲解`select`、`poll`和`epoll`(在Linux环境下)的工作原理,理解它们如何在一个线程或进程中同时监控多个文件描述符(Socket)的状态,从而高效地处理并发I/O。我们将提供使用这些机制实现的并发服务器示例。 异步I/O:介绍更高级的异步I/O模型,它允许程序在等待I/O操作完成的同时执行其他任务,进一步提升系统吞吐量和响应能力。 网络安全基础:构建安全的网络应用 在日益复杂的网络环境中,网络安全已成为重中之重。本书将触及网络安全的基础知识,帮助读者建立安全意识,并在编程实践中加以考虑。 常见网络攻击:简要介绍常见的网络攻击类型,如DDoS攻击、SQL注入、XSS攻击等,让读者了解潜在的威胁。 加密技术:再次强调SSL/TLS在传输层加密中的作用,以及对称加密和非对称加密在数据安全中的应用。 身份验证与授权:探讨如何在网络应用中实现用户身份的验证和权限的控制,确保只有合法用户才能访问特定资源。 安全编码实践:提供一些基本的安全编码建议,帮助读者避免在编程过程中引入安全漏洞。 实战案例与进阶主题 理论知识的学习离不开实践的巩固。本书将贯穿丰富的实战案例,帮助读者将所学知识转化为实际技能。 简单的聊天室应用:从零开始构建一个基于TCP的客户端/服务器聊天室,实现多用户在线聊天功能,这是理解Socket编程和并发处理的经典案例。 HTTP客户端的实现:演示如何编写一个HTTP客户端,发送HTTP请求,解析响应,这有助于深入理解HTTP协议。 文件服务器的开发:构建一个简单的文件服务器,支持文件的上传和下载,进一步练习Socket编程和I/O操作。 其他进阶主题的探讨:根据读者的需求和兴趣,本书还会对一些更高级的网络编程主题进行初步探讨,例如: 网络框架的使用:简要介绍当前流行的网络编程框架(如Twisted, asyncio等),展示它们如何简化复杂网络应用的开发。 网络性能调优:提供一些关于如何优化网络应用性能的建议,包括选择合适的协议、调整缓冲区大小、减少网络延迟等。 网络协议的自定义:在特定场景下,如何设计和实现自定义的网络协议。 学习路径与方法 本书的设计旨在循序渐进,从最基础的概念讲起,逐步深入到复杂的实现。建议读者在学习过程中: 1. 理解基础协议:确保对TCP/IP协议族的核心协议有清晰的认识。 2. 掌握Socket API:通过大量的代码示例,动手实践Socket编程。 3. 学习并发处理:理解多线程、多进程以及I/O多路复用的原理,并尝试实现。 4. 关注安全问题:在开发过程中始终将安全性放在重要位置。 5. 多做实验:通过修改代码、观察现象,加深对网络通信过程的理解。 6. 参考官方文档:对于具体的API和协议,参考权威的官方文档是必不可少的。 掌握网络编程,就是掌握了构建数字世界连接的钥匙。本书将陪伴您在这条探索网络通信奥秘的道路上,提供坚实的理论基础和丰富的实践指导,帮助您成为一名出色的网络工程师。愿您在掌握了网络世界的基石之后,能够创造出更加精彩、高效、安全的网络应用,驱动数字时代的不断前进。