Socket API最早作为Berkeley UNIX操作系统的程序库,出现于20世纪80年代早期,用于提供IPC功能。现在所有主流操作系统都支持Socket API。在BSD、Linux等基于UNIX的系统中,Socket API是操作系统的一部分。在个人计算机操作系统MS-DOS、Windows NT、macOS、OS\2中,Socket API都是以程序库形式提供的(在Windows系统中,Socket API被称为Winsocket)。Java语言在设计之初就考虑到了网络编程,也将Socket API作为语言核心类的一部分提供给用户。所有这些API都使用相同的消息传递模型和类似的语法。
Socket API是实现进程间通信的第一种编程设施。Socket API非常重要,原因主要有以下两点。
● Socket API已经成为IPC编程事实上的标准,高层IPC设施都是构建于Socket API基础上的,即它们基于Socket API实现。
● 对于响应时间要求较高或在有限资源平台上运行的应用来说,用Socket API实现是最合适的。
如图2-4所示,Socket API的设计者提供了一种称为Socket的编程类型。希望与另一进程通信的进程必须创建该类型的一个实例(实例化一个Socket对象),两个进程都可以使用Socket API提供的操作发送和接收数据。
图2-4 Socket编程类型
在Internet网络协议的体系结构中,传输层上主要有两种协议:UDP(User Datagram Protocol,用户数据包协议)和TCP(Transmission Control Protocol,传输控制协议)。UDP允许使用无连接通信传输报文(即在传输层发送和接收),被传输报文称为数据包(datagram)。根据无连接通信协议,每个传输的数据包都被分别解析和路由,并且可按任何顺序到达接收者。例如,如果主机 A 上的进程1通过顺序传输数据包 m 1 、 m 2 ,向主机 B 上的进程2发送消息,这些数据包可以通过不同路由在网络上传输,并且可按下列任何一种顺序到达接收进程: m 1 → m 2 或 m 2 → m 1 。在数据通信网络术语中,“包”(packet,或称分组)是指在网络上传输的数据单位。每个包中都包含有效数据(payload,载荷)以及一些控制信息(头部信息),如目的地址。
TCP是面向连接的协议,它通过在接收者和发送者之间建立的逻辑连接来传输数据流。由于有连接,从发送者到接收者的数据能保证以与发送次序相同的顺序被接收。例如,如果主机 A 上的进程1顺序传输 m 1 、 m 2 ,向主机 B 上的进程2发送消息,接收进程可以认为消息将以 m 1 → m 2 顺序到达,而不是 m 2 → m 1 。
根据传输层所使用协议的不同,Socket API分为两种类型:一种是使用UDP传输的Socket,称为数据包Socket(datagram Socket);另一种是使用TCP传输的Socket,称为流式Socket(stream Socket)。由于分布式计算与网络应用主要使用流式Socket,后面将重点讨论流式Socket的开发技术。