下载

5下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议.pdf

TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UN…

aaron
2010-10-03 0人阅读 举报 0 0 暂无简介

简介:本文档为《TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议pdf》,可适用于IT/计算机领域

下载第章TTCP概述概述本章首先介绍客户服务器事务概念。我们从使用UDP的客户服务器应用开始这是最简单的情形。接着我们编写使用TCP的客户和服务器程序并由此考察两台主机间交互的TCPIP分组。然后我们使用TTCP证明利用TTCP可以减少分组数并给出为利用TTCP需要对两端的源代码所做的最少改动。接下来介绍了运行书中示例程序的测试网络并对分别使用UDP、TCP和TTCP的客户服务器应用程序进行了简单的时间耗费比较。我们考察了一些使用TCP的典型Internet应用程序看看如果两端都支持TTCP将需要做哪些修改。紧接着简要介绍了Internet协议族中事务协议的发展历史概略叙述了现有的TTCP实现。本书全文以及有关TTCP的文献中事务一词的含义都是指客户向服务器发出一个请求然后服务器对该请求作出应答。Internet中最常见的一个例子是客户向域名服务器(DNS)发出请求查询域名对应的IP地址然后域名服务器给出响应。本书中的事务这个术语并没有数据库中的事务那样的含义:加锁、两步提交、回退等等。UDP上的客户服务器我们先来看一个简单的UDP客户服务器应用程序的例子其客户程序源代码如图所示。在这个例子中客户向服务器发出一个请求服务器处理该请求然后发回一个应答。图UDP上的简单客户程序第一部分TCP事务协议图(续)本书中所有源代码的格式都是这样。每一非空行前面都标有行号。正文中叙述某段源代码时这段源代码的起始和结束行号标记于正文段落的左边如下面的正文所示。有时这些段落前面会有一小段说明对所描述的源代码进行概要说明。源代码段开头和结尾处的水平线标明源代码段所在的文件名。这些文件名通常都是指我们在节中将介绍的版BSDLite中发布的文件。我们来讨论这个程序的一些有关特性但不详细描述插口函数因为我们假设读者对这些函数有一些基本的认识。关于插口函数的细节在参考书Stevens的第章中可以找到。图给出了头文件cliservh。创建UDP插口socket函数用于创建一个UDP插口并将一个非负的插口描述符返回给调用进程。出错处理函数errsys参见参考书Stevens的附录B。这个函数可以接受任意数目的参数但要用vsprintf函数对它们格式化然后这个函数会打印出系统调用所返回的errno值所对应的Unix出错信息然后终止进程。填写服务器地址首先用memset函数将Internet插口地址结构清零然后填入服务器的IP地址和端口号。为简明起见我们要求用户在程序运行中通过命令行输入一个点分十进制数形式的IP地址(argv)。服务器端口号(UDPSERVPORT)在头文件cliservh中用#define定义在本章的所有程序首部中都包含了该头文件。这样做是为了使程序简洁并避免使调用gethostbyname和getservbyname函数的源代码复杂化。构造并向服务器发送请求客户程序构造一个请求(只用一行注释来表示)并用sendto函数将其发出这样就有一个UDP数据报发往服务器。同样是为了简明起见我们假设请求(REQUEST)和应答(REPLY)的报文长度为固定值。实用的程序应当按照请求和应答的最大长度来分配缓存空间但实际的请求和应答报文长度是变化的而且一般都比较小。读取和处理服务器的应答调用recvfrom函数将使进程阻塞(即置为睡眠状态)直至收到一个数据报。接着客户进程处理应答(用一行注释来表示)然后进程终止。由于recvfrom函数中没有超时机制请求报文或应答报文中任何一个丢失都将造成该进程永久挂起。事实上UDP客户服务器应用的一个基本问题就是对现实世界中的此类错误缺少健壮性。在本节的末尾将对这个问题做更详细的讨论。计计第一部分TCP事务协议下载在头文件cliservh中我们将SA定义为structsockaddr*即指向一般的插口地址结构的指针。每当有一个插口函数需要一个指向插口地址结构的指针时该指针必须被置为指向一个一般性插口地址结构的指针。这是由于插口函数先于ANSIC标准出现在年代早期开发插口函数的时候void*(空类型)指针类型尚不可用。问题是“structsockaddr*”总共有个字符这经常使这一行源代码超出屏幕(或书本页面)的右边界因此我们将其缩写成为SA。这个缩写是从BSD内核源代码中借用过来的。图给出了在本章所有程序中都包含的头文件cliservh。图本章各程序中均包含的头文件cliservh图给出了相应的UDP服务器程序。图与图的UDP客户程序对应的UDP服务器程序第章TTCP概述计计下载图(续)创建UDP插口和绑定本机地址调用socket函数创建一个UDP插口并在其Internet插口地址结构中填入服务器的本机地址。这里本机地址设置为通配符(INADDRANY)这意味着服务器可以从任何一个本机接口接收数据报(假设服务器是多宿主的即可以有多个网络接口)。端口号设为服务器的知名端口(UDPSERVPORT)该常量也在前面讲过的头文件cliservh中定义。本机IP地址和知名端口用bind函数绑定到插口上。处理客户请求接下来服务器程序就进入一个无限循环:等待客户程序的请求到达(recvfrom)处理该请求(我们只用一行注释来表示处理动作)然后发出应答(sendto)。这只是最简单的UDP客户服务器应用。实际中常见的例子是域名服务系统(DNS)。DNS客户(称作解析器)通常是一般客户应用程序(例如Telnet客户、FTP客户或WWW浏览器)的一个部分。解析器向DNS服务器发出一个UDP数据报查询某一域名对应的IP地址。服务器发回的应答通常也是一个UDP数据报。如果观察客户向服务器发送请求时双方交换的分组我们就会得到图这样的时间系列页面上时间自上而下递增。服务器程序先启动其行为过程给在图的右半部客户程序稍后启动。我们分别来看客户和服务器程序中调用的函数及其相应内核执行的动作。在对socket函数的两次调用中上下紧挨着的两个箭头表示内核执行请求的动作并立即返回。在调用sendto函数时尽管内核也立即返回但实际上已经发出了一个UDP数据报。为简明起见我们假设客户程序的请求和服务器程序的应答所生成的IP数据报的长度都小于网络的最大传输单元(MTU)IP数据报不必分段。在这个图中有两次调用recvfrom函数使进程睡眠直到有数据报到达才被唤醒。我们把内核中相应的例程记为sleep和wakeup。最后我们还在图中标出了事务所耗费的时间。图的左侧标示的是客户端测得的事务时间:从客户发出请求到收到服务器的应答所经历的时间。组成这段事务时间的数值标在图的右侧:RTTSPT其中RTT是网络往返时间SPT是服务器处理客户请求的时间。UDP客户服务器事务的最短时间就是RTTSPT。计计第一部分TCP事务协议下载图UDP客户服务器事务的时序图尽管没有明确说明但我们已经假设从客户到服务器的路径需要RTT时间返回的路径又需RTT时间。但实际情况并非总是如此。据对大约条Internet路径的研究Paxsonb发现:的路径呈现明显的不对称性说明两个方向上的路由经过了不同的站点。我们的UDP客户服务器看起来非常简捷(每个程序只有大约行有关网络的源代码)但在实际环境中应用还不够健壮。由于UDP是不保证可靠的协议数据报可能会丢失、失序或重复因此实用的应用程序必须处理这些问题。这通常是在客户程序调用recvfrom时设置一个超时定时器用以检测数据报的丢失并重传请求。如果要使用超时定时器客户程序就要测量RTT并动态更新这是因为互连网上的RTT会在很大范围内变化并且变化很快。但如果是服务器的应答丢失而不是请求那么服务器就要再次处理同一个请求这可能会给某些服务带来问题。解决这个问题的办法之一是让服务器将每个客户最近一次请求的响应暂存起来必要时重传这个应答即可而不需要再次处理这个请求。最后典型的情况是客户向服务器发送的每个请求中都有一个不同的标识服务器把这个标识在响应中传回来使客户能把请求和响应匹配起来。在参考书Stevens的节中给出了UDP上的客户服务器处理这些问题的源代码细节但这将在程序中增加大约行源代码。一方面许多UDP应用程序都通过执行所有这些额外步骤(超时机制、RTT值测量、请求标识等等)来增加可靠性另一方面随着新的UDP应用程序不断出现这些步骤也在不断地推陈出新。参考书Patridgeb中指出“为了开发‘可靠的UDP应用程序’你要有状态信息(序列号、重传计数器和往返时间估计器)原则上你要用到当前TCP连接块中的全部信第章TTCP概述计计下载客户端函数内核网络内核服务器端函数返回进程请求返回息。因此构筑一个‘可靠的UDP’本质上和开发TCP一样难”。有些应用程序并不实现上面所述的所有步骤:例如在接收时使用超时机制但并不测量RTT值当然更不会动态地更新RTT值。这样当应用程序从一个环境(比如局域网)移植到另一个环境(比如广域网)中应用时就可能会引发一些问题。比较好的解决办法是用TCP而不是用UDP这样就可以利用TCP提供的所有可靠传输特性。但是这种办法会使客户端测得的事务时间由RTTSPT增加到×RTTSPT(见下一节)而且还会大大增加两个系统之间交换的分组数目。对付这些新的问题也有一个办法即用TTCP取代TCP我们将在节中对此进行讨论。TCP上的客户服务器下一个例子是TCP上的客户服务器事务应用。图给出了客户程序。图TCP事务的客户创建TCP插口和连接到服务器调用socket函数创建一个TCP插口然后在Internet插口地址结构中填入服务器的IP地址和端口号。对connect函数的调用启动TCP的三次握手过程在客户和服务器之间建立起连接。卷的第章给出了TCP连接建立和释放过程中交换分组的详细情况。发送请求和半关闭连接客户的请求是用write函数发给服务器的。之后客户调用shutdown函数(函数的第计计第一部分TCP事务协议下载个参数为)关闭连接的一半即数据流从客户向服务器的方向。这就告知服务器客户的数据已经发完了:从客户端向服务器传递了一个文件结束的通知。这时有一个设置了FIN标志的TCP报文段发给服务器。客户此时仍然能够从连接中读取数据只关闭了一个方向的数据流。这就叫做TCP的半关闭(halfclose)。卷的第节给出了有关细节。读取应答读取应答是由函数readstream完成的如图所示。由于TCP是一个面向字节流的协议没有任何形式的记录定界符因而从服务器端TCP传回的应答可能会包含在多个TCP报文段中。这也就可能会需要多次调用read函数才能传递给客户进程。而且我们知道当服务器发送完应答后就会关闭连接使得TCP向客户端发送一个带FIN的报文段在read函数中返回一个文件结束标志(返回值为)。为了处理这些细节问题在readstream函数中不断调用read函数直到接收缓存满或者read函数返回一个文件结束标志。readstream函数的返回值就是读取到的字节数。图readstream函数还有一些别的方法可以在类似TCP这样的流协议中用来给记录定界。许多Internet应用程序(FTP、SMTP、HTTP和NNTP)使用回车和换行符来标记记录的结束。其他一些应用程序(DNSRPC)则在每个记录的前面加上一个定长的记录长度字段。在我们的例子中利用了TCP的文件结束标志(FIN)因为在每次事务中客户只向服务器发送一个请求而服务器也只发回一个应答。FTP也在其数据连接中采用了这项技术用以告知对方文件已经结束。图给出的是TCP的服务器程序。图TCP事务的服务器程序第章TTCP概述计计下载图(续)创建监听用TCP插口用于创建一个TCP插口并将服务器的知名端口绑定到该插口上。与UDP服务器一样TCP服务器也将通配符作为其IP地址。调用listen函数将新创建的插口作为监听插口用于等待客户端发起的连接。listen函数的第二个参数规定了允许的最大挂起连接数内核要为该插口将这些连接进行排队处理。SOMAXCONN在头文件<syssocketh>中定义。其数值过去一直都取但现在有一些比较新的系统将其定为。对于一些很繁忙的服务器(例如:Web服务器)已经发现需要取更大的值比如或。在节中我们还将对此问题进行更多的讨论。接受连接和处理请求服务器进程调用accept函数后就进入阻塞状态直到有客户进程调用connect函数而建立起一个连接。函数accept返回一个新的插口描述符sockfd代表与客户和服务器之间所建立的连接。服务器调用函数readstream读取客户的请求(图)再调用write函数向客户发送应答。这是一个反复循环的服务器:把当前的客户请求处理完毕后才又调用accept去接受另一个客户的连接。并发服务器可以并行地处理多个客户请求(即:同时处理)。在Unix的主机上实现并发服务器的常用技术是:在accept函数返回后调用Unix的fork函数创建一个子进程由子进程处理客户的请求父进程则紧接着又调用accept去接受别的客户连接。实现并发服务器的另一项技术是为每个新建立的连接计计第一部分TCP事务协议下载创建一个线程(叫做轻量进程)。为了避免那些与网络无关的进程控制函数把我们的例子搞复杂我们只给出了反复循环的服务器。参考书Stevens的第章讨论比较了循环服务器和并发服务器。还有第三个选择是采用预分支服务器。即服务器启动时连续调用fork函数数次并让每个子进程都在同一个监听插口描述符上调用accept函数。这种办法节省了为每个客户的连接请求临时创建子进程的时间开销这对于繁忙的服务器来说是很大的节省。有些HTTP服务器就采用了这项技术。图给出了TCP上客户服务器事务的时间系列。我们首先注意到与图中UDP上的第章TTCP概述计计下载客户端函数内核网络内核函数服务器端返回(数据)返回返回(数据)进程请求图TCP上客户服务器事务的时序事务相比网络上交换的分组数增加了:TCP上事务的分组数是而UDP上的则是。采用TCP后客户端测量的事务时间是不少于×RTTSPT。通常中间三个从客户到服务器的报文段(对服务器SYN的ACK、请求以及客户的FIN)是紧密相连的后面两个从服务器到客户的报文段(服务器的应答和FIN)也是紧密相连的。这使实际事务时间比从图中看到的更接近×RTTSPT。本例中多出来的一个RTT源于TCP连接建立的时间开销:图中前两个报文段所花的时间。如果TCP可以把建连和发送客户数据以及客户FIN(图中客户端发出的前四个报文段)合起来再把服务器的应答和FIN合起来事务时间就又可以回到RTTSPT了这与UDP的一样。事实上这就是TTCP中采用的基本技巧。TCP的TIMEWAIT状态TCP要求首先发出FIN的一端(我们的例子中是客户)在通信双方都完全关闭连接之后仍然要保持在TIMEWAIT状态直至两倍的报文段最大生存时间(MSL)。MSL的建议值是秒也即处于TIMEWATE状态要达到分钟。当连接处于TIMEWAIT状态时同一连接(即客户IP地址和端口号以及服务器IP地址和端口号这个值相同)不能重复打开(我们在第章中还要更多地讨论TIMEWAIT状态)。许多基于伯克利代码的TCP实现在TIMEWAIT状态的保持时间仅仅为秒而不是RFCBraden中指定的秒。在本书的所有计算中我们还是假定正确的等待周期为秒。在我们的例子中客户端首先发出FIN这称为主动关闭因而TIMEWAIT状态出现在客户端。在这个状态延续期内TCP要为这个已经关闭的连接保留一定的状态信息以便能正确处理那些在网络中延迟一段时间、在连接关闭之后到达的报文段。同样如果最后一个ACK丢失了服务器将重传FIN使客户端重传最后的ACK。其他一些应用程序特别是WWW中的HTTP要求客户程序发送一个专门的命令来指示已经将请求发送完毕(而不是像我们的客户程序那样采用半关闭连接的办法)接着服务器就发回应答紧接着就是服务器的FIN。然后客户程序再发出FIN。这样做与前面所述的不同之处在于现在的TIMEWAIT状态出现在服务器端而不是客户端。对许多客户访问的繁忙服务器来说需要保留的状态信息会占用服务器的大量内存。因此当设计一个事务性客户服务器应用程序时让连接的哪一端关闭后进入TIMEWAIT状态值得仔细斟酌。我们还将看到TTCP可以让TIMEWAIT状态的延续时间从秒减少到大约秒。减少TCP中的报文段数像图所示的那样把数据和控制报文段合并起来可以减少图中所示的TCP报文段数。请注意这里的第一个报文段中包含有SYN、数据和FIN而不像图中那样仅仅是SYN。类似地服务器的应答和服务器的FIN也可以合并。虽然这样的分组序列也符合TCP的规定但是作者无法在应用程序中利用现有的插口API使TCP产生这样的报文段序列(因此才在图中客户端产生第一个报文段时和服务器端产生最后一个报文段时标上了问号)而且据作者所知也没有哪一个应用程序确实生成了这样的报文段序列。值得一提的是尽管我们把报文段的数目由减少到了但客户端观测的事务依然是×RTTSPT。这是因为TCP中规定服务器端的TCP在三次握手结束之前不能向服务器进程提交数据(卷的第节说明了TCP是如何在连接建立之前将到达的数据进行排队缓存的)。加计计第一部分TCP事务协议下载上这种限制的原因是服务器必须确信来自客户的SYN是“新的”即不是以前某次连接的SYN在网络中延迟一段时间后到达服务器端的。确认过程是这样的:服务器对客户发送的SYN发送确认再发出自己的SYN然后等待客户对该SYN的确认。当三次握手完成之后通信双方就都知道对方的SYN是新的。由于在三次握手结束之前服务器无法开始处理客户的请求故分组数的减少并没有缩短客户端测得的事务时间。下面这段话引自RFCJacobson,Braden,andZhang的附录:“注意:使连接能够尽快重复利用是早期TCP开发的重要目标。之所以有这样的要求是因为当第章TTCP概述计计下载返回(数据)图最少TCP事务的时序将数据加入队列返回(数据)函数内核服务器端网络函数客户端内核进程请求时人们希望TCP既是应用层事务协议的基础同时也是面向连接协议的基础。当时讨论中甚至把既包含有SYN和FIN比特同时又包含数据的报文段叫做‘圣诞树’报文段和‘Kamikaze(敢死队)’报文段。但这种热情很快被泼了冷水因为人们发现三次SYN握手和FIN握手意味着一次数据交换至少需要个分组。而且TIMEWAIT状态的延续说明同一个连接不可能马上再次打开。于是再没有人在这个领域做进一步的研究尽管现在的某些应用程序(比如简单邮件传送协议SMTP)经常会产生很短的会话。人们一般都可以采用为每个连接选用不同的端口对的办法来避开重用问题”。RFCBradenb中写到:“这些‘Kamikaze(敢死队)’报文段不是作为一种支持的服务来提供而主要用来搞垮其他实验性的TCP!”作为一个实验作者编写了一个测试程序这个程序把SYN与数据和FIN在一个报文段中发出去即图中的第一个报文段。该报文段发给个不同版本Unix的标准echo服务器(卷的第节)再用Tcpdump观察所交换的数据。其中的个(BSD、AIX、BSDOS、HPUX、IRIXSystemV、SunOS和SystemVRelease)都能正确处理该报文段另外一个(Solaris)则把随SYN一起传送的数据扔掉迫使客户程序重传数据。那个系统中的报文段序列与图所描绘的不尽相同。当三次握手结束后服务器立刻就对客户的数据和FIN发出确认。另外由于echo服务器无法把数据和FIN捆绑在一起(图中的第四个报文段)发送结果是发了两个报文段而不只是一个:应答和紧接其后的FIN。因此报文段的总数是而不是图中所示的。我们在节中会进一步讨论与非TTCP实现的兼容性问题并给出一些Tcpdump的输出结果。许多从伯克利演变而来的系统中服务器无法处理接收到的报文段中只有SYN、FIN而没有数据、ACK的情况。这个bug使得新创建的插口保持在CLOSEWAIT状态直到主机重新启动。但这却是一个合法的TTCP报文段:客户建立起了一个连接没有发送任何数据然后就关闭连接。TTCP上的客户服务器我们的TTCP客户服务器的源代码和上一节的TCP客户服务器的源代码略有不同以便能够利用TTCP的优势。图给出了TTCP上的客户程序。图TTCP上的事务客户程序计计第一部分TCP事务协议下载图(续)创建TCP插口对socket函数的调用与TCP上的客户程序一样在Internet插口地址结构中同样也填入服务器的IP地址和端口号。向服务器发送请求TTCP上的客户程序不调用connect函数。而是直接调用标准的sendto函数该函数向服务器发送请求同时与服务器建立起连接。此外我们还用sendto函数的第个参数指定了一个新的标志MSGEOF用以告诉系统内核数据已经发送完毕。这样做就相当于图中调用shutdown函数向服务器发送一个FIN。MSGEOF标志是TTCP实现中新加入的不要把它与MSGEOR标志混淆后者是基于记录的协议(比如OSI的运输层协议)中用来标志记录结束的。我们将在图中看到调用sendto函数的结果是客户端的SYN、客户的请求以及FIN都包含在一个报文段中发送出去。换言之调用一个sendto函数就实现了connect、write和shutdown三个函数的功能。读服务器的应答读服务器的应答还是用readstream函数与前文讨论过的TCP上的客户程序一样。图所示的是TTCP上的服务器程序。图TTCP上的事务服务器程序第章TTCP概述计计下载图(续)这个程序与图中TCP上的服务器程序几乎完全一样:对socket函数、bind函数、listen函数、accept函数和readstream函数的调用都一模一样。唯一的不同在于TTCP上的服务器发送应答时调用的是send函数而不是write函数。这样就可以设置MSGEOF标志从而可以将服务器的应答和服务器的FIN合并在一起发送。图所示的是TTCP上客户服务器事务的时序图。TTCP上的客户测量到的事务时间和UDP上的几乎一样(图):RTTSPT。我们估计TTCP上的时间会比UDP上的时间稍长一点这是因为TCP协议需要处理的事情比UDP要多一些而且通信双方都要执行两次read操作分别读数据和文件结束标志(而UDP环境下双方都只要调用一次recvfrom函数即可)。但是双方主机上这一段额外的处理时间比一次网络往返时间RTT要小得多(我们在节中给出了一些测试数据用来比较UDP、TCP和TTCP上的客户服务器事务的差别)。由此我们可以得出结论:TTCP上的事务时间要比TCP上的事务小大约一次网络往返时间RTT。TTCP中省下来的这个RTT来自于TAO即TCP加速打开(TCPAcceleratedOpen)。这种方式跳过了三次握手的过程。下面两章中我们将说明其实现方法在节中我们还将证明这样做的正确性。UDP上的事务需要两个分组来传送TTCP上的事务需要个分组而TCP上的事务则需要个分组(这些数字的前提是没有分组丢失)。因此TTCP不仅缩短了客户端的事务处理时间而且也减少了网络上传送的分组数。我们希望减少网络上的分组数因为路由器往往受限于它们可以转发的分组数而不是每个分组的长度。概括地讲TTCP以一个额外的分组和可以忽略的延续时间为代价同时具有了可靠性和适应性这两个对网络应用至关重要的特性。计计第一部分TCP事务协议下载图TTCP上客户服务器事务的时序测试网络图画出了用于验证本书所有例子的测试网络。书中大多数的示例程序都运行在laptop和bsdi这两个系统上它们都支持TTCP协议。图中所有的IP地址都属于B类子网。所有主机的名字都属于tucnoaoedu域。noao表示“国家光学空间观测站”tuc表示Tucson。图中每个方框上部的记号表示在该系统运行的操作系统。时间测量程序我们可以分别测量三种客户服务器事务的时间并比较其测量结果。我们要对客户程序作如下改动:•在图所示的UDP上客户程序中我们在即将调用sendto函数前和recvfrom函数刚第章TTCP概述计计下载客户端内核网络内核函数服务器端返回(数据)进程请求函数返回(数据)刚返回后分别读取当前系统时间。这两个时间的差值即为客户端测得的事务时间。•在图所示的TCP上客户程序中我们在即将调用connect函数前和readstream函数刚刚返回后分别读取当前系统时间。•在图所示的TTCP上客户程序中我们取当前的系统时间为即将调用sendto函数前和readstream函数刚刚返回后。图给出了以种不同长度的请求和应答分别测得的结果。客户和服务器分别为图中的bsdi和laptop。附录A中给出了这些测量的细节并分析了影响结果的因素。TTCP上的事务时间总是比同样条件下的UDP上的事务时间要长几个毫秒(由于这个时间差是软件造成的因此这个时间差会随着计算机速度的提高而缩短)。TTCP协议栈比UDP协议栈所做的操作要多(图A)而且TTCP上的客户和服务器要分别调用两次read函数而UDP上的客户和服务器则只需分别调用一次recvfrom函数。TCP上的事务时间总是比相同条件下TTCP上的事务要长大约ms。其中部分原因是由于TCP建立连接时的三次握手。两个SYN报文段的长度是字节(字节的IP首部、字节的标准TCP首部和字节的TCPMSS选项)。这相当于用户数据为字节的Ping从图A可知其网络往返时间RTT大约为ms。另外ms的差值可能是因为TCP协议需要处理额外个TCP报文段造成的。因此我们可以得出结论:TTCP上的事务时间接近、但比UDP上的事务时间略大比TCP上的事务时间短至少相当于一个字节报文段的网络往返时间。就客户段测量的事务时间而言用TTCP取代TCP带来的好处依赖于RTT和SPT之间的关计计第一部分TCP事务协议下载Cisco路由器以太网拨号支持TTCP的BSDS支持TTCP的BSDOS以太网图用于验证本书所有例子的测试网络所有IP地址都以打头系。比如在一个局域网上的RTT为ms(如图A)服务器的平均处理时间为ms那么TCP上的事务时间大约为ms(×RTTSPT)而TTCP的事务时间则大约为ms。但如果是一个网络往返时间RTT为ms的广域网(见第节)服务器处理时间SPT的平均值为ms那么TCP上和TTCP上的事务时间就分别为大约ms和ms。我们已经看到使用TTCP所需传送的网络分组数少(从图和图的比较中看分别是个和个)因此不管客户端所测得的事务时间减少了多少使用TTCP总是能减少网络分组数。减少了网络分组数就可以减少分组丢失的概率而在Internet中分组丢失对整个网络的稳定性有很大影响。图UDP、TTCP和TCP上客户服务器事务的时间系列在A节里我们介绍了传播时迟和带宽的差异。这两者对RTT都有影响但是当网络变快以后传播时迟的影响也就变大了。此外传播时延是我们几乎无法控制的因为它的大小取决于客户和服务器之间的信号传播距离和光在介质中的传播速度。于是在网络速率越来越快的条件下省下一个RTT的时间就显得尤为可贵使用TTCP的相对好处也就越发明显。现在可以公开获得并支持TTCP的用于测量网络性能的工具:http:wwwcuphpcomnetperfnetperfpagehtml应用TTCP给所有TCP上的应用程序带来的第一个好处就是可以缩短TIMEWAIT状态的持续时间。这样一般情况下协议必须处理的控制块也跟着少了。节详细介绍了TTCP协议的这个特性。现在我们可以这样说:对于连接时间很短(典型值为小于分钟)的所有TCP应用程第章TTCP概述计计下载测得的事务时间(ms)用户数据:请求和回答的长度(字节)序如果通信双方的主机都支持TTCP的话它们都将因使用该协议而获益。使用TTCP的最大好处或许在于避免了三次握手过程对于那些交换的数据量比较小的应用程序TTCP减少的时延将给它们带来好处。我们将给出几个例子来说明这一点(附录B谈到了利用TTCP来避免三次握手过程要对应用程序做怎样的修改)。WWW:超文本传输协议WWW及其所依赖的HTTP协议(将在第章介绍该协议)将可能大大地受益于TTCP协议。参考书Mogulb中指出:“然而构成Web应用传输时延的主要因素是网络通信⋯⋯即便我们无法提高光的传播速度但我们至少应该想办法减少一次交互过程中的往返传输次数。当前Web网中使用的超文本传输协议(HTTP)实际上造成了大量不必要的往返传输”。比如Mogulb中对随机抽取的个HTTP请求的统计发现应答长度的中值为字节(通常使用中值而不使用均值这是因为很少出现的大文件会使均值变大)。Mogul还引用了另一个例子。该例随机抽样了大约万个请求其应答的长度中值为字节。客户的请求一般很短:在~字节之间。典型的HTTP客户服务器事务和图所示的很相似。客户端主动打开向服务器发出很短的请求服务器收到请求后发出应答然后服务器关闭连接。这种情况非常适于使用TTCP协议把客户端的SYN和客户的请求合并在一起传送省去三次握手中的往返时间。这也还减少了网络上的分组数而这对于已经非常巨大的Web通信量来说也是很有意义的。FTP数据连接FTP数据连接也会从使用TTCP协议中获益。从一项对Internet通信量的统计调查中Paxsonb发现平均每个FTP数据连接所传输的数据量约为字节。卷的第页给出了FTP数据连接的一个例子。虽然例子中的数据流是单向的但其传输过程还是与图所示的十分相似。采用TTCP后图中的个报文段减少到了个。域名服务系统(DNS)DNS客户的查询请求是用UDP传送到DNS服务器的。服务器仍然用UDP发送给客户的应答。但如果应答超过字节那么只有前字节会在应答中返回给客户同时在应答中有“truncated(截断)”标志表示还有信息要传给客户。于是客户用TCP向服务器重新发送查询请求而后服务器用TCP向客户传送完整的应答。采用这项技术的原因是不能保证特定的主机能够重组长度超过字节的IP数据报(实际上许多UDP应用程序都把用户数据的长度限定在字节以内以保证不超过字节的限制)。由于TCP是一个字节流协议应答数据量再大也不会有问题。发送方TCP会根据连接建立时对等端声明的报文段最大长度(MSS)限制把应用程序的应答数据分割成适当长度的报文段发给对方。接收方TCP会把这些报文段拼接起来并以应用程序读取时指定的数据长度交给接收的应用程序。DNS的客户和服务器可以利用TTCP既达到UDP的请求应答速度又具有TCP的所有好处。远程过程调用(RPC)在所有论述将传输协议用于事务的论文中无不将RPC作为一个候选的应用协议。RPC中客户要向载有待执行程序的服务器发送请求请求中带有客户给定的参数服务器的应答中包括过程执行后所返回的结果。参考书Stevens的第节中讨论了SunRPC。计计第一部分TCP事务协议下载RPC的数据包往往会非常大必须给RPC协议增加可靠性使其能在像UDP这样不保证可靠性的协议上运行同时还要避免TCP的三次握手。使用TTCP协议就能实现这一目标既有TCP的可靠性又没有三次握手的开销。所有建立在RPC基础上的应用程序比如网络文件系统(NFS)等都可以采用TTCP协议。历史RFCMiller是较早讲述事务的RFC文档之一。该文档中规定了IRTP即:Internet可靠的事务协议能保证数据分组的可靠、按顺序提交。该文档中把事务定义为一个短小的、自包含的报文而IRTF定义了任意两台主机(即IP地址)之间持续存在的优选连接当其中任何一台主机重新启动后该连接都重新同步。IRTF协议位于IP协议之上并定义了专门的字节首部。RFCBraden本质上并未规定任何协议而只是给出了事务协议的一些设计准则。它认为UDP和TCP这两个主流的运输层协议所提供的业务相差太大而事务协议正好填补TCP和UDP之间的空档。该RFC文档把事务定义为一次简单的报文交换:一个请求发给服务器然后一个应答发回到客户。它还认为各种事务都有如下特征:不对称的模式(一端是服务器另一端是客户)、单工数据传递(任一时刻都只有一个方向有数据传输)、持续时间短(可能延续几十秒但绝不可能几小时)、时延小、数据分组少以及面向报文(不是字节流)。该RFC中列举了域名服务系统DNS的例子。它认为在考虑是用UDP还是用TCP作为域名服务系统的运输层协议时设计者往往陷入两难的境地。一个理想的解决方案应该既能提供可靠的数据传输又不需要专门地建立和释放连接不需要报文的分段和重组(从而应用程序不再需要知道像这类的神秘数字)同时还能使两端的空闲状态所处时间最短。TCP什么都好只可惜它需要建立和释放连接。另一个相关的协议是RDP即可靠数据协议。该协议在RFCVeltenindenandSax中定义后来又更新为RFCPatridgeandHinden。与RDP实现有关的经验在参考文献Patridge中可以找到。参考文献Patridgea中对RDP有如下评价:“当人们寻求一个可靠的数据报协议时他们通常是想要一个事务协议一个能够让他们与多个远端系统可靠地交换数据单元的协议一个类似于可靠UDP的协议。RDP应该看作是一个面向记录的TCP协议它利用连接可靠地传输有格式数据块流。RDP并不是一个事务协议。”(RDP不是一个事务协议的理由是因为它和TCP一样采用了三次握手技术)。RDP使用通常的插口应用编程接口(API)。与TCP类似RDP提供流插口接口(SOCKSTREAM)。另外RDP还提供SOCKRDM插口类型(可靠的报文提交)和SOCKSEQPACKET插口类型(有序的分组)。VMTP即通用报文事务协议是在RFCCheriton中规定的是一个专门用于事务的协议就像远程过程调用一样。像IRTP和RDP那样VMTP也是IP之上的运输层协议但VMTP还支持多播通信这个特性是TTCP以及本节提到过的其他协议所不具备的(参考文献Floydetal中有不同意见他们认为提供可靠的多播通信是应用层的任务而不是运输层的任务)。VMTP还为应用程序提供不一样的应用编程接口API其插口类型为SOCKTRANSACT。第章TTCP概述计计下载具体定义详见RFC。虽然TTCP的许多概念早在RFC中就已经出现但直到RFCBradenb发布才正式有了TTCP的第一个规范。该RFC文档定义了TTCP的概念接下来的RFCBraden给出了更多的细节并讨论了一些实现问题。图比较了实现各种运输层协议分别都需要多少行C源代码。协议源代码行数UDP(卷)RDPTCP(卷)TTCP模式的TCPVMTP图实现各种运输层协议所需要的源代码行数为支持TTCP所需增加的源代码行数(大约行)是UDP协议源代码行数的倍。为使BSD支持多播通信需要增加大约行源代码(设备驱动程序的改变和支持多播路由所需要的代码行数尚未计算在内)。VMTP可以从ftp:gregoriostanfordeduvmtpip得到。RDP通常还得不到。实现第一个TTCP实现是由BobBraden和LimingWei在南加州大学的信息科学学院(USCISI)完成的。该项工作得到了国家科学基金NSF的部分资助批准号为NCR。该实现是为SunOS(从伯克利演变而来的内核)做的年月就可以用匿名的FTP得到了。SunOS的源代码补丁可以从ftp:ftpisi

用户评价(4)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/

TCP-IP详解卷3:TCP事务协议,HTTP,NNTP和UNIX域协议

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利