《TCP/IP详解 卷2:实现》

举报
华章计算机 发表于 2019/11/19 21:34:07 2019/11/19
【摘要】 本节书摘来自华章计算机《TCP/IP详解 卷2:实现》一作者是[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens),陆雪莹 蒋慧 等译 谢希仁 校。

计算机科学丛书

TCP/IP详解   卷2:实现

TCP/IP Illustrated Volume 2: The Implementation

1574170411105625.jpg


[美]加里R.赖特(Gary R.Wright),W. 理查德史蒂文斯(W.Richard Stevens)著

陆雪莹 蒋慧 等译 谢希仁 校

 

 

 

 

出版者的话

 

文艺复兴以来,源远流长的科学精神和逐步形成的学术规范,使西方国家在自然科学的各个领域取得了垄断性的优势;也正是这样的优势,使美国在信息技术发展的六十多年间名家辈出、独领风骚。在商业化的进程中,美国的产业界与教育界越来越紧密地结合,计算机学科中的许多泰山北斗同时身处科研和教学的最前线,由此而产生的经典科学著作,不仅擘划了研究的范畴,还揭示了学术的源变,既遵循学术规范,又自有学者个性,其价值并不会因年月的流逝而减退。

近年,在全球信息化大潮的推动下,我国的计算机产业发展迅猛,对专业人才的需求日益迫切。这对计算机教育界和出版界都既是机遇,也是挑战;而专业教材的建设在教育战略上显得举足轻重。在我国信息技术发展时间较短的现状下,美国等发达国家在其计算机科学发展的几十年间积淀和发展的经典教材仍有许多值得借鉴之处。因此,引进一批国外优秀计算机教材将对我国计算机教育事业的发展起到积极的推动作用,也是与世界接轨、建设真正的世界一流大学的必由之路。

机械工业出版社华章公司较早意识到“出版要为教育服务”。自1998年开始,我们就将工作重点放在了遴选、移译国外优秀教材上。经过多年的不懈努力,我们与Pearson、McGraw-Hill、Elsevier、MIT、John Wiley & Sons、Cengage等世界著名出版公司建立了良好的合作关系,从它们现有的数百种教材中甄选出Andrew S. Tanenbaum、Bjarne Stroustrup、Brian W. Kernighan、Dennis Ritchie、Jim Gray、Afred V. Aho、John E. Hopcroft、Jeffrey D. Ullman、Abraham Silberschatz、William Stallings、Donald E. Knuth、John L. Hennessy、Larry L. Peterson等大师名家的一批经典作品,以“计算机科学丛书”为总称出版,供读者学习、研究及珍藏。大理石纹理的封面,也正体现了这套丛书的品位和格调。

“计算机科学丛书”的出版工作得到了国内外学者的鼎力相助,国内的专家不仅提供了中肯的选题指导,还不辞劳苦地担任了翻译和审校的工作;而原书的作者也相当关注其作品在中国的传播,有的还专门为其书的中译本作序。迄今,“计算机科学丛书”已经出版了近500个品种,这些书籍在读者中树立了良好的口碑,并被许多高校采用为正式教材和参考书籍。其影印版“经典原版书库”作为姊妹篇也被越来越多实施双语教学的学校所采用。

权威的作者、经典的教材、一流的译者、严格的审校、精细的编辑,这些因素使我们的图书有了质量的保证。随着计算机科学与技术专业学科建设的不断完善和教材改革的逐渐深化,教育界对国外计算机教材的需求和应用都将步入一个新的阶段,我们的目标是尽善尽美,而反馈的意见正是我们达到这一终极目标的重要帮助。华章公司欢迎老师和读者对我们的工作提出建议或给予指正,我们的联系方法如下:

华章网站:www.hzbook.com

电子邮件:hzjsj@hzbook.com

联系电话:(010)88379604

联系地址:北京市西城区百万庄南街1号

邮政编码:100037

 

 

 

译   者   序

我们愿意向广大的读者推荐W. Richard Stevens关于TCP/IP的经典著作(共3卷)的中译本。本书是其中的第2卷:《TCP/IP详解   卷2:实现》。

大家知道,TCP/IP已成为计算机网络事实上的标准。在关于TCP/IP的论著中,最有影响的就是两部著作。一部是Douglas E. Comer写的《用TCP/IP进行网际互连》,一套共3卷,而另一部就是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实现引用的源代码—加利福尼亚大学伯克利分校的计算机系统研究组(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   将拥塞窗口设置为1      1

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   包含插口地址结构的mbuf  11

1.9.2   包含数据的mbuf    12

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_pullup      39

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线路规程:SLIPDISC     101

5.3.2   SLIP初始化:slopen和slinit     103

5.3.3   SLIP输入处理:slinput 105

5.3.4   SLIP输出处理:sloutput      109

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和SIOCSIFDSTADDR   132

6.6.4   地址指派:SIOCSIFADDR    133

6.6.5   in_ifinit函数     133

6.6.6   网络掩码指派:SIOCSIFNETMASK   136

6.6.7   目的地址指派:SIOCSIFDSTADDR    137

6.6.8   获取接口信息   137

6.6.9   每个接口多个IP地址    138

6.6.10   附加IP地址:SIOCAIFADDR   139

6.6.11   删除IP地址:SIOCDIFADDR   140

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   小结      194

第9章   IP选项处理   196

9.1   引言 196

9.2   代码介绍       196

9.2.1   全局变量    196

9.2.2   统计量 197

9.3   选项格式       197

9.4   ip_dooptions函数      198

9.5   记录路由选项      200

9.6   源站和记录路由选项 202

9.6.1   save_rte函数    205

9.6.2   ip_srcroute函数      206

9.7   时间戳选项   207

9.8   ip_insertoptions函数 210

9.9   ip_pcbopts函数  214

9.10   一些限制     217

9.11   小结      217

第10章   IP的分片与重装       218

10.1   引言      218

10.2   代码介绍     219

10.2.1   全局变量  220

10.2.2   统计量      220

10.3   分片      220

10.4   ip_optcopy函数       223

10.5   重装      224

10.6   ip_reass函数     227

10.7   ip_slowtimo函数     237

10.8   小结      238

第11章   ICMP:Internet控制报文协议    239

11.1   引言      239

11.2   代码介绍     242

11.2.1   全局变量  242

11.2.2   统计量      242

11.2.3   SNMP变量     243

11.3   icmp结构   244

11.4   ICMP 的protosw结构   245

11.5   输入处理:icmp_input函数 246

11.6   差错处理     249

11.7   请求处理     251

11.7.1   回显询问:ICMP_ECHO和

             ICMP_ECHOREPLY    252

11.7.2   时间戳询问:ICMP_TSTAMP和

             ICMP_TSTAMPREPLY 253

11.7.3   地址掩码询问:ICMP_MASKREQ和ICMP_MASKREPLY 253

11.7.4   信息询问:ICMP_IREQ和ICMP_IREQREPLY      255

11.7.5   路由器发现:ICMP_ROUTERADVERT和ICMP_ROUTERSOLICIT 255

11.8   重定向处理 255

11.9   回答处理     257

11.10   输出处理   257

11.11   icmp_error函数      258

11.12   icmp_reflect函数   261

11.13   icmp_send函数     265

11.14   icmp_sysctl函数    266

11.15   小结    266

第12章   IP多播  268

12.1   引言      268

12.2   代码介绍     269

12.2.1   全局变量  270

12.2.2   统计量      270

12.3   以太网多播地址       270

12.4   ether_multi结构      271

12.5   以太网多播接收       273

12.6   in_multi结构     273

12.7   ip_moptions结构    275

12.8   多播的插口选项       276

12.9   多播的TTL值    277

12.9.1   MBONE    278

12.9.2   扩展环搜索     278

12.10   ip_setmoptions函数    278

12.10.1   选择一个明确的多播接口:IP_MULTICAST_IF 280

12.10.2   选择明确的多播TTL: IP_ MULTICAST_TTL 281

12.10.3   选择多播环回:IP_MULTICAST_LOOP       281

12.11   加入一个IP多播组       282

12.11.1   in_addmulti函数 285

12.11.2   slioctl和loioctl函数:SIOCADDMULTI和SIOCDELMULTI 287

12.11.3   leioctl函数:SIOCADDMULTI和SIOCDELMULTI   288

12.11.4   ether_addmulti函数  288

12.12   离开一个IP多播组       291

12.12.1   in_delmulti函数  292

12.12.2   ether_delmulti函数   293

12.13   ip_getmoptions函数    295

12.14   多播输入处理:ipintr函数 296

12.15   多播输出处理:ip_output函数 298

12.16   性能的考虑      301

12.17   小结    301

第13章   IGMP:Internet组管理协议 303

13.1   引言      303

13.2   代码介绍     304

13.2.1   全局变量  304

13.2.2   统计量      304

13.2.3   SNMP变量     305

13.3   igmp结构   305

13.4   IGMP的protosw的结构       306

13.5   加入一个组:igmp_joingroup函数  306

13.6   igmp_fasttimo函数 308

13.7   输入处理:igmp_input函数 311

13.7.1   成员关系查询:IGMP_HOST_MEMBERSHIP_QUERY       312

13.7.2   成员关系报告:IGMP_HOST_MEMBERSHIP_REPORT     313

13.8   离开一个组:igmp_leavegroup函数       314

13.9   小结      315

第14章   IP多播选路 316

14.1   引言      316

14.2   代码介绍     316

14.2.1   全局变量  316

14.2.2   统计量      317

14.2.3   SNMP变量     317

14.3   多播输出处理(续)    317

14.4   mrouted守护程序   318

14.5   虚拟接口     321

14.5.1   虚拟接口表     322

14.5.2   add_vif函数    324

14.5.3   del_vif函数     326

14.6   IGMP(续)     327

14.6.1   add_lgrp函数 328

14.6.2   del_lgrp函数  329

14.6.3   grplst_member函数    330

14.7   多播选路     331

14.7.1   多播选路表     334

14.7.2   del_mrt函数   335

14.7.3   add_mrt函数  336

14.7.4   mrtfind函数   337

14.8   多播转发:ip_mforward函数     338

14.8.1   phyint_send函数  343

14.8.2   tunnel_send函数  344

14.9   清理:ip_mrouter_done函数      345

14.10   小结    346

第15章   插口层  348

15.1   引言      348

15.2   代码介绍     349

15.3   socket结构 349

15.4   系统调用     354

15.4.1   举例   355

15.4.2   系统调用小结 355

15.5   进程、描述符和插口      357

15.6    socket系统调用     358

15.6.1   socreate函数  359

15.6.2   超级用户特权 361

15.7    getsock和sockargs函数    361

15.8    bind系统调用 363

15.9    listen系统调用       364

15.10   tsleep和wakeup函数 365

15.11   accept系统调用     366

15.12   sonewconn和soisconnected函数  369

15.13   connect系统调用  372

15.13.1   soconnect函数   374

15.13.2   切断无连接插口和外部地址的关联     375

15.14   shutdown系统调用      375

15.15   close系统调用 377

15.15.1   soo_close函数    377

15.15.2   soclose函数 378

15.16   小结    380

第16章   插口I/O      381

16.1   引言      381

16.2   代码介绍     381

16.3   插口缓存     381

16.4   write、writev、sendto和sendmsg系统调用       384

16.5   sendmsg系统调用  387

16.6   sendit函数 388

16.6.1   uiomove函数 389

16.6.2   举例   390

16.6.3   sendit代码     391

16.7   sosend函数       392

16.7.1   可靠的协议缓存    393

16.7.2   不可靠的协议缓存       393

16.7.3   sosend函数小结   401

16.7.4   性能问题  401

16.8   read、readv、recvfrom和recvmsg系统调用       401

16.9   recvmsg系统调用    402

16.10   recvit函数 403

16.11   soreceive函数 405

16.11.1   带外数据       406

16.11.2   举例 406

16.11.3   其他的接收操作选项 407

16.11.4   接收缓存的组织:报文边界   407

16.11.5   接收缓存的组织:没有报文边界  408

16.11.6   控制信息和带外数据 409

16.12   soreceive代码 410

16.13   select系统调用      421

16.13.1   selscan函数 425

16.13.2   soo_select函数   425

16.13.3   selrecord函数     427

16.13.4   selwakeup函数   428

16.14   小结    429

第17章   插口选项     431

17.1   引言      431

17.2   代码介绍     431

17.3   setsockopt系统调用      432

17.4   getsockopt系统调用      437

17.5   fcntl和ioctl系统调用    440

17.5.1   fcntl代码 441

17.5.2   ioctl代码  443

17.6   getsockname系统调用  444

17.7   getpeername系统调用  445

17.8   小结      447

第18章   Radix树路由表  448

18.1   引言      448

18.2   路由表结构 448

18.3   选路插口     456

18.4   代码介绍     456

18.4.1   全局变量  458

18.4.2   统计量      458

18.4.3   SNMP变量     459

18.5   Radix结点数据结构 460

18.6   选路结构     463

18.7   初始化:route_init和rtable_init函数      465

18.8   初始化:rn_init和rn_inithead函数  468

18.9   重复键和掩码列表   471

18.10   rn_match函数 473

18.11   rn_search函数 480

18.12   小结    481

第19章   选路请求和选路消息      482

19.1   引言      482

19.2   rtalloc和rtalloc1函数    482

19.3   宏RTFREE和rtfree函数       484

19.4   rtrequest函数    486

19.5   rt_setgate函数  491

19.6   rtinit函数    493

19.7   rtredirect函数    495

19.8   选路消息的结构       498

19.9   rt_missmsg函数      501

19.10   rt_ifmsg函数   503

19.11   rt_newaddrmsg函数    504

19.12   rt_msg1函数   505

19.13   rt_msg2函数   507

19.14   sysctl_rtable函数   510

19.15   sysctl_dumpentry函数 514

19.16   sysctl_iflist函数      515

19.17   小结    517

第20章   选路插口     518

20.1   引言      518

20.2   routedomain和protosw结构     518

20.3   选路控制块 519

20.4   raw_init函数      520

20.5   route_output函数    520

20.6   rt_xaddrs函数   530

20.7   rt_setmetrics函数    531

20.8   raw_input函数  532

20.9   route_usrreq函数    534

20.10   raw_usrreq函数     535

20.11   raw_attach、raw_detach和raw_disconnect函数      539

20.12   小结    540

第21章   ARP:地址解析协议       542

21.1   介绍      542

21.2   ARP和路由表    542

21.3   代码介绍     544

21.3.1   全局变量  544

21.3.2   统计量      544

21.3.3   SNMP变量     546

21.4   ARP结构     546

21.5   arpwhohas函数 548

21.6   arprequest函数 548

21.7   arpintr函数 551

21.8   in_arpinput函数      552

21.9   ARP定时器函数       557

21.9.1   arptimer函数 557

21.9.2   arptfree函数   557

21.10   arpresolve函数      558

21.11   arplookup函数      562

21.12   代理ARP   563

21.13   arp_rtrequest函数 564

21.14   ARP和多播      569

21.15   小结    570

第22章   协议控制块 572

22.1   引言      572

22.2   代码介绍     573

22.2.1   全局变量  574

22.2.2   统计量      574

22.3   inpcb的结构     574

22.4   in_pcballoc和in_pcbdetach函数      575

22.5   绑定、连接和分用   577

22.6   in_pcblookup函数   581

22.7   in_pcbbind函数       584

22.8   in_pcbconnect函数 589

22.9   in_pcbdisconnect函数   594

22.10   in_setsockaddr和in_setpeeraddr函数  595

22.11   in_pcbnotify、in_rtchange和in_losing函数      595

22.11.1   in_rtchange函数 598

22.11.2   重定向和原始插口     599

22.11.3   ICMP差错和UDP插口    600

22.11.4   in_losing函数     601

22.12   实现求精   602

22.13   小结    602

第23章   UDP:用户数据报协议  605

23.1   引言      605

23.2   代码介绍     605

23.2.1   全局变量  606

23.2.2   统计量      606

23.2.3   SNMP变量     607

23.3   UDP 的protosw结构     607

23.4   UDP的首部 608

23.5   udp_init函数     609

23.6   udp_output函数      609

23.6.1   在前面加上IP/UDP首部和mbuf簇     612

23.6.2   UDP检验和计算和伪首部 612

23.7   udp_input函数 616

23.7.1   对收到的UDP数据报的一般确认  616

23.7.2   分用单播数据报    619

23.7.3   分用多播和广播数据报      622

23.7.4   连接上的UDP插口和多接口主机  625

23.8   udp_saveopt函数    625

23.9   udp_ctlinput函数    627

23.10   udp_usrreq函数     628

23.11   udp_sysctl函数      633

23.12   实现求精   633

23.12.1   UDP PCB高速缓存    633

23.12.2   UDP检验和  634

23.13   小结    635

第24章   TCP:传输控制协议 636

24.1   引言      636

24.2   代码介绍     636

24.2.1   全局变量  636

24.2.2   统计量      637

24.2.3   SNMP变量     640

24.3   TCP 的protosw结构     641

24.4   TCP的首部 641

24.5   TCP的控制块    643

24.6   TCP的状态变迁图   645

24.7   TCP的序号 646

24.8   tcp_init函数      650

24.9   小结      652

第25章   TCP的定时器    654

25.1   引言      654

25.2   代码介绍     655

25.3   tcp_canceltimers函数    657

25.4   tcp_fasttimo函数     657

25.5   tcp_slowtimo函数   658

25.6   tcp_timers函数 659

25.6.1   FIN_WAIT_2和2MSL定时器    660

25.6.2   持续定时器     662

25.6.3   连接建立定时器和保活定时器 662

25.7   重传定时器的计算   665

25.8   tcp_newtcpcb算法   666

25.9   tcp_setpersist函数   668

25.10   tcp_xmit_timer函数      669

25.11   重传超时:tcp_timers函数 673

25.11.1   慢起动和避免拥塞     675

25.11.2   精确性    677

25.12   一个RTT的例子     677

25.13   小结    679

第26章   TCP输出     680

26.1   引言      680

26.2   tcp_output概述 680

26.3   决定是否应发送一个报文段 682

26.4   TCP选项     691

26.5   窗口大小选项     692

26.6   时间戳选项 692

26.6.1   哪个时间戳需要回显,RFC 1323算法  694

26.6.2   哪个时间戳需要回显,正确的算法       695

26.6.3   时间戳与延迟ACK       695

26.7   发送一个报文段       696

26.8   tcp_template函数    707

26.9   tcp_respond函数     708

26.10   小结    710

第27章   TCP的函数 712

27.1   引言      712

27.2   tcp_drain函数   712

27.3   tcp_drop函数    712

27.4   tcp_close函数   713

27.4.1   路由特性  713

27.4.2   资源释放  716

27.5   tcp_mss函数     717

27.6   tcp_ctlinput函数      722

27.7   tcp_notify函数  723

27.8   tcp_quench函数      724

27.9   TCP_REASS宏和tcp_reass函数  724

27.9.1   TCP_REASS宏 725

27.9.2   tcp_reass函数 727

27.10   tcp_trace函数  732

27.11   小结    736

第28章   TCP的输入 737

28.1   引言      737

28.2   预处理  739

28.3   tcp_dooptions函数 745

28.4   首部预测     747

28.5   TCP输入:缓慢的执行路径 752

28.6   完成被动打开或主动打开     752

28.6.1   完成被动打开 753

28.6.2   完成主动打开 756

28.7   PAWS:防止序号回绕   760

28.8   裁剪报文段使数据在窗口内 762

28.9   自连接和同时打开   768

28.10   记录时间戳      770

28.11   RST处理    770

28.12   小结    772

第29章   TCP的输入(续)  773

29.1   引言      773

29.2   ACK处理概述    773

29.3   完成被动打开和同时打开     774

29.4   快速重传和快速恢复的算法 775

29.5   ACK处理     778

29.6   更新窗口信息    784

29.7   紧急方式处理    786

29.8   tcp_pulloutofband函数 788

29.9   处理已接收的数据   789

29.10   FIN处理    791

29.11   最后的处理      793

29.12   实现求精   795

29.13   首部压缩   795

29.13.1   引言 796

29.13.2   首部字段的压缩  799

29.13.3   特殊情况       801

29.13.4   实例 802

29.13.5   配置 803

29.14   小结    803

第30章   TCP的用户需求 805

30.1   引言      805

30.2   tcp_usrreq函数 805

30.3   tcp_attach函数 814

30.4   tcp_disconnect函数 815

30.5   tcp_usrclosed函数   816

30.6   tcp_ctloutput函数   817

30.7   小结      820

第31章   BPF:BSD 分组过滤程序      821

31.1   引言      821

31.2   代码介绍     821

31.2.1   全局变量  821

31.2.2   统计量      822

31.3   bpf_if结构  822

31.4   bpf_d结构  825

31.4.1   bpfopen函数 826

31.4.2   bpfioctl函数   827

31.4.3   bpf_setif函数 830

31.4.4   bpf_attachd函数   831

31.5   BPF的输入 832

31.5.1   bpf_tap函数   832

31.5.2   catchpacket函数   833

31.5.3   bpfread函数   835

31.6   BPF的输出 837

31.7   小结      838

第32章   原始IP  839

32.1   引言      839

32.2   代码介绍     839

32.2.1   全局变量  839

32.2.2   统计量      840

32.3   原始 IP的protosw结构       840

32.4   rip_init函数 842

32.5   rip_input函数    842

32.6   rip_output函数 844

32.7   rip_usrreq函数  846

32.8   rip_ctloutput函数    850

32.9   小结      852

结束语 853

附录A   部分习题的解答   854

附录B   源代码的获取       872

附录C   RFC 1122 的有关内容      874

参考文献    895


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。