第12章 网络编程
关键词:客户端-服务器,局域网,TCP/IP,套接字接口,web服务器
网络应用随处可见,有趣的是,所有的网络应用都是基于相同的基本编程模型,有着相似的逻辑结构,并且依赖相同的编程接口。
12.1 客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型的。根据这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源(resource),并且通过操作这种资源来为它的客户端提供某种服务(service)。
客户端-服务器模型中的基本操作是事务(transaction)。一个客户端-服务器事务由四步组成:
1 当一个客户端需要服务时,它向服务器发送一个请求(request),发起一个事务。
2 服务器收到请求后,解释它,并以适当的方式操作它的资源。
3 服务器给客户端发送一个响应(response),并等待下一个请求。
4 客户端收到响应并处理它。
认识到客户端和服务器是进程么人不是在本上下文中常被称为的机器或者主机(host),这是很重要的。一台主机可以同时运行许多不同的客户端和服务器,而且客户端和服务器的事务是可以在同一台或是不同的主机上。无论客户端和服务器是怎样映射到主机上的,客户端-服务器模型是相同的。
12.2 网络
客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
对于一个主机而言,网络只是又一种I/O设备,作为数据源和数据接收方。一个插到I/O总线扩展槽的适配器提供了到网络的物理接口。从网络上接收到的数据从适配器经过I/O和存储器总线拷贝到存储器,典型地是通过DMA(直接存储器访问方式)传送。相似地,数据也能从存储器拷贝到网络。
物理上而言,网络是一个按照地理远近组成的层次系统。最低层是LAN(local area network,局域网),范围在一个建筑或者校园内。迄今为止,最流行的局域网技术是以太网(Ethernet),它是由施乐公司帕洛阿尔托研究中心(Xerox PARC)在20世纪70年代中期提出的。以太网技术被证明在3Mb/s-1Gb/s之间都是合适的。
一个以太网段(Ethernet segment)包括一些电缆(通常是双绞线)和一个叫做集线器(hub)的小盒子。以太网通常服务于一个小的区域,例如某建筑物的一个房间或者一个楼层。每根电缆都有相同的最大位带宽,典型的是
100Mb/s或者1Gb/s。一段连接到主机的适配器,而另一端则连接到集线器的一个端口(port)上。集线器不加分辨地将从一个端口上收到的每个位复制到其它所有的端口上。因此,每台主机都能看到每个位。
每个以太网适配器都有一个全球唯一的48位地址,它存储在这个适配器的永久性存储器上。一台主机可以发送一段位,称为帧,到这个网段内其它主机。每个帧包括一些固定数量的头(header)位,用来标识此帧的源和目的地址以及此帧的长度,此后紧的就是数据位的有效载荷(payload)。每个主机适配器都能看到这个帧,但是只有目的主机实际读取它。
使用一些电缆和叫做网桥(bridge)的小盒子,多个以太网可以连接成较大的局域网,成为桥接以太网(bridged Ethernet)。桥接以太网能够跨越整个建筑物或者校区。在一个桥接以太网里,一些电缆连接网桥与网桥,而另外一些连接网桥和集线器。这些电缆的宽带可以是不同的。
网桥比集线器更充分地利用了电缆宽带
。
在层次的更高级别中,多个不兼容的局域网可以通过路由器(router)的特殊计算机链接起来,组成一个Internet(互联网络)。
internet和Internet:我们一般用小写的
internet描述一般概念,而用大写字母的Internet来描述一种特殊的实际应用,也就是所谓的全球的IP因特网。
Internet(互联网络)至关重要的特性是,它能由采用完全不同和不兼容技术的各种局域网和广域网组成。每台主机和其它每台主机都是物理相接的,但是如何使得某台源主机(source host)跨过所有这些不兼容的网络发送数据位到另一台目的主机(destination host)成为可能呢?
解决办法是一层运行在每台主机和路由器上的协议软件(protocol software),它消除了不同网络间的差异。这个软件执行一种协议,控制主机和路由器如何协同工作来实现数据传输。这种协议的两种基本能力为:
命名方法和
传送机制。
命名方法:不同的局域网技术有不同和不兼容的方式来为主机分配地址。(internet)互联网络通过定义一种一致的主机地址格式,消除了这些差异。每台主机会被分配至少一个这种internet地址,这个地址唯一地标识了它。
传送机制:在电缆上编码位和将这些封装成帧方面,不同的网络互联技术有不同的和不兼容的方式。
(internet)互联网络通过定义一种把数据位捆扎成不连续的组块(chunk)——也就是包(packet)——的统一方式,从而消除了这些差异。一个包是由包头(header)和有效载荷(payload)组成的,其中包头包括包的大小以及源主机和目的主机的地址,有效载荷包括从源主机发出的数据位。
internet(
互联网络
)思想的精髓:封装使关键。
12.3 全球IP因特网
1 TCP/IP协议
全球IP因特网是internet(互联网络)最著名和最成功的实现。
每台因特网主机都运行实现了TCP/IP(Transmission Control Protocol/Internet Protocol,传输
控制协议/互联网络协议
)的软件,几乎每个现代计算机系统都支持这个协议。因特网的客户端和服务器混合使用套接字接口(sockets interface)函数和Unix I/O函数来进行通信。套接字函数典型地是作为系统调用来实现的,这些系统会陷入内核,并调用各种内核模式的
TCP/IP。
从程序员的角度,我们可以把因特网看做一个世界范围的主机集合,满足以下特性:
(1)主机集合被映射为一组32位的IP地址
(2)这组IP地址被映射为一组称为因特网域名(Internet domain name)的标识
(3)一个因特网主机上的进程能够通过一个连接(connection)和任何其他因特网主机上的进程通信。
在IP地址结构中存放的地址总是以(大端法)网络字节顺序存放的,即使主机字节顺序(host byte order)是小端法。需要进行转换。
ntoa:network to application
aton:application to network
2 因特网连接
因特网客户端和服务器是通过在连接(connect)上发送和接收字节流来通信。从连接意义上而言,连接时点对点的。从数据可以双向流动的角度来说,它是全双工(full-duplex)。并且从由源进程发出的字节流最终被目的进程以它发出的顺序收到的角度来说,它也是可靠的(reliable)。
套接字是连接的断电(end-point)。每个套接字都有相应的套接字地址(socket address),是由一个因特网地址和一个16位的整数端口组成的,用“地址:端口”来表示。Web通常使用端口80,而电子邮件服务使用端口25。
一个连接是由它两端的套接字地址唯一确定的。这对套接字地址叫做套接字对(socket pair)由下列二元组来表示:
(cliaddr:clipart,servaddr:servport)
其中cliaddr是客户端的IP地址,cliport是客户端的端口,servaddr是服务器的IP地址,而servport是服务器的端口。
12.4 套接字接口
1
套接字接口
套接字接口是一组用来结合Unix I/O函数创建网络应用的函数。大多数现代系统上都实现它,包括所有的Unix变种、Windows和macintosh系统。
套接字接口是加州伯克利分校的研究人员在20世纪80年代早气体粗的。因此,它也被叫做伯克利套接字。伯克利的研究者使得套接字接口适用于任何底层的协议。第一个实现的就是就是基于TCP/IP协议的。
2 相应的函数
socket函数:客户端和服务器使用socket函数来创建一个套接字描述符(socket descriptor)。
connect函数:客户端是通过调用connect函数来建立和服务器的连接的。
open_cliented函数:我们发现将socket和connect函数封装成一个叫做
open_cliented辅助函数是很方便的,客户端可以用它来和服务器建立连接。
bind函数:剩下的套接字函数,bind、listen和accept被服务器用来和客户端建立连接。
listen函数:客户端是发起连接的主动实体。服务器是等待来自客户端的连接请求的被动实体。默认情况下,内核会认为socket函数创建的描述符对应于主动套接字(active socket),它存在于一个连接的客户端。服务器调用listen函数告诉内核,描述符是被服务器而不是客户端使用的。listen函数将sockfd从一个主动套接字转化为一个监听套接字(listeningsocket),该套接字可以接受来自客户端的连接请求。backlog参数暗示了内核在开始拒绝连接请求之前,应该放入队列中等待的未完成连接请求的的而数量。
open_listenfd函数:我们发现,将socket、bind和listen函数结合成一个
open_listenfd的辅助函数是有帮助的,服务器可以用它来创建一个监听描述符。
accept:服务器通过调用accept函数来等待客户端的连接请求:accept函数等待来自客户端的连接请求listenfd,然后在addr中填写客户端的套接字地址,并返回一个已连接描述符(connected descriptor),这个描述符可被用来利用Unix I/O函数与客户端通信。
监听描述符和已连接描述符之间之间的区别使很多同学迷惑。监听描述符是作为客户端链接请求的一个端点。典型地,它被创建一次, 并存在于服务器的整个生命周期。已连接描述符是客户端和服务器之间已经建立起来了的一个端点。服务器每次接受连接请求时,都会创建一次,只存在于服务器为一个客户端服务的过程中。
echo客户端和服务器的实例。
12.5 Web服务器
1 Web基础
Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP(hypertext transfer protocol,超文本传输协议)。HTTP是一个简单的协议。一个
Web客户端(就是浏览器),打开一个到服务器的因特网连接,并且请求某些内容。服务器响应所请求的内容,然后关闭连接。浏览器读取内容,并把它显示在屏幕上。
Web服务和常规的文件检索服务(如FTP)有什么区别呢?主要的区别his
Web内容可以用一种叫做HTML(hypertext markup language,超文本标记语言)的语言来编写。一个HTML程序(页)包含指令(标记符),它们告诉浏览器如何显示这页中的各种文本和图形图像。
HTML的真正强大之处在于一个页面可以包含指针(超链接),这些指针可以指向存放在任何因特网主机上的内容。
2
Web内容
对于
Web客户端和服务器而言,内容是一个MIME(multipurpose internet mail extensions,多用途的网际邮件扩充协议)类型相关的字节序列。
Web服务器以两种不同的方式向客户端提供内容:
(1)取一个磁盘文件,并将它的内容返回给客户端。磁盘文件称为静态内容(static content),而返回文件给客户端的过程称为服务静态内容(serving
static content
)。
(2)运行一个可执行文件,并将它的输出返回给客户端。运行时可执行文件产生的输出称为动态内容(dynamic content),而运行程序并返回它的输出到客户端的过程称为服务动态内容(serving
dynamic content
)。
每条由web服务器返回的内容都是和它管理的某个文件相关联的。这些文件中的每一个都有一个唯一的名字,叫做URL(universal resource locator,通用资源定位符)。
3 HTTP事务
一个HTTP 请求的组成是这样的:一个请求行(request line),后面跟随零个或更多个请求报头(request header),再跟随一个空的文本行来终止报头列表。
一个HTTP 响应的组成是这样的:一个
响应
行(response line),后面跟随零个或更多个
响应
报头(
response
header),再跟随一个响应主题。
4 服务动态内容
CGI(common gateway interface,
通用网关接口
)
12.6小结
每个网络应用都是基于客户端-服务器模型的,根据这个模型,一个应用是由一个服务器和一个或多个客户端组成的。服务器管理资源,以某种方式操作自愿,为他的客户端提供服务。客户端-服务器模型中的基本操作是客户端-服务器事务,它是由客户端请求和跟随的服务器响应组成的。
客户端和服务器通过因特网这个全球网络来通信。从一个程序员的观点来看,我们可以把因特网看成是一个全球范围的主机集合,具有以下几个属性:每个因特网都有一个唯一的32位名字,称为它的IP地址;IP地址的集合映射为一个因特网域名的集合;不同因特网主机上的进程能够通过连接相互通信。
客户端和服务器通过使用套接字建立连接。套接字是连接的端点,对应用程序来说,连接是以文件描述符的形式出现的。套接字接口提供了打开和关闭套接字描述符的函数。客户端和服务器通过读写这些描述符来实现彼此间的通信。
web服务器使用HTTP协议和它们的客户端(例如浏览器)彼此同心。浏览器向服务器请求静态活动态的内容。对静态内容的请求时通过从服务器磁盘取得文件并把它返回给客户端来服务的。对动态内容的请求是通过在服务器上一个子进程的上下文中运行于各程序并将它的输出返回给客户端来服务的。CGI标准提供了一组规则,来管理客户端如何将它的输出发送回客户端。
参考文献
布赖恩特, O'Hallaron D, et al. 深入理解计算机系统[M]. 中国电力出版社, 2004.
Bryant R, David Richard O H, David Richard O H. Computer systems: a programmer's perspective[M]. Upper Saddle River: Prentice Hall, 2003.
Reek K A. Pointers on C[M]. Addison-Wesley Longman Publishing Co., Inc., 1997.
Koenig A. C traps and pitfalls[M]. Pearson Education India, 1988.