出版时间:2004-1 出版社:机械工业出版社 作者:史蒂文斯 页数:901 译者:陆雪莹
Tag标签:无
前言
我们愿意向广大的读者推荐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协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于TCP/IP的基本知识。本书适用于希望理解TCP/TP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。
作者简介
Gary R.Wright 研究TCP/IP多年。他是Connix公司的董事长,这个公司的基地在康涅狄格州,它提供Internet接入和咨询服务。
W.Richard Stevens(1951-1999)是一位非常受人尊敬的专家,除了《TCP/IP详解》三卷本外,他还有其他两部最为畅销的作品;《UNIX环境高级编程》和
书籍目录
目 录译者序前言第1章 概述 11.1 引言 11.2 源代码表示 11.2.1 将拥塞窗口设置为1 11.2.2 印刷约定 21.3 历史 21.4 应用编程接口 31.5 程序示例 41.6 系统调用和库函数 61.7 网络实现概述 61.8 描述符 71.9 mbuf与输出处理 111.9.1 包含插口地址结构的mbuf 111.9.2 包含数据的mbuf 121.9.3 添加IP和UDP首部 131.9.4 IP输出 141.9.5 以太网输出 141.9.6 UDP输出小结 141.10 输入处理 151.10.1 以太网输入 151.10.2 IP输入 151.10.3 UDP输入 161.10.4 进程输入 171.11 网络实现概述(续) 171.12 中断级别与并发 181.13 源代码组织 201.14 测试网络 211.15 小结 22第2章 mbuf:存储器缓存 242.1 引言 242.2 代码介绍 272.2.1 全局变量 272.2.2 统计 282.2.3 内核统计 282.3 mbuf的定义 292.4 mbuf结构 292.5 简单的mbuf宏和函数 312.5.1 m_get函数 322.5.2 MGET宏 322.5.3 m_retry函数 332.5.4 mbuf锁 342.6 m_devget和m_pullup函数 342.6.1 m_devget函数 342.6.2 mtod和dtom宏 362.6.3 m_pullup函数和连续的协议首部 362.6.4 m_pullup和IP的分片与重组 372.6.5 TCP重组避免调用m_pullup 392.6.6 m_pullup使用总结 402.7 mbuf宏和函数的小结 402.8 Net/3联网数据结构小结 422.9 m_copy和簇引用计数 432.10 其他选择 472.11 小结 47第3章 接口层 493.1 引言 493.2 代码介绍 493.2.1 全局变量 493.2.2 SNMP变量 503.3 ifnet结构 513.4 ifaddr结构 573.5 sockaddr结构 583.6 ifnet与ifaddr的专用化 593.7 网络初始化概述 603.8 以太网初始化 613.9 SLIP初始化 643.10 环回初始化 653.11 if_attach函数 663.12 ifinit函数 723.13 小结 73第4章 接口:以太网 744.1 引言 744.2 代码介绍 754.2.1 全局变量 754.2.2 统计量 754.2.3 SNMP变量 764.3 以太网接口 774.3.1 leintr函数 794.3.2 leread函数 794.3.3 ether_input函数 814.3.4 ether_output函数 844.3.5 lestart函数 874.4 ioctl系统调用 894.4.1 ifioctl函数 904.4.2 ifconf函数 914.4.3 举例 944.4.4 通用接口ioctl命令 954.4.5 if_down和if_up函数 964.4.6 以太网、SLIP和环回 974.5 小结 98第5章 接口:SLIP和环回 1005.1 引言 1005.2 代码介绍 1005.2.1 全局变量 1005.2.2 统计量 1015.3 SLIP接口 1015.3.1 SLIP线路规程:SLIPDISC 1015.3.2 SLIP初始化:slopen和slinit 1035.3.3 SLIP输入处理:slinput 1055.3.4 SLIP输出处理:sloutput 1095.3.5 slstart函数 1115.3.6 SLIP分组丢失 1165.3.7 SLIP性能考虑 1175.3.8 slclose函数 1175.3.9 sltioctl函数 1185.4 环回接口 1195.5 小结 121第6章 IP编址 1236.1 引言 1236.1.1 IP地址 1236.1.2 IP地址的印刷规定 1236.1.3 主机和路由器 1246.2 代码介绍 1256.3 接口和地址小结 1256.4 sockaddr_in结构 1266.5 in_ifaddr结构 1276.6 地址指派 1286.6.1 ifioctl函数 1306.6.2 in_control函数 1306.6.3 前提条件:SIOCSIFADDR、 SIOCSIFNETMASK和 SIOCSIFDSTADDR 1326.6.4 地址指派:SIOCSIFADDR 1336.6.5 in_ifinit函数 1336.6.6 网络掩码指派:SIOCSIFNETMASK 1366.6.7 目的地址指派:SIOCSIFDSTADDR 1376.6.8 获取接口信息 1376.6.9 每个接口多个IP地址 1386.6.10 附加IP地址:SIOCAIFADDR 1396.6.11 删除IP地址:SIOCDIFADDR 1406.7 接口ioctl处理 1416.7.1 leioctl函数 1416.7.2 slioctl函数 1426.7.3 loioctl函数 1436.8 Internet实用函数 1446.9 ifnet实用函数 1446.10 小结 145第7章 域和协议 1467.1 引言 1467.2 代码介绍 1467.2.1 全局变量 1477.2.2 统计量 1477.3 domain结构 1477.4 protosw结构 1487.5 IP 的domain和protosw结构 1507.6 pffindproto和pffindtype函数 1557.7 pfctlinput函数 1577.8 IP初始化 1577.8.1 Internet传输分用 1577.8.2 ip_init函数 1587.9 sysctl系统调用 1597.10 小结 161第8章 IP:网际协议 1628.1 引言 1628.2 代码介绍 1638.2.1 全局变量 1638.2.2 统计量 1638.2.3 SNMP变量 1648.3 IP分组 1658.4 输入处理:ipintr函数 1678.4.1 ipintr概观 1678.4.2 验证 1688.4.3 转发或不转发 1718.4.4 重装和分用 1738.5 转发:ip_forward函数 1748.6 输出处理:ip_output函数 1808.6.1 首部初始化 1818.6.2 路由选择 1828.6.3 源地址选择和分片 1848.7 Internet检验和:in_cksum函数 1868.8 setsockopt和getsockopt系统调用 1908.8.1 PRCO_SETOPT的处理 1928.8.2 PRCO_GETOPT的处理 1938.9 ip_sysctl函数 1938.10 小结 194第9章 IP选项处理 1969.1 引言 1969.2 代码介绍 1969.2.1 全局变量 1969.2.2 统计量 1979.3 选项格式 1979.4 ip_dooptions函数 1989.5 记录路由选项 2009.6 源站和记录路由选项 2029.6.1 save_rte函数 2059.6.2 ip_srcroute函数 2069.7 时间戳选项 2079.8 ip_insertoptions函数 2109.9 ip_pcbopts函数 2149.10 一些限制 2179.11 小结 217第10章 IP的分片与重装 21810.1 引言 21810.2 代码介绍 21910.2.1 全局变量 22010.2.2 统计量 22010.3 分片 22010.4 ip_optcopy函数 22310.5 重装 22410.6 ip_reass函数 22710.7 ip_slowtimo函数 23710.8 小结 238第11章 ICMP:Internet控制报文协议 23911.1 引言 23911.2 代码介绍 24211.2.1 全局变量 24211.2.2 统计量 24211.2.3 SNMP变量 24311.3 icmp结构 24411.4 ICMP 的protosw结构 24511.5 输入处理:icmp_input函数 24611.6 差错处理 24911.7 请求处理 25111.7.1 回显询问:ICMP_ECHO和 ICMP_ECHOREPLY 25211.7.2 时间戳询问:ICMP_TSTAMP和 ICMP_TSTAMPREPLY 25311.7.3 地址掩码询问:ICMP_MASKREQ和 ICMP_MASKREPLY 25311.7.4 信息询问:ICMP_IREQ和ICMP_ IREQREPLY 25511.7.5 路由器发现:ICMP_ROUTERADVERT 和ICMP_ROUTERSOLICIT 25511.8 重定向处理 25511.9 回答处理 25711.10 输出处理 25711.11 icmp_error函数 25811.12 icmp_reflect函数 26111.13 icmp_send函数 26511.14 icmp_sysctl函数 26611.15 小结 266第12章 IP多播 26812.1 引言 26812.2 代码介绍 26912.2.1 全局变量 27012.2.2 统计量 27012.3 以太网多播地址 27012.4 ether_multi结构 27112.5 以太网多播接收 27312.6 in_multi结构 27312.7 ip_moptions结构 27512.8 多播的插口选项 27612.9 多播的TTL值 27712.9.1 MBONE 27812.9.2 扩展环搜索 27812.10 ip_setmoptions函数 27812.10.1 选择一个明确的多播接口:IP_ MULTICAST_IF 28012.10.2 选择明确的多播TTL: IP_ MULTICAST_TTL 28112.10.3 选择多播环回:IP_MULTICAST_ LOOP 28112.11 加入一个IP多播组 28212.11.1 in_addmulti函数 28512.11.2 slioctl和loioctl函数:SIOCADDMULTI和SIOCDELMULTI 28712.11.3 leioctl函数:SIOCADDMULTI和 SIOCDELMULTI 28812.11.4 ether_addmulti函数 28812.12 离开一个IP多播组 29112.12.1 in_delmulti函数 29212.12.2 ether_delmulti函数 29312.13 ip_getmoptions函数 29512.14 多播输入处理:ipintr函数 29612.15 多播输出处理:ip_output函数 29812.16 性能的考虑 30112.17 小结 301第13章 IGMP:Internet组管理协议 30313.1 引言 30313.2 代码介绍 30413.2.1 全局变量 30413.2.2 统计量 30413.2.3 SNMP变量 30513.3 igmp结构 30513.4 IGMP的protosw的结构 30613.5 加入一个组:igmp_joingroup函数 30613.6 igmp_fasttimo函数 30813.7 输入处理:igmp_input函数 31113.7.1 成员关系查询:IGMP_HOST_ MEMBERSHIP_QUERY 31213.7.2 成员关系报告:IGMP_HOST_ MEMBERSHIP_REPORT 31313.8 离开一个组:igmp_leavegroup函数 31413.9 小结 315第14章 IP多播选路 31614.1 引言 31614.2 代码介绍 31614.2.1 全局变量 31614.2.2 统计量 31714.2.3 SNMP变量 31714.3 多播输出处理(续) 31714.4 mrouted守护程序 31814.5 虚拟接口 32114.5.1 虚拟接口表 32214.5.2 add_vif函数 32414.5.3 del_vif函数 32614.6 IGMP(续) 32714.6.1 add_lgrp函数 32814.6.2 del_lgrp函数 32914.6.3 grplst_member函数 33014.7 多播选路 33114.7.1 多播选路表 33414.7.2 del_mrt函数 33514.7.3 add_mrt函数 33614.7.4 mrtfind函数 33714.8 多播转发:ip_mforward函数 33814.8.1 phyint_send函数 34314.8.2 tunnel_send函数 34414.9 清理:ip_mrouter_done函数 34514.10 小结 346第15章 插口层 34815.1 引言 34815.2 代码介绍 34915.3 socket结构 34915.4 系统调用 35415.4.1 举例 35515.4.2 系统调用小结 35515.5 进程、描述符和插口 35715.6 socket系统调用 35815.6.1 socreate函数 35915.6.2 超级用户特权 36115.7 getsock和sockargs函数 36115.8 bind系统调用 36315.9 listen系统调用 36415.10 tsleep和wakeup函数 36515.11 accept系统调用 36615.12 sonewconn和soisconnected函数 36915.13 connect系统调用 37215.13.1 soconnect函数 37415.13.2 切断无连接插口和外部地址的关联 37515.14 shutdown系统调用 37515.15 close系统调用 37715.15.1 soo_close函数 37715.15.2 soclose函数 37815.16 小结 380第16章 插口I/O 38116.1 引言 38116.2 代码介绍 38116.3 插口缓存 38116.4 write、writev、sendto和sendmsg系统调用 38416.5 sendmsg系统调用 38716.6 sendit函数 38816.6.1 uiomove函数 38916.6.2 举例 39016.6.3 sendit代码 39116.7 sosend函数 39216.7.1 可靠的协议缓存 39316.7.2 不可靠的协议缓存 39316.7.3 sosend函数小结 40116.7.4 性能问题 40116.8 read、readv、recvfrom和recvmsg 系统调用 40116.9 recvmsg系统调用 40216.10 recvit函数 40316.11 soreceive函数 40516.11.1 带外数据 40616.11.2 举例 40616.11.3 其他的接收操作选项 40716.11.4 接收缓存的组织:报文边界 40716.11.5 接收缓存的组织:没有报文边界 40816.11.6 控制信息和带外数据 40916.12 soreceive代码 41016.13 select系统调用 42116.13.1 selscan函数 42516.13.2 soo_select函数 42516.13.3 selrecord函数 42716.13.4 selwakeup函数 42816.14 小结 429第17章 插口选项 43117.1 引言 43117.2 代码介绍 43117.3 setsockopt系统调用 43217.4 getsockopt系统调用 43717.5 fcntl和ioctl系统调用 44017.5.1 fcntl代码 44117.5.2 ioctl代码 44317.6 getsockname系统调用 44417.7 getpeername系统调用 44517.8 小结 447第18章 Radix树路由表 44818.1 引言 44818.2 路由表结构 44818.3 选路插口 45618.4 代码介绍 45618.4.1 全局变量 45818.4.2 统计量 45818.4.3 SNMP变量 45918.5 Radix结点数据结构 46018.6 选路结构 46318.7 初始化:route_init和rtable_init函数 46518.8 初始化:rn_init和rn_inithead函数 46818.9 重复键和掩码列表 47118.10 rn_match函数 47318.11 rn_search函数 48018.12 小结 481第19章 选路请求和选路消息 48219.1 引言 48219.2 rtalloc和rtalloc1函数 48219.3 宏RTFREE和rtfree函数 48419.4 rtrequest函数 48619.5 rt_setgate函数 49119.6 rtinit函数 49319.7 rtredirect函数 49519.8 选路消息的结构 49819.9 rt_missmsg函数 50119.10 rt_ifmsg函数 50319.11 rt_newaddrmsg函数 50419.12 rt_msg1函数 50519.13 rt_msg2函数 50719.14 sysctl_rtable函数 51019.15 sysctl_dumpentry函数 51419.16 sysctl_iflist函数 51519.17 小结 517第20章 选路插口 51820.1 引言 51820.2 routedomain和protosw结构 51820.3 选路控制块 51920.4 raw_init函数 52020.5 route_output函数 52020.6 rt_xaddrs函数 53020.7 rt_setmetrics函数 53120.8 raw_input函数 53220.9 route_usrreq函数 53420.10 raw_usrreq函数 53520.11 raw_attach、raw_detach和raw_disconnect函数 53920.12 小结 540第21章 ARP:地址解析协议 54221.1 介绍 54221.2 ARP和路由表 54221.3 代码介绍 54421.3.1 全局变量 54421.3.2 统计量 54421.3.3 SNMP变量 54621.4 ARP结构 54621.5 arpwhohas函数 54821.6 arprequest函数 54821.7 arpintr函数 55121.8 in_arpinput函数 55221.9 ARP定时器函数 55721.9.1 arptimer函数 55721.9.2 arptfree函数 55721.10 arpresolve函数 55821.11 arplookup函数 56221.12 代理ARP 56321.13 arp_rtrequest函数 56421.14 ARP和多播 56921.15 小结 570第22章 协议控制块 57222.1 引言 57222.2 代码介绍 57322.2.1 全局变量 57422.2.2 统计量 57422.3 inpcb的结构 57422.4 in_pcballoc和in_pcbdetach函数 57522.5 绑定、连接和分用 57722.6 in_pcblookup函数 58122.7 in_pcbbind函数 58422.8 in_pcbconnect函数 58922.9 in_pcbdisconnect函数 59422.10 in_setsockaddr和in_setpeeraddr函数 59522.11 in_pcbnotify、in_rtchange和in_losing函数 59522.11.1 in_rtchange函数 59822.11.2 重定向和原始插口 59922.11.3 ICMP差错和UDP插口 60022.11.4 in_losing函数 60122.12 实现求精 60222.13 小结 602第23章 UDP:用户数据报协议 60523.1 引言 60523.2 代码介绍 60523.2.1 全局变量 60623.2.2 统计量 60623.2.3 SNMP变量 60723.3 UDP 的protosw结构 60723.4 UDP的首部 60823.5 udp_init函数 60923.6 udp_output函数 60923.6.1 在前面加上IP/UDP首部和mbuf簇 61223.6.2 UDP检验和计算和伪首部 61223.7 udp_input函数 61623.7.1 对收到的UDP数据报的一般确认 61623.7.2 分用单播数据报 61923.7.3 分用多播和广播数据报 62223.7.4 连接上的UDP插口和多接口主机 62523.8 udp_saveopt函数 62523.9 udp_ctlinput函数 62723.10 udp_usrreq函数 62823.11 udp_sysctl函数 63323.12 实现求精 63323.12.1 UDP PCB高速缓存 63323.12.2 UDP检验和 63423.13 小结 635第24章 TCP:传输控制协议 63624.1 引言 63624.2 代码介绍 63624.2.1 全局变量 63624.2.2 统计量 63724.2.3 SNMP变量 64024.3 TCP 的protosw结构 64124.4 TCP的首部 64124.5 TCP的控制块 64324.6 TCP的状态变迁图 64524.7 TCP的序号 64624.8 tcp_init函数 65024.9 小结 652第25章 TCP的定时器 65425.1 引言 65425.2 代码介绍 65525.3 tcp_canceltimers函数 65725.4 tcp_fasttimo函数 65725.5 tcp_slowtimo函数 65825.6 tcp_timers函数 65925.6.1 FIN_WAIT_2和2MSL定时器 66025.6.2 持续定时器 66225.6.3 连接建立定时器和保活定时器 66225.7 重传定时器的计算 66525.8 tcp_newtcpcb算法 66625.9 tcp_setpersist函数 66825.10 tcp_xmit_timer函数 66925.11 重传超时:tcp_timers函数 67325.11.1 慢起动和避免拥塞 67525.11.2 精确性 67725.12 一个RTT的例子 67725.13 小结 679第26章 TCP输出 68026.1 引言 68026.2 tcp_output概述 68026.3 决定是否应发送一个报文段 68226.4 TCP选项 69126.5 窗口大小选项 69226.6 时间戳选项 69226.6.1 哪个时间戳需要回显,RFC1323算法 69426.6.2 哪个时间戳需要回显,正确的算法 69526.6.3 时间戳与延迟ACK 69526.7 发送一个报文段 69626.8 tcp_template函数 70726.9 tcp_respond函数 70826.10 小结 710第27章 TCP的函数 71227.1 引言 71227.2 tcp_drain函数 71227.3 tcp_drop函数 71227.4 tcp_close函数 71327.4.1 路由特性 71327.4.2 资源释放 71627.5 tcp_mss函数 71727.6 tcp_ctlinput函数 72227.7 tcp_notify函数 72327.8 tcp_quench函数 72427.9 TCP_REASS宏和tcp_reass函数 72427.9.1 TCP_REASS宏 72527.9.2 tcp_reass函数 72727.10 tcp_trace函数 73227.11 小结 736第28章 TCP的输入 73728.1 引言 73728.2 预处理 73928.3 tcp_dooptions函数 74528.4 首部预测 74728.5 TCP输入:缓慢的执行路径 75228.6 完成被动打开或主动打开 75228.6.1 完成被动打开 75328.6.2 完成主动打开 75628.7 PAWS:防止序号回绕 76028.8 裁剪报文段使数据在窗口内 76228.9 自连接和同时打开 76828.10 记录时间戳 77028.11 RST处理 77028.12 小结 772第29章 TCP的输入(续) 77329.1 引言 77329.2 ACK处理概述 77329.3 完成被动打开和同时打开 77429.4 快速重传和快速恢复的算法 77529.5 ACK处理 77829.6 更新窗口信息 78429.7 紧急方式处理 78629.8 tcp_pulloutofband函数 78829.9 处理已接收的数据 78929.10 FIN处理 79129.11 最后的处理 79329.12 实现求精 79529.13 首部压缩 79529.13.1 引言 79629.13.2 首部字段的压缩 79929.13.3 特殊情况 80129.13.4 实例 80229.13.5 配置 80329.14 小结 803第30章 TCP的用户需求 80530.1 引言 80530.2 tcp_usrreq函数 80530.3 tcp_attach函数 81430.4 tcp_disconnect函数 81530.5 tcp_usrclosed函数 81630.6 tcp_ctloutput函数 81730.7 小结 820第31章 BPF:BSD 分组过滤程序 82131.1 引言 82131.2 代码介绍 82131.2.1 全局变量 82131.2.2 统计量 82231.3 bpf_if结构 82231.4 bpf_d结构 82531.4.1 bpfopen函数 82631.4.2 bpfioctl函数 82731.4.3 bpf_setif函数 83031.4.4 bpf_attachd函数 83131.5 BPF的输入 83231.5.1 bpf_tap函数 83231.5.2 catchpacket函数 83331.5.3 bpfread函数 83531.6 BPF的输出 83731.7 小结 838第32章 原始IP 83932.1 引言 83932.2 代码介绍 83932.2.1 全局变量 83932.2.2 统计量 84032.3 原始 IP的protosw结构 84032.4 rip_init函数 84232.5 rip_input函数 84232.6 rip_output函数 84432.7 rip_usrreq函数 84632.8 rip_ctloutput函数 85032.9 小结 852结束语 853附录A 部分习题的解答 854附录B 源代码的获取 872附录C RFC 1122 的有关内容 874参考文献 895
章节摘录
插图:
编辑推荐
《TCP》针对任何希望理解TCP/IP协议是如何实现的读者设计;无论是编写网络应用的程序员,负责利用TCP/TP维护计算机系统和网络的系统管理员,还是任何有兴趣理解大块非凡代码的普通读者;本书都是一本优秀的教科书。
图书封面
图书标签Tags
无
评论、评分、阅读与下载