本书完整而详细地介绍了TCP/IP协议是如何实现的。书中给出了约500个图例,15 000行实际操作的C代码,采用举例教学的方法帮助你掌握TCP/IP实现。本书不仅说明了插口API和协议族的关系以及主机实现与路由器实现的差别。还介绍了4.4BSD-Lite版的新的特点,如多播、长肥管道支持、窗口缩放、时间戳选项以及其他主题等等。读者阅读本书时,应当具备卷1中阐述的关于TCP/IP的基本知识。本书适用于希望理解TCP/TP协议如何实现的人,包括编写网络应用程序的程序员以及利用TCP/IP维护计算机网络的系统管理员。
目 录\r\n译者序\r\n前言\r\n第1章 概述 1\r\n1.1 引言 1\r\n1.2 源代码表示 1\r\n1.2.1 将拥塞窗口设置为1 1\r\n1.2.2 印刷约定 2\r\n1.3 历史 2\r\n1.4 应用编程接口 3\r\n1.5 程序示例 4\r\n1.6 系统调用和库函数 6\r\n1.7 网络实现概述 6\r\n1.8 描述符 7\r\n1.9 mbuf与输出处理 11\r\n1.9.1 包含插口地址结构的mbuf 11\r\n1.9.2 包含数据的mbuf 12\r\n1.9.3 添加IP和UDP首部 13\r\n1.9.4 IP输出 14\r\n1.9.5 以太网输出 14\r\n1.9.6 UDP输出小结 14\r\n1.10 输入处理 15\r\n1.10.1 以太网输入 15\r\n1.10.2 IP输入 15\r\n1.10.3 UDP输入 16\r\n1.10.4 进程输入 17\r\n1.11 网络实现概述(续) 17\r\n1.12 中断级别与并发 18\r\n1.13 源代码组织 20\r\n1.14 测试网络 21\r\n1.15 小结 22\r\n第2章 mbuf:存储器缓存 24\r\n2.1 引言 24\r\n2.2 代码介绍 27\r\n2.2.1 全局变量 27\r\n2.2.2 统计 28\r\n2.2.3 内核统计 28\r\n2.3 mbuf的定义 29\r\n2.4 mbuf结构 29\r\n2.5 简单的mbuf宏和函数 31\r\n2.5.1 m_get函数 32\r\n2.5.2 MGET宏 32\r\n2.5.3 m_retry函数 33\r\n2.5.4 mbuf锁 34\r\n2.6 m_devget和m_pullup函数 34\r\n2.6.1 m_devget函数 34\r\n2.6.2 mtod和dtom宏 36\r\n2.6.3 m_pullup函数和连续的协议首部 36\r\n2.6.4 m_pullup和IP的分片与重组 37\r\n2.6.5 TCP重组避免调用m_pullup 39\r\n2.6.6 m_pullup使用总结 40\r\n2.7 mbuf宏和函数的小结 40\r\n2.8 Net/3联网数据结构小结 42\r\n2.9 m_copy和簇引用计数 43\r\n2.10 其他选择 47\r\n2.11 小结 47\r\n第3章 接口层 49\r\n3.1 引言 49\r\n3.2 代码介绍 49\r\n3.2.1 全局变量 49\r\n3.2.2 SNMP变量 50\r\n3.3 ifnet结构 51\r\n3.4 ifaddr结构 57\r\n3.5 sockaddr结构 58\r\n3.6 ifnet与ifaddr的专用化 59\r\n3.7 网络初始化概述 60\r\n3.8 以太网初始化 61\r\n3.9 SLIP初始化 64\r\n3.10 环回初始化 65\r\n3.11 if_attach函数 66\r\n3.12 ifinit函数 72\r\n3.13 小结 73\r\n第4章 接口:以太网 74\r\n4.1 引言 74\r\n4.2 代码介绍 75\r\n4.2.1 全局变量 75\r\n4.2.2 统计量 75\r\n4.2.3 SNMP变量 76\r\n4.3 以太网接口 77\r\n4.3.1 leintr函数 79\r\n4.3.2 leread函数 79\r\n4.3.3 ether_input函数 81\r\n4.3.4 ether_output函数 84\r\n4.3.5 lestart函数 87\r\n4.4 ioctl系统调用 89\r\n4.4.1 ifioctl函数 90\r\n4.4.2 ifconf函数 91\r\n4.4.3 举例 94\r\n4.4.4 通用接口ioctl命令 95\r\n4.4.5 if_down和if_up函数 96\r\n4.4.6 以太网、SLIP和环回 97\r\n4.5 小结 98\r\n第5章 接口:SLIP和环回 100\r\n5.1 引言 100\r\n5.2 代码介绍 100\r\n5.2.1 全局变量 100\r\n5.2.2 统计量 101\r\n5.3 SLIP接口 101\r\n5.3.1 SLIP线路规程:SLIPDISC 101\r\n5.3.2 SLIP初始化:slopen和slinit 103\r\n5.3.3 SLIP输入处理:slinput 105\r\n5.3.4 SLIP输出处理:sloutput 109\r\n5.3.5 slstart函数 111\r\n5.3.6 SLIP分组丢失 116\r\n5.3.7 SLIP性能考虑 117\r\n5.3.8 slclose函数 117\r\n5.3.9 sltioctl函数 118\r\n5.4 环回接口 119\r\n5.5 小结 121\r\n第6章 IP编址 123\r\n6.1 引言 123\r\n6.1.1 IP地址 123\r\n6.1.2 IP地址的印刷规定 123\r\n6.1.3 主机和路由器 124\r\n6.2 代码介绍 125\r\n6.3 接口和地址小结 125\r\n6.4 sockaddr_in结构 126\r\n6.5 in_ifaddr结构 127\r\n6.6 地址指派 128\r\n6.6.1 ifioctl函数 130\r\n6.6.2 in_control函数 130\r\n6.6.3 前提条件:SIOCSIFADDR、\r\n SIOCSIFNETMASK和\r\n SIOCSIFDSTADDR 132\r\n6.6.4 地址指派:SIOCSIFADDR 133\r\n6.6.5 in_ifinit函数 133\r\n6.6.6 网络掩码指派:SIOCSIFNETMASK 136\r\n6.6.7 目的地址指派:SIOCSIFDSTADDR 137\r\n6.6.8 获取接口信息 137\r\n6.6.9 每个接口多个IP地址 138\r\n6.6.10 附加IP地址:SIOCAIFADDR 139\r\n6.6.11 删除IP地址:SIOCDIFADDR 140\r\n6.7 接口ioctl处理 141\r\n6.7.1 leioctl函数 141\r\n6.7.2 slioctl函数 142\r\n6.7.3 loioctl函数 143\r\n6.8 Internet实用函数 144\r\n6.9 ifnet实用函数 144\r\n6.10 小结 145\r\n第7章 域和协议 146\r\n7.1 引言 146\r\n7.2 代码介绍 146\r\n7.2.1 全局变量 147\r\n7.2.2 统计量 147\r\n7.3 domain结构 147\r\n7.4 protosw结构 148\r\n7.5 IP 的domain和protosw结构 150\r\n7.6 pffindproto和pffindtype函数 155\r\n7.7 pfctlinput函数 157\r\n7.8 IP初始化 157\r\n7.8.1 Internet传输分用 157\r\n7.8.2 ip_init函数 158\r\n7.9 sysctl系统调用 159\r\n7.10 小结 161\r\n第8章 IP:网际协议 162\r\n8.1 引言 162\r\n8.2 代码介绍 163\r\n8.2.1 全局变量 163\r\n8.2.2 统计量 163\r\n8.2.3 SNMP变量 164\r\n8.3 IP分组 165\r\n8.4 输入处理:ipintr函数 167\r\n8.4.1 ipintr概观 167\r\n8.4.2 验证 168\r\n8.4.3 转发或不转发 171\r\n8.4.4 重装和分用 173\r\n8.5 转发:ip_forward函数 174\r\n8.6 输出处理:ip_output函数 180\r\n8.6.1 首部初始化 181\r\n8.6.2 路由选择 182\r\n8.6.3 源地址选择和分片 184\r\n8.7 Internet检验和:in_cksum函数 186\r\n8.8 setsockopt和getsockopt系统调用 190\r\n8.8.1 PRCO_SETOPT的处理 192\r\n8.8.2 PRCO_GETOPT的处理 193\r\n8.9 ip_sysctl函数 193\r\n8.10 小结 194\r\n第9章 IP选项处理 196\r\n9.1 引言 196\r\n9.2 代码介绍 196\r\n9.2.1 全局变量 196\r\n9.2.2 统计量 197\r\n9.3 选项格式 197\r\n9.4 ip_dooptions函数 198\r\n9.5 记录路由选项 200\r\n9.6 源站和记录路由选项 202\r\n9.6.1 save_rte函数 205\r\n9.6.2 ip_srcroute函数 206\r\n9.7 时间戳选项 207\r\n9.8 ip_insertoptions函数 210\r\n9.9 ip_pcbopts函数 214\r\n9.10 一些限制 217\r\n9.11 小结 217\r\n第10章 IP的分片与重装 218\r\n10.1 引言 218\r\n10.2 代码介绍 219\r\n10.2.1 全局变量 220\r\n10.2.2 统计量 220\r\n10.3 分片 220\r\n10.4 ip_optcopy函数 223\r\n10.5 重装 224\r\n10.6 ip_reass函数 227\r\n10.7 ip_slowtimo函数 237\r\n10.8 小结 238\r\n第11章 ICMP:Internet控制报文协议 239\r\n11.1 引言 239\r\n11.2 代码介绍 242\r\n11.2.1 全局变量 242\r\n11.2.2 统计量 242\r\n11.2.3 SNMP变量 243\r\n11.3 icmp结构 244\r\n11.4 ICMP 的protosw结构 245\r\n11.5 输入处理:icmp_input函数 246\r\n11.6 差错处理 249\r\n11.7 请求处理 251\r\n11.7.1 回显询问:ICMP_ECHO和\r\n ICMP_ECHOREPLY 252\r\n11.7.2 时间戳询问:ICMP_TSTAMP和\r\n ICMP_TSTAMPREPLY 253\r\n11.7.3 地址掩码询问:ICMP_MASKREQ和\r\n ICMP_MASKREPLY 253\r\n11.7.4 信息询问:ICMP_IREQ和ICMP_\r\n IREQREPLY 255\r\n11.7.5 路由器发现:ICMP_ROUTERADVERT\r\n 和ICMP_ROUTERSOLICIT 255\r\n11.8 重定向处理 255\r\n11.9 回答处理 257\r\n11.10 输出处理 257\r\n11.11 icmp_error函数 258\r\n11.12 icmp_reflect函数 261\r\n11.13 icmp_send函数 265\r\n11.14 icmp_sysctl函数 266\r\n11.15 小结 266\r\n第12章 IP多播 268\r\n12.1 引言 268\r\n12.2 代码介绍 269\r\n12.2.1 全局变量 270\r\n12.2.2 统计量 270\r\n12.3 以太网多播地址 270\r\n12.4 ether_multi结构 271\r\n12.5 以太网多播接收 273\r\n12.6 in_multi结构 273\r\n12.7 ip_moptions结构 275\r\n12.8 多播的插口选项 276\r\n12.9 多播的TTL值 277\r\n12.9.1 MBONE 278\r\n12.9.2 扩展环搜索 278\r\n12.10 ip_setmoptions函数 278\r\n12.10.1 选择一个明确的多播接口:IP_\r\n MULTICAST_IF 280\r\n12.10.2 选择明确的多播TTL: IP_ \r\n MULTICAST_TTL 281\r\n12.10.3 选择多播环回:IP_MULTICAST_\r\n LOOP 281\r\n12.11 加入一个IP多播组 282\r\n12.11.1 in_addmulti函数 285\r\n12.11.2 slioctl和loioctl函数:SIOCADDMULTI和SIOCDELMULTI 287\r\n12.11.3 leioctl函数:SIOCADDMULTI和\r\n SIOCDELMULTI 288\r\n12.11.4 ether_addmulti函数 288\r\n12.12 离开一个IP多播组 291\r\n12.12.1 in_delmulti函数 292\r\n12.12.2 ether_delmulti函数 293\r\n12.13 ip_getmoptions函数 295\r\n12.14 多播输入处理:ipintr函数 296\r\n12.15 多播输出处理:ip_output函数 298\r\n12.16 性能的考虑 301\r\n12.17 小结 301\r\n第13章 IGMP:Internet组管理协议 303\r\n13.1 引言 303\r\n13.2 代码介绍 304\r\n13.2.1 全局变量 304\r\n13.2.2 统计量 304\r\n13.2.3 SNMP变量 305\r\n13.3 igmp结构 305\r\n13.4 IGMP的protosw的结构 306\r\n13.5 加入一个组:igmp_joingroup函数 306\r\n13.6 igmp_fasttimo函数 308\r\n13.7 输入处理:igmp_input函数 311\r\n13.7.1 成员关系查询:IGMP_HOST_\r\n MEMBERSHIP_QUERY 312\r\n13.7.2 成员关系报告:IGMP_HOST_\r\n MEMBERSHIP_REPORT 313\r\n13.8 离开一个组:igmp_leavegroup函数 314\r\n13.9 小结 315\r\n第14章 IP多播选路 316\r\n14.1 引言 316\r\n14.2 代码介绍 316\r\n14.2.1 全局变量 316\r\n14.2.2 统计量 317\r\n14.2.3 SNMP变量 317\r\n14.3 多播输出处理(续) 317\r\n14.4 mrouted守护程序 318\r\n14.5 虚拟接口 321\r\n14.5.1 虚拟接口表 322\r\n14.5.2 add_vif函数 324\r\n14.5.3 del_vif函数 326\r\n14.6 IGMP(续) 327\r\n14.6.1 add_lgrp函数 328\r\n14.6.2 del_lgrp函数 329\r\n14.6.3 grplst_member函数 330\r\n14.7 多播选路 331\r\n14.7.1 多播选路表 334\r\n14.7.2 del_mrt函数 335\r\n14.7.3 add_mrt函数 336\r\n14.7.4 mrtfind函数 337\r\n14.8 多播转发:ip_mforward函数 338\r\n14.8.1 phyint_send函数 343\r\n14.8.2 tunnel_send函数 344\r\n14.9 清理:ip_mrouter_done函数 345\r\n14.10 小结 346\r\n第15章 插口层 348\r\n15.1 引言 348\r\n15.2 代码介绍 349\r\n15.3 socket结构 349\r\n15.4 系统调用 354\r\n15.4.1 举例 355\r\n15.4.2 系统调用小结 355\r\n15.5 进程、描述符和插口 357\r\n15.6 socket系统调用 358\r\n15.6.1 socreate函数 359\r\n15.6.2 超级用户特权 361\r\n15.7 getsock和sockargs函数 361\r\n15.8 bind系统调用 363\r\n15.9 listen系统调用 364\r\n15.10 tsleep和wakeup函数 365\r\n15.11 accept系统调用 366\r\n15.12 sonewconn和soisconnected\r\n函数 369\r\n15.13 connect系统调用 372\r\n15.13.1 soconnect函数 374\r\n15.13.2 切断无连接插口和外部地址的\r\n关联 375\r\n15.14 shutdown系统调用 375\r\n15.15 close系统调用 377\r\n15.15.1 soo_close函数 377\r\n15.15.2 soclose函数 378\r\n15.16 小结 380\r\n第16章 插口I/O 381\r\n16.1 引言 381\r\n16.2 代码介绍 381\r\n16.3 插口缓存 381\r\n16.4 write、writev、sendto和sendmsg\r\n系统调用 384\r\n16.5 sendmsg系统调用 387\r\n16.6 sendit函数 388\r\n16.6.1 uiomove函数 389\r\n16.6.2 举例 390\r\n16.6.3 sendit代码 391\r\n16.7 sosend函数 392\r\n16.7.1 可靠的协议缓存 393\r\n16.7.2 不可靠的协议缓存 393\r\n16.7.3 sosend函数小结 401\r\n16.7.4 性能问题 401\r\n16.8 read、readv、recvfrom和recvmsg\r\n 系统调用 401\r\n16.9 recvmsg系统调用 402\r\n16.10 recvit函数 403\r\n16.11 soreceive函数 405\r\n16.11.1 带外数据 406\r\n16.11.2 举例 406\r\n16.11.3 其他的接收操作选项 407\r\n16.11.4 接收缓存的组织:报文边界 407\r\n16.11.5 接收缓存的组织:没有报文边界 408\r\n16.11.6 控制信息和带外数据 409\r\n16.12 soreceive代码 410\r\n16.13 select系统调用 421\r\n16.13.1 selscan函数 425\r\n16.13.2 soo_select函数 425\r\n16.13.3 selrecord函数 427\r\n16.13.4 selwakeup函数 428\r\n16.14 小结 429\r\n第17章 插口选项 431\r\n17.1 引言 431\r\n17.2 代码介绍 431\r\n17.3 setsockopt系统调用 432\r\n17.4 getsockopt系统调用 437\r\n17.5 fcntl和ioctl系统调用 440\r\n17.5.1 fcntl代码 441\r\n17.5.2 ioctl代码 443\r\n17.6 getsockname系统调用 444\r\n17.7 getpeername系统调用 445\r\n17.8 小结 447\r\n第18章 Radix树路由表 448\r\n18.1 引言 448\r\n18.2 路由表结构 448\r\n18.3 选路插口 456\r\n18.4 代码介绍 456\r\n18.4.1 全局变量 458\r\n18.4.2 统计量 458\r\n18.4.3 SNMP变量 459\r\n18.5 Radix结点数据结构 460\r\n18.6 选路结构 463\r\n18.7 初始化:route_init和rtable_init\r\n函数 465\r\n18.8 初始化:rn_init和rn_inithead\r\n函数 468\r\n18.9 重复键和掩码列表 471\r\n18.10 rn_match函数 473\r\n18.11 rn_search函数 480\r\n18.12 小结 481\r\n第19章 选路请求和选路消息 482\r\n19.1 引言 482\r\n19.2 rtalloc和rtalloc1函数 482\r\n19.3 宏RTFREE和rtfree函数 484\r\n19.4 rtrequest函数 486\r\n19.5 rt_setgate函数 491\r\n19.6 rtinit函数 493\r\n19.7 rtredirect函数 495\r\n19.8 选路消息的结构 498\r\n19.9 rt_missmsg函数 501\r\n19.10 rt_ifmsg函数 503\r\n19.11 rt_newaddrmsg函数 504\r\n19.12 rt_msg1函数 505\r\n19.13 rt_msg2函数 507\r\n19.14 sysctl_rtable函数 510\r\n19.15 sysctl_dumpentry函数 514\r\n19.16 sysctl_iflist函数 515\r\n19.17 小结 517\r\n第20章 选路插口 518\r\n20.1 引言 518\r\n20.2 routedomain和protosw结构 518\r\n20.3 选路控制块 519\r\n20.4 raw_init函数 520\r\n20.5 route_output函数 520\r\n20.6 rt_xaddrs函数 530\r\n20.7 rt_setmetrics函数 531\r\n20.8 raw_input函数 532\r\n20.9 route_usrreq函数 534\r\n20.10 raw_usrreq函数 535\r\n20.11 raw_attach、raw_detach和raw_disconnect函数 539\r\n20.12 小结 540\r\n第21章 ARP:地址解析协议 542\r\n21.1 介绍 542\r\n21.2 ARP和路由表 542\r\n21.3 代码介绍 544\r\n21.3.1 全局变量 544\r\n21.3.2 统计量 544\r\n21.3.3 SNMP变量 546\r\n21.4 ARP结构 546\r\n21.5 arpwhohas函数 548\r\n21.6 arprequest函数 548\r\n21.7 arpintr函数 551\r\n21.8 in_arpinput函数 552\r\n21.9 ARP定时器函数 557\r\n21.9.1 arptimer函数 557\r\n21.9.2 arptfree函数 557\r\n21.10 arpresolve函数 558\r\n21.11 arplookup函数 562\r\n21.12 代理ARP 563\r\n21.13 arp_rtrequest函数 564\r\n21.14 ARP和多播 569\r\n21.15 小结 570\r\n第22章 协议控制块 572\r\n22.1 引言 572\r\n22.2 代码介绍 573\r\n22.2.1 全局变量 574\r\n22.2.2 统计量 574\r\n22.3 inpcb的结构 574\r\n22.4 in_pcballoc和in_pcbdetach函数 575\r\n22.5 绑定、连接和分用 577\r\n22.6 in_pcblookup函数 581\r\n22.7 in_pcbbind函数 584\r\n22.8 in_pcbconnect函数 589\r\n22.9 in_pcbdisconnect函数 594\r\n22.10 in_setsockaddr和in_setpeeraddr\r\n函数 595\r\n22.11 in_pcbnotify、in_rtchange和in_losing函数 595\r\n22.11.1 in_rtchange函数 598\r\n22.11.2 重定向和原始插口 599\r\n22.11.3 ICMP差错和UDP插口 600\r\n22.11.4 in_losing函数 601\r\n22.12 实现求精 602\r\n22.13 小结 602\r\n第23章 UDP:用户数据报协议 605\r\n23.1 引言 605\r\n23.2 代码介绍 605\r\n23.2.1 全局变量 606\r\n23.2.2 统计量 606\r\n23.2.3 SNMP变量 607\r\n23.3 UDP 的protosw结构 607\r\n23.4 UDP的首部 608\r\n23.5 udp_init函数 609\r\n23.6 udp_output函数 609\r\n23.6.1 在前面加上IP/UDP首部和mbuf簇 612\r\n23.6.2 UDP检验和计算和伪首部 612\r\n23.7 udp_input函数 616\r\n23.7.1 对收到的UDP数据报的一般确认 616\r\n23.7.2 分用单播数据报 619\r\n23.7.3 分用多播和广播数据报 622\r\n23.7.4 连接上的UDP插口和多接口主机 625\r\n23.8 udp_saveopt函数 625\r\n23.9 udp_ctlinput函数 627\r\n23.10 udp_usrreq函数 628\r\n23.11 udp_sysctl函数 633\r\n23.12 实现求精 633\r\n23.12.1 UDP PCB高速缓存 633\r\n23.12.2 UDP检验和 634\r\n23.13 小结 635\r\n第24章 TCP:传输控制协议 636\r\n24.1 引言 636\r\n24.2 代码介绍 636\r\n24.2.1 全局变量 636\r\n24.2.2 统计量 637\r\n24.2.3 SNMP变量 640\r\n24.3 TCP 的protosw结构 641\r\n24.4 TCP的首部 641\r\n24.5 TCP的控制块 643\r\n24.6 TCP的状态变迁图 645\r\n24.7 TCP的序号 646\r\n24.8 tcp_init函数 650\r\n24.9 小结 652\r\n第25章 TCP的定时器 654\r\n25.1 引言 654\r\n25.2 代码介绍 655\r\n25.3 tcp_canceltimers函数 657\r\n25.4 tcp_fasttimo函数 657\r\n25.5 tcp_slowtimo函数 658\r\n25.6 tcp_timers函数 659\r\n25.6.1 FIN_WAIT_2和2MSL定时器 660\r\n25.6.2 持续定时器 662\r\n25.6.3 连接建立定时器和保活定时器 662\r\n25.7 重传定时器的计算 665\r\n25.8 tcp_newtcpcb算法 666\r\n25.9 tcp_setpersist函数 668\r\n25.10 tcp_xmit_timer函数 669\r\n25.11 重传超时:tcp_timers函数 673\r\n25.11.1 慢起动和避免拥塞 675\r\n25.11.2 精确性 677\r\n25.12 一个RTT的例子 677\r\n25.13 小结 679\r\n第26章 TCP输出 680\r\n26.1 引言 680\r\n26.2 tcp_output概述 680\r\n26.3 决定是否应发送一个报文段 682\r\n26.4 TCP选项 691\r\n26.5 窗口大小选项 692\r\n26.6 时间戳选项 692\r\n26.6.1 哪个时间戳需要回显,RFC1323\r\n算法 694\r\n26.6.2 哪个时间戳需要回显,正确的\r\n算法 695\r\n26.6.3 时间戳与延迟ACK 695\r\n26.7 发送一个报文段 696\r\n26.8 tcp_template函数 707\r\n26.9 tcp_respond函数 708\r\n26.10 小结 710\r\n第27章 TCP的函数 712\r\n27.1 引言 712\r\n27.2 tcp_drain函数 712\r\n27.3 tcp_drop函数 712\r\n27.4 tcp_close函数 713\r\n27.4.1 路由特性 713\r\n27.4.2 资源释放 716\r\n27.5 tcp_mss函数 717\r\n27.6 tcp_ctlinput函数 722\r\n27.7 tcp_notify函数 723\r\n27.8 tcp_quench函数 724\r\n27.9 TCP_REASS宏和tcp_reass函数 724\r\n27.9.1 TCP_REASS宏 725\r\n27.9.2 tcp_reass函数 727\r\n27.10 tcp_trace函数 732\r\n27.11 小结 736\r\n第28章 TCP的输入 737\r\n28.1 引言 737\r\n28.2 预处理 739\r\n28.3 tcp_dooptions函数 745\r\n28.4 首部预测 747\r\n28.5 TCP输入:缓慢的执行路径 752\r\n28.6 完成被动打开或主动打开 752\r\n28.6.1 完成被动打开 753\r\n28.6.2 完成主动打开 756\r\n28.7 PAWS:防止序号回绕 760\r\n28.8 裁剪报文段使数据在窗口内 762\r\n28.9 自连接和同时打开 768\r\n28.10 记录时间戳 770\r\n28.11 RST处理 770\r\n28.12 小结 772\r\n第29章 TCP的输入(续) 773\r\n29.1 引言 773\r\n29.2 ACK处理概述 773\r\n29.3 完成被动打开和同时打开 774\r\n29.4 快速重传和快速恢复的算法 775\r\n29.5 ACK处理 778\r\n29.6 更新窗口信息 784\r\n29.7 紧急方式处理 786\r\n29.8 tcp_pulloutofband函数 788\r\n29.9 处理已接收的数据 789\r\n29.10 FIN处理 791\r\n29.11 最后的处理 793\r\n29.12 实现求精 795\r\n29.13 首部压缩 795\r\n29.13.1 引言 796\r\n29.13.2 首部字段的压缩 799\r\n29.13.3 特殊情况 801\r\n29.13.4 实例 802\r\n29.13.5 配置 803\r\n29.14 小结 803\r\n第30章 TCP的用户需求 805\r\n30.1 引言 805\r\n30.2 tcp_usrreq函数 805\r\n30.3 tcp_attach函数 814\r\n30.4 tcp_disconnect函数 815\r\n30.5 tcp_usrclosed函数 816\r\n30.6 tcp_ctloutput函数 817\r\n30.7 小结 820\r\n第31章 BPF:BSD 分组过滤程序 821\r\n31.1 引言 821\r\n31.2 代码介绍 821\r\n31.2.1 全局变量 821\r\n31.2.2 统计量 822\r\n31.3 bpf_if结构 822\r\n31.4 bpf_d结构 825\r\n31.4.1 bpfopen函数 826\r\n31.4.2 bpfioctl函数 827\r\n31.4.3 bpf_setif函数 830\r\n31.4.4 bpf_attachd函数 831\r\n31.5 BPF的输入 832\r\n31.5.1 bpf_tap函数 832\r\n31.5.2 catchpacket函数 833\r\n31.5.3 bpfread函数 835\r\n31.6 BPF的输出 837\r\n31.7 小结 838\r\n第32章 原始IP 839\r\n32.1 引言 839\r\n32.2 代码介绍 839\r\n32.2.1 全局变量 839\r\n32.2.2 统计量 840\r\n32.3 原始 IP的protosw结构 840\r\n32.4 rip_init函数 842\r\n32.5 rip_input函数 842\r\n32.6 rip_output函数 844\r\n32.7 rip_usrreq函数 846\r\n32.8 rip_ctloutput函数 850\r\n32.9 小结 852\r\n结束语 853\r\n附录A 部分习题的解答 854\r\n附录B 源代码的获取 872\r\n附录C RFC 1122 的有关内容 874\r\n参考文献 895
本书描述并给出了TCP/IP实现引用的源代码:加利福尼亚大学伯克利分校的计算机系统研究组(CSRG)的实现。历史上,它曾以4.xBSD系统(伯克利软件发行)发布。这个实现第一次发布是在1982年,经过了很多重大的改变和改进,并且有很多引入到其他Unix和非Unix系统中。这不是一个没有多大意义的实现,而是天天在世界上成千上万个系统上运行的TCP/IP实现的基础。这个实现还提供路由功能,显示在一个主机和一个路由器的TCP/IP实现间的区别。
我们描述这个实现并给出TCP/IP内核实现的完整源代码,大约15 000行C代码。在本文中描述的是4.4BSD-Lite版本。这个代码在1994年4月公开,包含很多增强的联网部分,它们被添加到1988年的4.3BSDTahoe版、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中给出大多数习题的答案作为自学的参考,使本书能发挥最大的作用。