本書針對想要深入理解使用Python來解決網(wǎng)絡(luò)相關(guān)問題或是構(gòu)建網(wǎng)絡(luò)應(yīng)用程序的技術(shù)人員,結(jié)合實(shí)例講解了網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)數(shù)據(jù)及錯(cuò)誤、電子郵件、服務(wù)器架構(gòu)和HTTP及Web應(yīng)用程序等經(jīng)典話題。具體內(nèi)容包括:全面介紹Python3中新提供的SSL支持,異步I/O循環(huán)的編寫,用Flask框架在Python代碼中配置URL,跨站腳本以及跨站請求偽造攻擊網(wǎng)站的原理及保護(hù)方法,等等。
本書采用Python 3,涵蓋網(wǎng)絡(luò)編程所有經(jīng)典話題,包括網(wǎng)絡(luò)協(xié)議、網(wǎng)絡(luò)數(shù)據(jù)及錯(cuò)誤、電子郵件、服務(wù)器架構(gòu),以及HTTP及Web應(yīng)用程序,對新的SSL支持、異步I/O循環(huán)的編寫方法、跨站腳本以及跨站請求偽造攻擊網(wǎng)站的原理及保護(hù)方法等內(nèi)容也有詳盡介紹。
本書既適合想要深入理解使用Python來解決網(wǎng)絡(luò)相關(guān)的問題或是構(gòu)建網(wǎng)絡(luò)應(yīng)用程序的Python程序員,也適合所有Web應(yīng)用程序開發(fā)人員、系統(tǒng)集成者或系統(tǒng)管理員。
Brandon Rhodes,Dropbox工程師,早期使用Python的程序員之一,熱心于傳播Python,經(jīng)常在各類Python主題大會(huì)上演講。
John Goerzen,eFolder公司IT與工程部副總裁,同時(shí)也是具有影響力的作家、系統(tǒng)管理者和Python程序員,自1996年起就是Debian GNU/Linux操作系統(tǒng)開發(fā)組的成員,擁有近20年的軟件開發(fā)經(jīng)驗(yàn)。
第 1 章 客戶端/服務(wù)器網(wǎng)絡(luò)編程簡介 1
1.1 基礎(chǔ):協(xié)議棧與庫 1
1.2 應(yīng)用層 4
1.3 協(xié)議的使用 5
1.4 一個(gè)原始的網(wǎng)絡(luò)會(huì)話 6
1.5 層層深入 8
1.6 編碼與解碼 9
1.7 網(wǎng)際協(xié)議 10
1.8 IP 地址 11
1.9 路由 12
1.10 數(shù)據(jù)包分組 13
1.11 進(jìn)一步學(xué)習(xí) IP 14
1.12 小結(jié) 15
第 2 章 UDP 16
2.1 端口號(hào) 17
2.2 套接字 18
2.2.1 混雜客戶端與垃圾回復(fù) 22
2.2.2 不可靠性、退避、阻塞和超時(shí) 23
2.2.3 連接 UDP 套接字 27
2.2.4 請求 ID:好主意 28
2.3 綁定接口 29
2.4 UDP 分組 31
2.5 套接字選項(xiàng) 33
2.6 廣播 33
2.7 小結(jié) 35
第 3 章 TCP 37
3.1 TCP 工作原理 37
3.2 何時(shí)使用 TCP 38
3.3 TCP 套接字的含義 39
3.4 一個(gè)簡單的 TCP 客戶端和服務(wù)器 40
3.4.1 每個(gè)會(huì)話使用一個(gè)套接字 43
3.4.2 地址已被占用 44
3.5 綁定接口 46
3.6 死鎖 46
3.7 已關(guān)閉連接,半開連接 51
3.8 像使用文件一樣使用 TCP 流 52
3.9 小結(jié) 53
第 4 章 套接字名與 DNS 54
4.1 主機(jī)名與套接字 54
4.1.1 套接字的 5 個(gè)坐標(biāo) 55
4.1.2 IPv6 56
4.2 現(xiàn)代地址解析 57
4.2.1 使用 getaddrinfo() 為服務(wù)器
綁定端口 58
4.2.2 使用 getaddrinfo() 連接服務(wù) 59
4.2.3 使用 getaddrinfo() 請求規(guī)范主機(jī)名 60
4.2.4 其他 getaddrinfo() 標(biāo)記 61
4.2.5 原始的名稱服務(wù)程序 62
4.2.6 在代碼中使用 getsockaddr() 62
4.3 DNS 協(xié)議 64
4.3.1 為何不使用原始 DNS 66
4.3.2 使用 Python 進(jìn)行 DNS 查詢 66
4.3.3 解析郵箱域名 68
4.4 小結(jié) 70
第 5 章 網(wǎng)絡(luò)數(shù)據(jù)與網(wǎng)絡(luò)錯(cuò)誤 71
5.1 字節(jié)與字符串 71
5.1.1 字符串 72
5.1.2 二進(jìn)制數(shù)與網(wǎng)絡(luò)字節(jié)順序 75
5.2 封幀與引用 77
5.3 pickle 與自定義定界符的格式 82
5.4 XML 與 JSON 83
5.5 壓縮 84
5.6 網(wǎng)絡(luò)異常 85
5.6.1 拋出更具體的異常 87
5.6.2 捕捉與報(bào)告網(wǎng)絡(luò)異常 87
5.7 小結(jié) 88
第 6 章 TLS/SSL 90
6.1 TLS 無法保護(hù)的信息 90
6.2 可能出問題的地方 91
6.3 生成證書 93
6.4 TLS 負(fù)載移除 . 95
6.5 Python 3.4 默認(rèn)上下文 96
6.6 手動(dòng)選擇加密算法與完美前向安全 102
6.7 支持 TLS 的協(xié)議 104
6.8 了解細(xì)節(jié) 105
6.9 小結(jié) 111
第 7 章 服務(wù)器架構(gòu) 112
7.1 淺談部署 112
7.2 一個(gè)簡單的協(xié)議 114
7.3 單線程服務(wù)器 117
7.4 多線程與多進(jìn)程服務(wù)器 120
7.5 異步服務(wù)器 122
7.5.1 回調(diào)風(fēng)格的 asyncio 126
7.5.2 協(xié)程風(fēng)格的 asyncio 127
7.5.3 遺留模塊 asyncore 129
7.5.4 兩全其美的方法 130
7.6 在 inetd 下運(yùn)行 131
7.7 小結(jié) 133
第 8 章 緩存與消息隊(duì)列 134
8.1 使用 Memcached 134
8.2 散列與分區(qū) 137
8.3 消息隊(duì)列 140
8.4 小結(jié) 145
第 9 章 HTTP 客戶端 147
9.1 Python 客戶端庫 147
9.2 端口、加密與封幀 149
9.3 方法 151
9.4 路徑與主機(jī) 152
9.5 狀態(tài)碼 152
9.6 緩存與驗(yàn)證 155
9.7 傳輸編碼 157
9.8 內(nèi)容協(xié)商 158
9.9 內(nèi)容類型 160
9.10 HTTP 認(rèn)證 160
9.11 cookie 162
9.12 連接、Keep-Alive 和 httplib 163
9.13 小結(jié) 164
第 10 章 HTTP 服務(wù)器 166
10.1 WSGI 166
10.2 異步服務(wù)器與框架 168
10.3 前向代理與反向代理 169
10.4 4 種架構(gòu) 170
10.4.1 在 Apache 下運(yùn)行 Python 171
10.4.2 純粹的 Python HTTP服務(wù)器的興起 172
10.4.3 反向代理的優(yōu)勢 172
10.5 平臺(tái)即服務(wù) 173
10.6 GET 與 POST 模式和 REST 的問題 174
10.7 不使用 Web 框架編寫 WSGI 可調(diào)用對象 176
10.8 小結(jié) 180
第 11 章 萬維網(wǎng) 181
11.1 超媒體與 URL 181
11.1.1 解析與構(gòu)造 URL 182
11.1.2 相對 URL 184
11.2 超文本標(biāo)記語言 186
11.3 讀寫數(shù)據(jù)庫 189
11.4 一個(gè)糟糕的 Web 應(yīng)用程序(使用 Flask) 190
11.5 表單和 HTTP 方法 195
11.5.1 表單使用了錯(cuò)誤方法的情況 197
11.5.2 安全的 cookie 與不安全的 cookie 198
11.5.3 非持久型跨站腳本 200
11.5.4 持久型跨站腳本 201
11.5.5 跨站請求偽造 202
11.5.6 改進(jìn)的應(yīng)用程序 203
11.6 使用 Django 編寫的賬單應(yīng)用程序 205
11.7 選擇 Web 框架 209
11.8 WebSocket 210
11.9 網(wǎng)絡(luò)抓取 211
11.9.1 獲取頁面 212
11.9.2 抓取頁面 215
11.9.3 遞歸抓取 217
11.10 小結(jié) 221
第 12 章 電子郵件的構(gòu)造與解析 222
12.1 電子郵件消息格式 222
12.2 構(gòu)造電子郵件消息 224
12.3 添加 HTML 與多媒體 226
12.4 添加內(nèi)容 231
12.5 解析電子郵件消息 232
12.6 遍歷 MIME 部件 234
12.7 郵件頭編碼 236
12.8 解析日期 237
12.9 小結(jié) 238
第 13 章 SMTP 239
13.1 電子郵件客戶端與 Web 郵件服務(wù) 239
13.1.1 最開始使用命令行發(fā)送電子郵件 239
13.1.2 客戶端的興起 240
13.1.3 轉(zhuǎn)移到 Web 郵件 241
13.2 SMTP 的使用方法 243
13.2.1 發(fā)送電子郵件 244
13.2.2 郵件頭與信封接收者 245
13.2.3 多跳 246
13.3 SMTP 庫簡介 247
13.4 錯(cuò)誤處理與會(huì)話調(diào)試 248
13.5 從 EHLO 獲取信息 251
13.6 使用安全套接層和傳輸層安全協(xié)議 253
13.7 認(rèn)證的 SMTP 255
13.8 關(guān)于 SMTP 的小貼士 257
13.9 小結(jié) 257
第 14 章 POP 258
14.1 POP 服務(wù)器的兼容性 258
14.2 連接與認(rèn)證 259
14.3 獲取郵箱信息 261
14.4 消息的下載與刪除 263
14.5 小結(jié) 265
第 15 章 IMAP 266
15.1 在 Python 中使用 IMAP 267
15.1.1 IMAPClient 269
15.1.2 查看文件夾 271
15.1.3 消息號(hào)與 UID 272
15.1.4 消息范圍 272
15.1.5 摘要信息 272
15.1.6 下載整個(gè)郵箱 274
15.1.7 單獨(dú)下載消息 276
15.1.8 標(biāo)記并刪除消息 281
15.1.9 刪除消息 282
15.1.10 搜索 282
15.1.11 操作文件夾與消息 284
15.1.12 異步性 285
15.2 小結(jié) 285
第 16 章 Telnet 和 SSH 286
16.1 命令行自動(dòng)化 286
16.1.1 命令行擴(kuò)展與引用 287
16.1.2 UNIX 命令行參數(shù)幾乎可以包含任意字符 288
16.1.3 對字符進(jìn)行引用 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 主機(jī)密鑰 301
16.3.3 SSH 認(rèn)證 303
16.3.4 shell 會(huì)話與獨(dú)立命令 304
16.3.5 SFTP:通過 SSH 進(jìn)行文件傳輸 308
16.3.6 其他特性 310
16.4 小結(jié) 311
第 17 章 FTP 313
17.1 何時(shí)不使用 FTP 313
17.1.1 通信信道 314
17.1.2 在 Python 中使用 FTP 315
17.1.3 ASCII 和二進(jìn)制文件 316
17.1.4 二進(jìn)制下載進(jìn)階功能介紹 318
17.1.5 上傳數(shù)據(jù) 319
17.1.6 二進(jìn)制上傳進(jìn)階功能介紹 320
17.1.7 錯(cuò)誤處理 321
17.1.8 目錄掃描 322
17.1.9 目錄檢測以及遞歸下載 324
17.1.10 目錄的創(chuàng)建以及文件和目錄的刪除 326
17.1.11 安全地操作 FTP 326
17.2 小結(jié) 326
第 18 章 RPC 328
18.1 RPC 的特性 329
18.1.1 XML-RPC 330
18.1.2 JSON-RPC 336
18.1.3 自文檔的數(shù)據(jù) 339
18.1.4 關(guān)于對象:Pyro 和 RPyC 340
18.1.5 RPyC 例子 341
18.1.6 RPC、Web 框架和消息
隊(duì)列 343
18.1.7 從網(wǎng)絡(luò)錯(cuò)誤中恢復(fù) 344
18.2 小結(jié) 344