编辑推荐
《TCP/IP详解卷2:实现》针对任何希望理解TCP/IP协议是如何实现的读者设计;无论是编写网络应用的程序员,负责利用TCP/TP维护计算机系统和网络的系统管理员,还是任何有兴趣理解大块非凡代码的普通读者;本书都是一本优秀的教科书。
此商品有两版印刷封面,随机发货!
内容简介
《TCP/IP详解·卷2:实现》完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。《TCP/IP详解·卷2:实现》不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点。《TCP/IP详解·卷2:实现》适用于希望理解TCP/IP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。
作者简介
G.R.赖特(Gary R.Wright),美国Connix公司的董事长。合著有《TCP/IP详解 卷2:实现》。
内页插图
目录
译者序
前言
第1章 概述
1.1 引言
1.2 源代码表示
1.2.1 将拥塞窗口设置为1
1.2.2 印刷约定
1.3 历史
1.4 应用编程接口
1.5 程序示例
1.6 系统调用和库函数
1.7 网络实现概述
1.8 描述符
1.9 mbuf与输出处理
1.9.1 包含插口地址结构的mbuf
1.9.2 包含数据的mbuf
1.9.3 添加IP和UDP首部
1.9.4 IP输出
1.9.5 以太网输出
1.9.6 UDP输出小结
1.10 输入处理
1.10.1 以太网输入
1.10.2 IP输入
1.10.3 UDP输入
1.10.4 进程输入
1.11 网络实现概述(续)
1.12 中断级别与并发
1.13 源代码组织
1.14 测试网络
1.15 小结
第2章 mbuf:存储器缓存
2.1 引言
2.2 代码介绍
2.2.1 全局变量
2.2.2 统计
2.2.3 内核统计
2.3 mbufl的定义
2.4 mbuf结构
2.5 简单的mbuf宏和函数
2.5.1 m-get函数
2.5.2 MGET宏
2.5.3 m-etry函数
2.5.4 mbuf锁
2.6 m-devget和m-pullup函数
2.6.1 m-devget函数
2.6.2 mtod和dtom宏
2.6.3 pullup函数和连续的协议首部
2.6.4 m-pullup和IP的分片与重组
2.6.5 TCP重组避免调用m-pullup
2.6.6 m-pullup使用总结
2.7 mbuf宏和函数的小结
2.8 Neff3联网数据结构小结
2.9 m-Copy和簇引用计数
2.10 其他选择
2.11 小结
第3章 接口层
3.1 引言
3.2 代码介绍
3.2.1 全局变量
3.2.2 SNMP变量
3.3 ifnet结构
3.4 ifadck结构,
3.5 sockaddr结构
3.6 ifnet与土faddr的专用化
3.7 网络初始化概述
3.8 以太网初始化
3.9 suP初始化
3.10 环回初始化
3.11 if_attach函数
3.12 ifinit函数
3.13 小结
第4章 接口:以太网
4.1 引言
4.2 代码介绍
4.2.1 全局变量
4.2.2 统计量
4.2.3 SNMP变量
4.3 以太网接口
4.3.1 leintr函数
4.3.2 leread函数
4.3.3 ether_input函数
4.3.4 ether_output函数
4.3.5 lestart函数
4.4 ioctl系统调用
4.4.1 ifioctl函数
4.4.2 ifconf函数
4.4.3 举例
4.4.4 通用接口ioctl命令
4.4.5 if_down和if_up函数
4.4.6 以太网、SLIP和环回
4.5 小结
第5章 接口:SLIP和环回
5.1 引言
5.2 代码介绍
5.2.1 全局变量
5.2.2 统计量
5.3 SLIP接口
5.3.1 SLIP线路规程:SLIPDISC
5.3.2 SLIP初始化:slopen slinit
5.3.3 SLIP输入处理:slinput
5.3.4 SLIP输出处理:sloutput
5.3.5 slstart函数
5.3.6 SLIP分组丢失
5.3.7 SLIP性能考虑
5.3.8 slclose函数
5.3.9 sltioctl函数
5.4 环回接口
5.5 小结
第6章 IP编址
6.1 引言
6.1.IIP地址
6.I.2 IP地址的印刷规定
6.1.3 主机和路由器
6.2 代码介绍
6.3 接口和地址小结
6.4 sockaddr_in结构
6.5 in_ifaddr结构
6.6 地址指派
6.6.1 ifioctl函数
6.6.2 in_control函数
6.6.3 前提条件:SIOCSIFADDR、SIOCSIFNETMASK和SIOCSIFDSFADDR
6.6.4 地址指派:SIOCSIFADDR
6.6.5 in_ifinit函数
6.6.6 网络掩码指派:SIOCSIFNETMASK
6.6.7 目的地址指派:SIOCSIFDSTADDR
6.6.8 获取接口信息
6.6.9 每个接口多个IP地址
6.6.10 附加IP地址:SIOCAIFADDR
6.6.11 删除IP地址:SIOCDIFADDR
6.7 接口ioctl处理
6.7.1 leioctl函数
6.7.2 slioctl函数
6.7.3 loioctl函数
6.8 Internet实用函数
6.9 ifnet实用函数
6.10 小结
第7章 域和协议
7.1 引言
7.2 代码介绍
7.2.1 全局变量
7.2.2 统计量
7.3 domain结构
7.4 protosw结构
7.5 IP的domain和protosw结构
7.6 pffindproto~Hpffindtype函数
7.7 pfctlinput函数
7.8 IP初始化
7.8.1 Intemet传输分用
7.8.2 ip_init函数
7.9 sysctl系统调用
7.10 小结
第8章 IP:网际协议
8.1 引言
8.2 代码介绍
8.2.1 全局变量
8.2.2 统计量
8.2.3 SNMP变量
8.3 IP分组
8.4 输入处理:ipintr函数
8.4.1 ipintr概观
8.4.2 验证
8.4.3 转发或不转发
8.4.4 重装和分用
8.5 转发:ip_forward函数
8.6 输出处理:ip_output函数
8.6.1 首部初始化
8.6.2 路由选择
8.6.3 源地址选择和分片
8.7 Internet检验和:in_cksum函数
8.8 setsockopt和getsockopt系统调用
8.8.1 PRCO_SETOPT的处理
8.8.2 PRCO_GETOPT的处理
8.9 ip_sysctl函数
8.10 小结
第9章 IP选项处理
9.1 引言
9.2 代码介绍
9.2.1 全局变量
9.2.2 统计量
9.3 选项格式
9.4 ip_dooptions函数
9.5 记录路由选项
9.6 源站和记录路由选项
9.6.1 save_rte函数
9.6.2 ip_srcroute函数
9.7 时间戳选项:
9.8 ip_insertoptions函数
9.9 ip_pcbopts函数
9.10 一些限制
9.11 小结
笫10章 IP的分片与重装
10.1 引言
10.2 代码介绍
10.2.1 全局变量
10.2.2 统计量
10.3 分片
10.4 ip_optcopy函数
10.5 重装
10.6 ip_reass函数
10.7 ip_slowtimo函数
10.8 小结
第11章 ICMP:Internet控制报文协议
11.1 引言
11.2 代码介绍
11.2.1 全局变量
11.2.2 统计量
11.2.3 SNMP变量
11.3 icmp结构
11.4 ICMP的protosw结构
11.5 输入处理:icmp_input函数
11.6 差错处理
11.7 请求处理
11.7.1 回显询问:ICMP_ECHO和ICMLHCHOREPLY
11.7.2 时间戳询问:ICMP_TSTAMP和
ICMPTSTAMPREPLY
11.7.3 地址掩码询问:ICMP_MASKREQ和ICMP_MASKREPLY
11.7.4 信息询问:ICMP_IREQ和ICMP_IREQREPLY
11.7.5 路由器发现:ICMP_ROUTERADVERy和ICMP_ROUTERSOLICIF
11.8 重定向处理
11.9 回答处理
11.10 输出处理
11.11 icmp_error函数
11.12 icmpreflect函数
11.13 icmp_send函数
11.14 icmp_sysctl函数
11.15 小结
第12章 IP多播
12.1 引言
12.2 代码介绍
12.2.1 全局变量
12.2.2 统计量
12.3 以太网多播地址
12.4 ether_multi结构
12.5 以太网多播接收
12.6 inmulti结构
12.7 ip_moptions结构
12.8 多播的插口选项
12.9 多播的TTL值
12.9.1 MBONE
12.9.2 扩展环搜索
12.10 ip_setmoptions函数
12.10.1 选择一个明确的多播接口:IP_MULTICAS%_IF
12.10.2 选择明确的多播TTL:IP_MULTICASTTTL
12.10.3 选择多播环回:IPMULTICAST_LOOP
12.11 加入一个IP多播组
12.11.1 in_addmulti函数
12.11.2 slioctl和loioctl函数:SIOCADDMULTT和SIOCDRLTI
12.11.3 Leioctl函数:SIOCADDMULTI和SIOCDELMULTI
12.11.4 etheraddmulti函数
12.12 离开一个IP多播组
12.12.1 in_delmulti函数
12.12.2 ether_delmulti函数
12.13 ip_getmoptions函数
12.14 多播输入处理:ipintr函数
12.15 多播输出处理:ip_output函数
12.16 性能的考虑
12.17 小结
第13章 IGMP:Intemet组管理协议
13.1 引言
13.2 代码介绍
13.2.1 全局变量
13.2.2 统计量
13.2.3 SNMP变量
13.3 igrmp结构
13.4 IGMP的protosw的结构
13.5 加入一个组:igmp_joingroup函数
13.6 igmp_fasttimo函数
]3.7 输入处理:igmp_input函数
13.7.1 成员关系查询:IGMP_HOST_M194BERSHIPQUERY
13.7.2 成员关系报告:IGMP_HOST_MEMBERSHIPREPORT
13.8 离开一个组:ignlo_leavegroup函数
13.9 小结
第14章 IP多播选路
14.1 引言
14.2 代码介绍
14.2.1 全局变量
14.2.2 统计量
14.2.3 SNMP变量
14.3 多播输出处理(续)
14.4 mrouted守护程序
14.5 虚拟接口
14.5.1 虚拟接口表
14.5.2 add_vif函数
14.5.3 del_vif函数
14.6 IGMP(续)
14.6.1 add_igrp函数
14.6.2 del_igrp函数
14.6.3 grplst_member函数
14.7 多播选路
……
第15章 插口层
第16章 插口I/O
第17章 插口选项
第18章 Radix树路由表
第19章 选路请求和选路消息
第20章 选路插口
前言/序言
我们愿意向广大的读者推荐W.RichardStevens关于TCP/IP的经典著作(共3卷)的中译本。本书是其中的第2卷:《TCP/iP详解卷2:实现》。
大家知道,TCP/IP已成为计算机网络的事实上的标准。在关于了CP/IP的论著中,最有影响的就是两部著作。一部是DouglasE.Comer写的《用TCP/IP进行网际互连》,一套共3卷(中译本已由电子工业出版社于1998年出版),而另一部就是Stevens写的这3卷书。这两套巨著都很有名,各有其特点。无论是从事计算机网络教学的教师还是进行科研的技术人员,这两套书都应当是必读的。
本书的特点是内容丰富,概念清楚且准确,讲解详细,例子很多.作者在书中举出的所有例子均在作者安装的计算机网络上通过实际验证。各章都留有一定数量的习题。在附录A作者对部分习题给出了解答。在本书的最后,作者给出了许多经典的参考文献,并——写出了评论。
第2卷是第1卷的继续深入。读者在学习这一卷时,应当先具备第1卷所阐述的关于TCP/IP的基本知识。本卷的特点是使用大量的源代码来讲述TCP/IP协议族中的各协议是怎样实现的。这些内容对于编写TCP/IP网络应用程序的程序员和负责维护基于TCP/IP协议的计算机网络的系统管理员来说,应当是必读的。
参加本书翻译的有:谢钧(序言和第1章~第7章),蒋慧(第8章~第14章,第22章。第23章),吴礼发(第15~第17章),端义峰(第18章~第19章),胥光辉(第20章~第21章)和陆雪莹(第24章.第32章以及全部附录)。全书由谢希仁教授审校。
限于水平,翻译中不妥或错误之处在所难免,敬请广大读者批评指正。
《网络协议的艺术:深入剖析TCP/IP实现细节》 在现代数字世界的基石中,TCP/IP协议栈扮演着至关重要的角色。它如同一套精密的交通规则,指导着数据在全球范围内高效、可靠地流动。然而,当我们翻开那些关于TCP/IP的经典著作,常常会陷入高层次的理论和抽象概念之中,对于数据如何在实际的网络硬件和操作系统中真正“运行”,以及那些精妙的实现细节,却往往只是一笔带过。 本书《网络协议的艺术:深入剖析TCP/IP实现细节》正是为了填补这一领域的空白而生。它并非重复市面上已有的、侧重于协议设计原理或宏观概述的著作。相反,我们将带领读者深入网络协议实现的“车间”,去探究那些隐藏在代码和硬件接口背后的真实工作机制。我们不会泛泛而谈TCP的连接建立过程,而是会细致地剖析在Linux内核中,SYN、SYN-ACK、ACK这三个关键报文的生成、接收、处理流程,以及在这个过程中,socket缓冲区是如何被填充、消耗,`connect()`、`accept()`系统调用是如何与内核的TCP实现交互的。 本书的核心价值在于其“实现导向”的视角。我们不再满足于知道“TCP如何工作”,而是要追问“TCP在操作系统里是如何工作的”。这意味着,我们将大量地涉及操作系统内核的网络栈实现,特别是Linux内核。读者将有机会看到,当一个应用程序调用`send()`函数发送数据时,数据是如何从用户空间穿越到内核空间,如何被封装成TCP段,如何加入IP包,最终如何被网卡驱动程序所捕获,并转化为电信号发送出去。同样,当数据报到达网卡时,又是如何被中断机制唤醒,经过内核的网络栈层层解包、处理,最终递送到应用程序的socket缓冲区中,等待应用程序的读取。 我们将深入理解TCP的拥塞控制算法是如何在内核中实现的。以经典的Tahoe算法为例,我们会分析它如何通过丢包检测(超时重传、快速重传)来感知网络拥塞,如何调整发送窗口的大小(慢启动、拥塞避免、快重传、快恢复)来平衡网络吞吐量和稳定性。我们会探讨这些算法背后的数学模型和C语言代码实现,理解其在不同网络条件下的行为表现。 对于UDP,我们同样不会停留在“无连接、不可靠”的简单描述。我们将探讨UDP报文在内核中的生成和处理过程,理解用户空间的数据如何被打包成UDP报文,如何被IP层封装。我们会分析UDP校验和的计算过程,以及内核在接收UDP报文时如何处理校验和错误。 IP层的实现细节也将是本书的重点。读者将看到IP地址是如何在内核中被解析和路由的,ARP协议(地址解析协议)是如何在链路层和网络层之间建立起MAC地址与IP地址的映射关系的。我们将深入剖析IP数据报的封装和分片机制,理解当数据包超过MTU(最大传输单元)时,内核是如何进行分片的,以及接收端又是如何重组这些分片。 路由查找是IP层工作的核心。我们将详细介绍Linux内核中的路由表结构,以及当内核需要发送一个IP数据包时,它是如何根据目标IP地址在路由表中进行查找,从而决定下一跳(next hop)的IP地址和出接口的。这涉及到对`ip route`命令背后内核机制的理解。 ICMP(Internet控制消息协议)作为网络故障排除和控制的基石,其实现细节同样不容忽视。我们将分析ping命令是如何利用ICMP Echo Request和Echo Reply报文来检测网络连通性和测量往返时间的,以及traceroute命令是如何利用ICMP Time Exceeded报文来追踪数据包的路由路径的。 本书还会触及一些更底层的网络接口和驱动程序交互。我们会介绍网络接口卡(NIC)在内核中的抽象模型,以及数据包是如何在内核网络栈和网卡驱动程序之间传递的。这包括对DMA(Direct Memory Access)等硬件加速技术的简要介绍,以及它们如何提升网络 I/O 的性能。 另外,我们还会探讨一些与TCP/IP实现密切相关的操作系统特性,例如: Socket API的内部机制:深入理解`socket()`、`bind()`、`listen()`、`connect()`、`accept()`、`send()`、`recv()`、`close()`等系统调用的内核实现,它们与TCP/IP协议栈如何协同工作。 网络缓冲区管理:分析内核中发送缓冲区(send buffer)和接收缓冲区(receive buffer)的结构、大小限制(`SO_SNDBUF`、`SO_RCVBUF`)、以及数据在其中的流动和管理。 中断处理机制:理解网卡接收到数据包后,如何触发硬件中断,以及内核中断处理程序是如何高效地处理这些中断,从而避免CPU的过度占用。 用户空间与内核空间的数据拷贝:分析`send()`和`recv()`等操作中,数据在用户空间和内核空间之间是如何被拷贝的,以及一些零拷贝(zero-copy)技术的应用。 网络性能调优的底层视角:通过理解TCP/IP的实现细节,读者将能更好地理解内核参数(如TCP拥塞控制参数、缓冲区大小等)对网络性能的影响,从而进行更有效的调优。 本书的目标读者是那些对网络协议的理论知识有一定基础,并且希望深入了解其在实际操作系统中如何实现的开发者、网络工程师和系统管理员。我们假设读者具备C语言编程知识,并且对Linux操作系统的基本概念有所了解。 我们将使用大量的代码片段和伪代码来阐释概念,并尽可能地引用Linux内核的实际代码(在不影响阅读流畅性的前提下)。通过这种方式,我们希望能够提供一种“亲身体验”式的学习过程,让读者能够真正理解TCP/IP协议栈在现代计算环境中是如何运作的。 本书不是一本教你如何编写一个TCP/IP协议栈的书,也不是一本深入探讨网络安全攻防的书。它是一本专注于“如何让TCP/IP协议在操作系统里跑起来”的实现细节的书。它将为你揭示那些隐藏在网络流畅运行背后的工程智慧和技术细节,让你对这个我们日常生活中不可或缺的网络技术有更深刻、更实在的认识。 免责声明: 本简介旨在概括本书的核心内容和风格,具体章节和技术细节会根据实际编写情况有所调整。本书不包含任何关于《TCP/IP详解卷2:实现》这本书本身的详细内容,而是以此为切入点,聚焦于网络协议实现的底层细节。