第1章 TCP/IP概述 1
1.1 网络互联与TCP/IP 1
1.1.1 计算机网络 1
1.1.2 网络互联 2
1.1.3 TCP/IP协议栈 3
1.2 网络协议的分层 4
1.2.1 分层的网络体系结构 4
1.2.2 TCP/IP模型 7
1.2.3 多路复用和分解 7
1.2.4 TCP/IP编址 8
1.3 TCP/IP协议栈及其分析 9
1.3.1 TCP/IP协议栈 9
1.3.2 协议栈的处理流程 10
1.3.3 设备驱动程序和输入输出程序 11
1.3.4 网络接口层处理程序 12
1.3.5 IP层处理程序 12
1.3.6 传输层处理程序 13
1.3.7 应用编程接口 13
1.4 本书的代码组织 14
1.4.1 研究代码的重要性 14
1.4.2 XINU的TCP/IP协议栈源代码 14
1.4.3 应用层示例源代码 15
习题 15
第2章 底层技术 16
2.1 HDLC协议 16
2.1.1 HDLC协议介绍 16
2.1.2 帧格式 16
2.1.3 帧类型和HDLC操作 17
2.1.4 HDLC协议的应用 18
2.2 PPP 18
2.2.1 SLIP与PPP 18
2.2.2 PPP组件 19
2.2.3 PPP的帧格式 19
2.2.4 PPP工作流程 20
2.2.5 PPP应用 20
2.3 以太网及IEEE 802.3 21
2.3.1 以太网技术 21
2.3.2 CSMA/CD 21
2.3.3 帧格式 21
2.4 无线局域网及IEEE 802.11 22
2.4.1 无线局域网简介 22
2.4.2 CSMA/CA 23
2.4.3 IEEE 802.11帧格式 24
2.5 网卡驱动和网络接口层的实现 25
2.5.1 以太网接口数据结构 25
2.5.2 以太网网卡驱动程序 26
2.5.3 网络接口层数据结构 28
2.5.4 网络接口层处理流程 31
2.5.5 网络接口层的多路分解 32
2.5.6 网络初始化 34
习题 39
第3章 ARP 41
3.1 ARP的基本原理 41
3.2 ARP报文格式和封装 41
3.2.1 ARP报文格式 41
3.2.2 ARP报文结构的实现 42
3.3 ARP软件整体结构 43
3.4 ARP输入处理 44
3.5 发送ARP请求报文 48
3.6 ARP缓冲区的管理 51
3.6.1 ARP缓冲区结构的实现 51
3.6.2 ARP缓冲区维护函数 52
3.7 ARP攻击 55
习题 55
第4章 IP 56
4.1 IP的基本原理 56
4.2 IP数据报格式 56
4.2.1 IP数据报格式 56
4.2.2 IP数据报结构的实现 57
4.3 IP软件整体结构 59
4.4 IP输入处理 61
4.4.1 IP进程的实现 61
4.4.2 IP定向广播 66
4.5 IP输出处理 70
4.5.1 IP输出处理 70
4.5.2 将IP数据报交付上层协议 74
4.6 IP数据报的分片与重组 76
4.6.1 分片结构的实现 76
4.6.2 IP数据报分片 77
4.6.3 IP数据报重组 79
4.7 IP选路 85
4.7.1 路由表基本结构 86
4.7.2 路由选择 87
4.7.3 路由重定向的实现 89
4.8 IPv6 91
习题 92
第5章 ICMP 93
5.1 ICMP的基本原理 93
5.2 ICMP报文格式 93
5.2.1 ICMP报文格式 93
5.2.2 ICMP报文结构的实现 94
5.3 ICMP软件整体结构 96
5.4 ICMP输入处理 96
5.4.1 ICMP输入处理函数 96
5.4.2 ICMP重定向报文的处理 101
5.5 发送ICMP报文 103
5.6 PING程序的实现 107
5.7 ICMPv6 108
习题 108
第6章 IGMP 109
6.1 IGMP的基本原理 109
6.2 IGMP报文格式 109
6.2.1 IGMP报文格式 109
6.2.2 IGMP报文结构的实现 110
6.3 IGMP软件整体结构 110
6.4 主机端的IGMP输入处理 111
6.5 IGMP事件处理进程 117
6.6 主机群表的建立与维护 118
6.7 路由器端IGMP实现概述 123
习题 125
第7章 RIP 126
7.1 RIP的基本原理 126
7.2 RIP报文格式 127
7.2.1 RIP报文格式 127
7.2.2 RIP报文结构的实现 127
7.3 RIP软件整体结构 129
7.4 RIP输入处理 129
7.4.1 RIP输入进程的实现 129
7.4.2 RIP通告报文的处理 132
7.4.3 RIP请求报文的处理 134
7.5 RIP报文输出进程 136
7.5.1 RIP接口输出控制结构 136
7.5.2 RIP输出进程的实现 137
7.5.3 发送一个RIP通告报文 139
7.5.4 构造RIP通告报文 141
7.5.5 为RIP通告报文计算路由度量值 143
7.6 路由表的更新与维护 144
7.6.1 路由表项的添加 144
7.6.2 路由表项的定时维护 150
7.7 OSPF 153
习题 154
第8章 UDP 155
8.1 UDP的基本原理 155
8.2 UDP数据报格式 155
8.2.1 UDP数据报格式 155
8.2.2 UDP数据报结构的实现 156
8.3 UDP软件整体结构 157
8.4 UDP输入处理 157
8.5 UDP输出处理 160
8.6 Traceroute程序的实现 163
习题 163
第9章 TCP 164
9.1 TCP的基本原理 164
9.2 TCP报文段格式 165
9.2.1 TCP报文段格式 165
9.2.2 TCP报文段结构的实现 166
9.3 TCP软件整体结构 167
9.4 TCP控制块结构 169
9.5 TCP状态机的实现 173
9.6 TCP输入进程及输入状态机 175
9.6.1 TCP输入进程的实现 175
9.6.2 TCP输入状态机 178
9.6.3 TCP对输入数据的处理 189
9.6.4 输入ACK报文段的处理 192
9.7 TCP输出进程及输出状态机 195
9.7.1 TCP输出进程 195
9.7.2 TCP输出状态机的实现 197
9.7.3 发送TCP报文段 204
9.8 流量控制和拥塞控制 210
9.8.1 设定发送方窗口通告值 210
9.8.2 设定接收方窗口通告值 212
9.8.3 估算往返时延并设定重传时间和拥塞窗口 214
9.9 TCP定时器管理 216
9.9.1 TCP定时结构 217
9.9.2 TCP定时进程的实现 217
习题 220
第10章 网络应用编程接口 221
10.1 网络应用程序 221
10.2 网络应用模式 221
10.3 网络编程接口 223
10.3.1 Socket编程基本概念 223
10.3.2 Socket地址结构 227
10.3.3 Socket接口函数 227
10.3.4 Socket编程模型 230
10.4 多线程编程 231
10.4.1 线程创建 231
10.4.2 线程属性 231
10.4.3 线程同步 232
10.4.4 线程取消 235
10.4.5 线程终止 236
10.5 I/O编程 236
10.5.1 I/O模型 236
10.5.2 高级I/O函数 239
10.5.3 非阻塞I/O 241
10.5.4 I/O复用 242
习题 244
第11章 网络应用编程实例 245
11.1 UDP套接字的简单应用——TIME的实现 245
11.1.1 TIME简介 245
11.1.2 TIME客户端程序 245
11.1.3 connectUDP()函数 248
11.1.4 connectsock()函数 248
11.1.5 TIME服务器端程序 251
11.1.6 passivesock()函数 253
11.2 TCP套接字的简单应用——DAYTIME的实现 255
11.2.1 DAYTIME简介 255
11.2.2 DAYTIME客户端程序 256
11.2.3 DAYTIME服务器端程序 257
11.3 利用多路I/O和多线程编程——ECHO的实现 260
11.3.1 ECHO简介 260
11.3.2 ECHO客户端程序 260
11.3.3 ECHO服务器端程序 263
11.3.4 tcp_listen()函数 266
11.4 网络客户端实例(1)——TELNET客户端的实现 268
11.4.1 TELNET简介 268
11.4.2 TELNET协议数据结构 269
11.4.3 TELNET客户端程序 273
11.4.4 telnet()函数 274
11.4.5 connectTCP()函数 278
11.4.6 ttwrite()函数 278
11.4.7 sowrite()函数 279
11.5 网络客户端实例(2)——TFTP客户端的实现 280
11.5.1 TFTP简介 280
11.5.2 TFTP报文首部数据结构 282
11.5.3 TFTP客户端程序 283
11.5.4 command()函数 287
11.5.5 recvfile()函数 288
11.5.6 sendfile()函数 293
11.5.7 makerequest()函数 298
11.5.8 nak()函数 298
11.6 原始套接字的应用——PING的实现 300
11.6.1 PING简介 300
11.6.2 PING程序主函数的处理流程 301
11.6.3 catcher()函数 311
11.6.4 pinger()函数 313
11.6.5 pr_pack()函数 315
11.6.6 in_cksum()函数 322
11.6.7 pr_icmph()函数 323
11.6.8 pr_iph()函数 326
11.6.9 pr_addr()函数 327
11.6.10 pr_retip()函数 328
11.6.11 finish()函数 329
11.6.12 其他函数 330
习题 330
附录A 图表索引 331
附录B 相关函数和宏参考表 335
附录C 实验环境搭建方法 359
参考文献 368