1、每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。
客户端-服务器模型中的基本操作是事务(transaction)。一个客户端-服务器事务由以下四步组成:
1)当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。
2)服务器收到请求后,解释它,并以适当的方式操作它的资源。
3)服务器给客户端发送一个响应,并等待下一个请求。
4)客户端收到响应并处理它。
2、网络
客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
对主机而言,网络只是又一种I/O设备,是数据源和数据接收方。
一个插到I/O总线扩展槽的适配器提供了到网络的物理接口。从网络上接收到的数据从适配器经过I/O和内存总线复制到内存,通常是通过DMA传送。相似的,数据也能从内存复制到网络。
3、全球IP因特网
每台因特网主机都运行实现TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网络协议)的软件,几乎每个现代计算机系统都支持这个协议。
因特网的客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。通常将套接字函数实现为系统调用,这些系统调用会陷入内核,并调用各种内核模式的TCP/IP函数。
TCP/IP实际是一个协议族,其中每一个都提供不同的功能。
从程序员的角度,我们可以把因特网看作一个世界范围的主机集合,满足以下特性:
主机集合被映射为一组32位的IP地址。
这组IP地址被映射为一组称为因特网域名(Internet domian name)的标识符。
因特网主机上的进程能够通过连接(connection)和任何其他因特网主机上的进程通信。
一、IP地址
一个IP地址就是一个32位无符号整数。
因为因特网主机可以有不同的主机字节顺序,TCP/IP为任意整数数据项定义了统一的网络字节顺序(network byte oeder)(大端字节顺序)。
IP地址通常是以一种称为点分十进制表示法来表示的,这里,每个字节由它的十进制值标识,并且用句点和其他字节间分开。
二、因特网域名
因特网客户端和服务器互相通信时使用的是IP地址。因特网定义了一组更加人性化的域名(domain name),以及一种将域名映射到IP地址的机制。域名是一串用句点分隔的单词(字母、数字和破折号)。
域名集合形成了一个层次结构,每个域名编码了它在这个层次中的位置。
三、因特网连接
因特网客户端和服务器通过在连接上发送和接收字节流来通信。从连接一对进程的意义上而言,连接是点对点的。从数据可以同时双向流动的角度来说,它是全双工的。并且从由源进程发出的字节流最终被目的进程以它发出的顺序收到它的角度来说,它也是可靠的。
一个套接字是连接的一个端点。每个套接字都有相应的套接字地址,是由一个因特网地址和一个16位的整数端口组成的,用“地址:端口”来表示。
当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配的,称为临时端口(ephemeral port)。然而,服务器套接字地址中的端口通常是某个知名端口,是和这个服务相对应的。
一个连接是由它两端的套接字地址唯一确定的。这对套接字地址叫做套接字对(socket pair)。