欢迎来到天天文库
浏览记录
ID:50469141
大小:9.67 MB
页数:250页
时间:2020-03-06
《TCP-IP详解 卷3:TCP事务协议、HTTP、NNTP和UNIX域协议.pdf》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、下载第一部分TCP事务协议第1章T/TCP概述1.1概述本章首先介绍客户-服务器事务概念。我们从使用UDP的客户-服务器应用开始,这是最简单的情形。接着我们编写使用TCP的客户和服务器程序,并由此考察两台主机间交互的TCP/IP分组。然后我们使用T/TCP,证明利用T/TCP可以减少分组数,并给出为利用T/TCP需要对两端的源代码所做的最少改动。接下来介绍了运行书中示例程序的测试网络,并对分别使用UDP、TCP和T/TCP的客户-服务器应用程序进行了简单的时间耗费比较。我们考察了一些使用TCP的典型Internet应用程序,看看如果两端都支持T/TCP,将需要做哪些修改。紧接着,简
2、要介绍了Internet协议族中事务协议的发展历史,概略叙述了现有的T/TCP实现。本书全文以及有关T/TCP的文献中,事务一词的含义都是指客户向服务器发出一个请求,然后服务器对该请求作出应答。Internet中最常见的一个例子是,客户向域名服务器(DNS)发出请求,查询域名对应的IP地址,然后域名服务器给出响应。本书中的事务这个术语并没有数据库中的事务那样的含义:加锁、两步提交、回退,等等。1.2UDP上的客户-服务器我们先来看一个简单的UDP客户-服务器应用程序的例子,其客户程序源代码如图1-1所示。在这个例子中,客户向服务器发出一个请求,服务器处理该请求,然后发回一个应答。图
3、1-1UDP上的简单客户程序2计计第一部分TCP事务协议下载图1-1(续)本书中所有源代码的格式都是这样。每一非空行前面都标有行号。正文中叙述某段源代码时,这段源代码的起始和结束行号标记于正文段落的左边,如下面的正文所示。有时这些段落前面会有一小段说明,对所描述的源代码进行概要说明。源代码段开头和结尾处的水平线标明源代码段所在的文件名。这些文件名通常都是指我们在1.9节中将介绍的4.4版BSD-Lite中发布的文件。我们来讨论这个程序的一些有关特性,但不详细描述插口函数,因为我们假设读者对这些函数有一些基本的认识。关于插口函数的细节在参考书[Stevens1990]的第6章中可以找
4、到。图1-2给出了头文件cliserv.h。1.创建UDP插口10-11socket函数用于创建一个UDP插口,并将一个非负的插口描述符返回给调用进程。出错处理函数err_sys参见参考书[Stevens1992]的附录B.2。这个函数可以接受任意数目的参数,但要用vsprintf函数对它们格式化,然后这个函数会打印出系统调用所返回的errno值所对应的Unix出错信息,然后终止进程。2.填写服务器地址12-15首先用memset函数将Internet插口地址结构清零,然后填入服务器的IP地址和端口号。为简明起见,我们要求用户在程序运行中通过命令行输入一个点分十进制数形式的IP地址
5、(argv[1])。服务器端口号(UDP_SERV_PORT)在头文件cliserv.h中用#define定义,在本章的所有程序首部中都包含了该头文件。这样做是为了使程序简洁,并避免使调用gethostbyname和getservbyname函数的源代码复杂化。3.构造并向服务器发送请求16-19客户程序构造一个请求(只用一行注释来表示),并用sendto函数将其发出,这样就有一个UDP数据报发往服务器。同样是为了简明起见,我们假设请求(REQUEST)和应答(REPLY)的报文长度为固定值。实用的程序应当按照请求和应答的最大长度来分配缓存空间,但实际的请求和应答报文长度是变化的,
6、而且一般都比较小。4.读取和处理服务器的应答20-23调用recvfrom函数将使进程阻塞(即置为睡眠状态),直至收到一个数据报。接着客户进程处理应答(用一行注释来表示),然后进程终止。由于recvfrom函数中没有超时机制,请求报文或应答报文中任何一个丢失都将造成该进程永久挂起。事实上,UDP客户-服务器应用的一个基本问题就是对现实世界中的此类错误缺少健壮性。在本节的末尾将对这个问题做更详细的讨论。第1章T/TCP概述计计3下载在头文件cliserv.h中,我们将SA定义为structsockaddr*,即指向一般的插口地址结构的指针。每当有一个插口函数需要一个指向插口地址结构的
7、指针时,该指针必须被置为指向一个一般性插口地址结构的指针。这是由于插口函数先于ANSIC标准出现,在80年代早期开发插口函数的时候,void*(空类型)指针类型尚不可用。问题是,“structsockaddr*”总共有17个字符,这经常使这一行源代码超出屏幕(或书本页面)的右边界,因此我们将其缩写成为SA。这个缩写是从BSD内核源代码中借用过来的。图1-2给出了在本章所有程序中都包含的头文件cliserv.h。图1-2本章各程序中均包含的头文件cliserv.h图1-
此文档下载收益归作者所有