1问题的引入
UNIX 系统的 I/O 命令集,是从 Maltics 和早期系统中的命令演变出来的,其模
式为打开一读/写一关闭(open-write-read-close)。在一个用户进程进行 I/O
操作时,它首先调用“打开”获得对指定文件或设备的使用权,并返回称为文件
描述符的整型数,以描述用户在打开的文件或设备上进行 I/O 操作的进程。然
后这个用户进程多次调用“读/写”以传输数据。当所有的传输操作完成后,用户
进程关闭调用,通知操作系统已经完成了对某对象的使用。
TCP/IP 协议被集成到 UNIX 内核中时,相当于在 UNIX 系统引入了一种新型的
I/O 操作。UNIX 用户进程与网络协议的交互作用比用户进程与传统的 I/O 设备
相互作用复杂得多。首先,进行网络操作的两个进程钥纪 纪 同机器上,如
何建立它们之间的联系?其次,网络协议存在多种,如何建立一种通用机制以
支持多种协议?这些都是网络应用编程界面所要解决的问题。
在 UNIX 系统中,网络应用编程界面有两类:UNIXBSD 的套接字(socket)和
UNIXSystemV 的 TLI。由于 Sun 公司采用了支持 TCP/IP 的 UNIXBSD 操作
系统,使 TCP/IP 的应用有更大的发展,其网络应用编程界面──套接字
(socket)在网络软件中被广泛应用,至今已引进微机操作系统 DOS 和
Windows 系统中,成为开发网络应用软件的强有力工具,本章将要详细讨论这
个问题。
2套接字编程基本概念
钥纪 纪 始使用套接字编程之前,首先必须建立以下概念。
2.1网间进程通信
进程通信的概念最初来源于单机系统。由于每个进程都在自己的地址范围内运
行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为
进程通信提供了相应设施,如 UNIXBSD 中的管道(pipe)、命名管道
(namedpipe)和软中断信号(signal),UNIXsystemV 的消息
(message)、共享存储区(sharedmemory)和信号量(semaphore)等,但
都仅限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的
相互通信问题(可把同机进程通信看作是其中的特例)。为此,首先要解决的
是网间进程标识问题。同一主机上,不同进程可用进程号(processID)唯一
标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如,
主机 A 赋于某进程号 5,在 B 机中也可以存在 5 号进程,因此,“5 号进程”这句
话就没有意义了。
其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也
不同。因此,网间进程通信还要解决多重协议的识别问题。
为了解决上述问题,TCP/IP 协议引入了下列几个概念。