第1章 建立套接字 1
1.1 Ruby的套接字库 1
1.2创建首个套接字 1
1.3什么是端点 2
1.4环回地址 3
1.5 IPv6 3
1.6端口 4
1.7创建第二个套接字 5
1.8文档 6
1.9本章涉及的系统调用 7
第2章 建立连接 8
第3章 服务器生命周期 9
3.1服务器绑定 9
3.1.1该绑定到哪个端口 10
3.1.2该绑定到哪个地址 11
3.2服务器侦听 12
3.2.1侦听队列 13
3.2.2侦听队列的长度 13
3.3接受连接 14
3.3.1以阻塞方式接受连接 15
3.3.2 accept调用返回一个数组 15
3.3.3连接类 17
3.3.4文件描述符 17
3.3.5连接地址 18
3.3.6 accept循环 18
3.4关闭服务器 19
3.4.1退出时关闭 19
3.4.2不同的关闭方式 20
3.5 Ruby包装器 22
3.5.1服务器创建 22
3.5.2连接处理 24
3.5.3合而为一 25
3.6本章涉及的系统调用 25
第4章 客户端生命周期 27
4.1客户端绑定 28
4.2客户端连接 28
4.3 Ruby包装器 30
4.4本章涉及的系统调用 32
第5章 交换数据 33
第6章 套接字读操作 36
6.1简单的读操作 36
6.2没那么简单 37
6.3读取长度 38
6.4阻塞的本质 39
6.5 EOF事件 39
6.6部分读取 41
6.7本章涉及的系统调用 43
第7章 套接字写操作 44
第8章 缓冲 45
8.1写缓冲 45
8.2该写入多少数据 46
8.3读缓冲 47
8.4该读取多少数据 47
第9章 第一个客户端/服务器 49
9.1服务器 49
9.2客户端 51
9.3投入运行 52
9.3分析 52
第10章 套接字选项 54
10.1 SO_TYPE 54
10.2 SO_REUSE_ADDR 55
10.3本章涉及的系统调用 56
第11章 非阻塞式IO 57
11.1非阻塞式读操作 57
11.2非阻塞式写操作 60
11.3非拥塞式接收 62
11.4非拥塞式连接 63
第12章 连接复用 65
12.1 select(2) 66
12.2读/写之外的事件 68
12.2.1 EOF 69
12.2.2 accept 69
12.2.3 connect 69
12.3高性能复用 72
第13章 Nagle算法 74
第14章 消息划分 76
14.1使用新行 77
14.2使用内容长度 79
第15章 超时 81
15.1不可用的选项 81
15.2IO.select 82
15.3接受超时 83
15.4连接超时 83
第16章 DNS查询 85
第17章 SSL套接字 87
第18章 紧急数据 92
18.1发送紧急数据 93
18.2接受紧急数据 93
18.3局限 94
18.4紧急数据和IO.select 95
18.5 SO_OOBINLINE选项 96
第19章 网络架构模式 97
第20章 串行化 101
20.1讲解 101
20.2实现 101
20.3思考 105
第21章 单连接进程 107
21.1讲解 107
21.2实现 108
21.3思考 111
21.4案例 111
第22章 单连接线程 112
22.1讲解 112
22.2实现 113
22.3思考 116
22.4案例 117
第23章 Preforking 118
23.1讲解 118
23.2实现 119
23.3思考 123
23.4案例 124
第24章 线程池 125
24.1讲解 125
24.2实现 125
24.3思考 129
24.4案例 130
第25章 事件驱动 131
25.1讲解 131
25.2实现 133
25.3思考 140
25.4案例 142
第26章 混合模式 143
26.1 nginx 143
26.2 Puma 144
26.3 EventMachine 145
第27章 结语 147