套接字出现
套接字描述符和文件描述符
需要执行IO的应用程序要调用open()函数,才能创建用于访问文件的文件描述符。如下图所示,操作系统将这些文件描述符实现为一个指针数据,这些指针指向内部的数据结构。系统为每个进程维护一个单独的文件描述符表。当一个进程打开某个文件之后,系统就将一个指针(指向此文件的内部数据结构)写入进程的文件描述符表,并将这个表的下标返回给调用者。操作系统将此描述符作为该进程的文件描述符表的下标来使用,并沿着指针可以找到那个保存所有信息的数据结构。
套接字接口为网络通信增加了一个新的抽象,即套接字,就像文件一样,每个活动的套接字由一个小整数标识,称为套接字描述符。操作系统在与文件描述符相同的描述符表中分配套接字描述符。因此,一个应用程序不能拥有具有相同值的文件描述符和套接字描述符
操作系统还有一个单独的系统函数socket,应用程序调用它来创建套接字。应用程序只使用open来创建文件描述符。套接字中所蕴含的一般性的概念是:单个系统调用对创建任何套接字都是足够的。套接字一般被创建之后,应用程序必须用其他系统调用来指明准确使用该套接字的细节。
针对套接字的系统数据结构
当应用程序调用socket之后,操作系统就分配一个新数据结构以保存通信所需的信息,并在文件描述符表中填入了一个新条目,该条目指向这个数据结构的指针。
下图说明了调用socket之后,上图中的描述符表会发生什么变化:
可以看出:在系统创建了套接字之后,大多数字段中的值并没有填上。在套接字能够使用之前,创建该套接字的应用程序必须用其他系统调用把套接字数据结构中的这些信息填上
主动套接字和被动套接字
套接字一旦创建,应用程序就必须指定如何使用它。套接字本身是完全通用的,可以用来进行任意方式的通信。比如,服务器可以将套接字配置为等待连接(被动套接字),客户端可以将其配置为发起连接(主动套接字)
指定端点地址
在创建套机字时,并没有包含如何使用这个套接字的信息。具体说就是,套接字并没有包含本地或者远程机器的协议端口号或者IP信息等信息。在应用程序使用一个套接字之前,必须指明这些地址中的一个或者两个段指明。
为允许协议族自有的选用其地址表示方式,套接字抽象为每种类型的地址定义了一个地址族,一个协议族可以使用一种或者多种地址族来定义其地址表示方式