首页
计算机与互联网
TCP/IP详解 卷2:实现
TCP/IP详解 卷2:实现
书籍作者:加里·莱特
ISBN:9787111617938
书籍语言:简体中文
连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3
下载次数:7211
创建日期:2021-02-14
发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介
本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。本书适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。
作者简介
加里;R. 赖特(Gary R. Wright)研究TCP/IP多年。他是Connix公司的董事长,Connix公司的总部在康涅狄格州,主要提供Internet接入和咨询服务。
W. 理查德 史蒂文斯(W. Richard Stevens)(1951—1999)是国际的Unix和网络专家,备受赞誉的技术作家。生前著有《TCP/IP 详解》(三卷本)、《UNIX网络编程》(两卷本)以及《UNIX环境高级编程》,均为不朽的经典著作。
前言
简介
本书描述并给出了TCP/IP实现引用的源代码—加利福尼亚大学伯克利分校的计算机系统研究组(CSRG)的实现。历史上,它曾以4.x BSD系统(伯克利软件发行)发布。这个实现第一次发布是在1982年,经过了很多重大的改变和改进,并且其中很多特性被引入到其他Unix和非Unix系统中。这不是一个没有多大意义的实现,而是天天在世界上成千上万个系统上运行的TCP/IP实现的基础。这个实现还提供路由功能,显示主机和路由器的TCP/IP实现间的区别。
我们描述这个实现并给出TCP/IP内核实现的完整源代码,大约15 000行C代码。在本文中描述的是4.4BSD-Lite版本。这个代码在1994年4月公开,包含很多增强的联网部分,它们被添加到1988年的4.3BSD Tahoe版、1990年的4.3BSD Reno版和1993年的4.4BSD版(附录B介绍了如何获得这些源代码)。4.4BSD版提供最新的TCP/IP特征,如多播和长肥管道支持(用于高宽带、长时延路径)。图1-1提供了伯克利联网代码的各种版本的其他细节。
本书适用于希望理解TCP/IP的实现细节的广大读者:编写网络应用的程序员,负责利用TCP/IP维护计算机系统和网络的系统管理员,以及任何想理解大块的重要代码是如何满足一个真实操作系统的程序员。
本书的组织结构
下图显示的是所涉及的各种协议和子系统。每个方框旁的斜体数字指出方框中的论题在哪一章讨论。
我们采用自底向上的方法来讨论TCP/IP协议族,从数据链路层开始,然后是网络层(IP、ICMP、IGMP、IP路由选择和多播路由选择),接下来是插口层,最后以运输层(UDP、TCP和原始IP)结束。
预期的读者
本书假设读者对TCP/IP的工作原理有基本的理解。不熟悉TCP/IP的读者应该参考本套书中的第1卷[Stevens 1994],那本书对TCP/IP协议组进行了全面的描述。在本书中对第1卷的引用均为卷1。本书还假设读者对操作系统原理有基本的理解。
我们用数据结构方法来描述这个协议的实现。即,除了给出源代码外,每章还包括源代码使用和维护的数据结构的图与说明。我们显示了这些数据结构是如何适用于TCP/IP和内核使用的其他数据结构的。通篇使用大量的图表—超过250个图表。
这种数据结构方法允许读者采用各种方式使用本书。对所有实现细节感兴趣的读者可以从头到尾阅读全书,看完所有的源代码。可能只想理解协议的实现细节的其他读者,可通过理解所有数据结构并阅读所有文字达到目的,而不必看完所有的源代码。
我们预料很多读者会对书中的特定部分感兴趣并且想直接进入那一章。因此,通篇提供了很多向前或向后的引用,沿着完整的索引,允许单独学习某一章。在各章的结尾都提供了习题,并在附录A中给出大多数习题的答案作为自学的参考,使本书能发挥最大的作用。
源代码版权
本书中出现的所有代码,除了图1-2和图8-27,都是来自4.4BSD-Lite发行版。这个软件是公开的,可从很多地方获得(参见附录B)。
源代码的所有部分都包含下列版权声明。
Gary R.Wright
米德尔顿,康涅狄格
W. Richard Stevens
图森,亚利桑那
1994年11月
目录
出版者的话
译者序
前言
第1章 概述1
1.1 引言1
1.2 源代码表示1
1.2.1 将拥塞窗口设置为11
1.2.2 印刷约定2
1.3 历史2
1.4 应用编程接口3
1.5 程序示例4
1.6 系统调用和库函数6
1.7 网络实现概述6
1.8 描述符7
1.9 mbuf与输出处理11
1.9.1 包含插口地址结构的mbuf11
1.9.2 包含数据的mbuf12
1.9.3 添加IP和UDP首部13
1.9.4 IP输出14
1.9.5 以太网输出14
1.9.6 UDP输出小结14
1.10 输入处理15
1.10.1 以太网输入15
1.10.2 IP输入15
1.10.3 UDP输入16
1.10.4 进程输入17
1.11 网络实现概述(续)17
1.12 中断级别与并发18
1.13 源代码组织20
1.14 测试网络21
1.15 小结22
第2章 mbuf:存储器缓存24
2.1 引言24
2.2 代码介绍27
2.2.1 全局变量27
2.2.2 统计28
2.2.3 内核统计28
2.3 mbuf的定义29
2.4 mbuf结构29
2.5 简单的mbuf宏和函数31
2.5.1 m_get函数32
2.5.2 MGET宏32
2.5.3 m_retry函数33
2.5.4 mbuf锁34
2.6 m_devget和m_pullup函数34
2.6.1 m_devget函数34
2.6.2 mtod和dtom宏36
2.6.3 m_pullup函数和连续的协议首部36
2.6.4 m_pullup和IP的分片与重组37
2.6.5 TCP重组避免调用m_pullup39
2.6.6 m_pullup使用总结40
2.7 mbuf宏和函数的小结40
2.8 Net/3联网数据结构小结42
2.9 m_copy和簇引用计数43
2.10 其他选择47
2.11 小结47
第3章 接口层49
3.1 引言49
3.2 代码介绍49
3.2.1 全局变量49
3.2.2 SNMP变量50
3.3 ifnet结构51
3.4 ifaddr结构57
3.5 sockaddr结构58
3.6 ifnet与ifaddr的专用化59
3.7 网络初始化概述60
3.8 以太网初始化61
3.9 SLIP初始化64
3.10 环回初始化65
3.11 if_attach函数66
3.12 ifinit函数72
3.13 小结73
第4章 接口:以太网74
4.1 引言74
4.2 代码介绍75
4.2.1 全局变量75
4.2.2 统计量75
4.2.3 SNMP变量76
4.3 以太网接口77
4.3.1 leintr函数79
4.3.2 leread函数79
4.3.3 ether_input函数81
4.3.4 ether_output函数84
4.3.5 lestart函数87
4.4 ioctl系统调用89
4.4.1 ifioctl函数90
4.4.2 ifconf函数91
4.4.3 举例94
4.4.4 通用接口ioctl命令95
4.4.5 if_down和if_up函数96
4.4.6 以太网、SLIP和环回97
4.5 小结98
第5章 接口:SLIP和环回100
5.1 引言100
5.2 代码介绍100
5.2.1 全局变量100
5.2.2 统计量101
5.3 SLIP接口101
5.3.1 SLIP线路规程:SLIPDISC101
5.3.2 SLIP初始化:slopen和slinit103
5.3.3 SLIP输入处理:slinput105
5.3.4 SLIP输出处理:sloutput109
5.3.5 slstart函数111
5.3.6 SLIP分组丢失116
5.3.7 SLIP性能考虑117
5.3.8 slclose函数117
5.3.9 sltioctl函数118
5.4 环回接口119
5.5 小结121
第6章 IP编址123
6.1 引言123
6.1.1 IP地址123
6.1.2 IP地址的印刷规定123
6.1.3 主机和路由器124
6.2 代码介绍125
6.3 接口和地址小结125
6.4 sockaddr_in结构126
6.5 in_ifaddr结构127
6.6 地址指派128
6.6.1 ifioctl函数130
6.6.2 in_control函数130
6.6.3 前提条件:SIOCSIFADDR、SIOCSIFNETMASK和SIOCSIFDSTADDR132
6.6.4 地址指派:SIOCSIFADDR133
6.6.5 in_ifinit函数133
6.6.6 网络掩码指派:SIOCSIFNETMASK136
6.6.7 目的地址指派:SIOCSIFDSTADDR137
6.6.8 获取接口信息137
6.6.9 每个接口多个IP地址138
6.6.10 附加IP地址:SIOCAIFADDR139
6.6.11 删除IP地址:SIOCDIFADDR140
6.7 接口ioctl处理141
6.7.1 leioctl函数141
6.7.2 slioctl函数142
6.7.3 loioctl函数143
6.8 Internet实用函数144
6.9 ifnet实用函数144
6.10 小结145
第7章 域和协议146
7.1 引言146
7.2 代码介绍146
7.2.1 全局变量147
7.2.2 统计量147
7.3 domain结构147
7.4 protosw结构148
7.5 IP 的domain和protosw结构150
7.6 pffindproto和pffindtype函数155
7.7 pfctlinput函数157
7.8 IP初始化157
7.8.1 Internet传输分用157
7.8.2 ip_init函数158
7.9 sysctl系统调用159
7.10 小结161
第8章 IP:网际协议162
8.1 引言162
8.2 代码介绍163
8.2.1 全局变量163
8.2.2 统计量163
8.2.3 SNMP变量164
8.3 IP分组165
8.4 输入处理:ipintr函数167
8.4.1 ipintr概观167
8.4.2 验证168
8.4.3 转发或不转发171
8.4.4 重装和分用173
8.5 转发:ip_forward函数174
8.6 输出处理:ip_output函数180
8.6.1 首部初始化181
8.6.2 路由选择182
8.6.3 源地址选择和分片184
8.7 Internet检验和:in_cksum函数186
8.8 setsockopt和getsockopt系统调用190
8.8.1 PRCO_SETOPT的处理192
8.8.2 PRCO_GETOPT的处理193
8.9 ip_sysctl函数193
8.10