协议软件接口
从操作系统层面来看,系统内核集成了对TCP/IP的具体实现,具有常用协议应用能力,协议实现在内核空间执行;
从应用程序层面来看,各类涉及网络通信的应用程序都通过系统中的协议实现完成数据交互过程,应用程序在用户空间执行。
那么对于两个不同层次上的实现,应用程序如何访问操作系统内核中协议实现的具体功能呢?
协议软件接口承担应用程序与操作系统协议实现之间的桥梁作用,它封装了协议实现的基本功能,开放系统调用接口以简化操作,使得应用程序可以用系统调用的方式方便地使用协议实现提供的数据传输功能。
依赖于底层操作系统的不同,目前常用的协议软件接口有:
● Berkeley Socket:加州大学伯克利分校为Berkeley UNIX操作系统定义的套接字接口;
● Transport Layer Interface:AT&T为其System V定义的传输层接口;
● Windows Sockets:Windows系统下的套接字接口。
协议软件接口的功能
TCP/IP被设计成能运行于多个厂商环境之下。为了与各种不同的机器保持兼容,TCP/IP的设计者们仔细地避免使用任何一个厂商的内部数据表示,另外TCP/IP标准还仔细地避免让接口使用那些只能在某一个厂商的操作系统中可用的特征。因此TCP/IP和使用它的应用之间的接口是不精确指明的。
接口必须支持如下概念性操作:
● 分配用于通信的本地资源。
● 指定本地和远程通信端点。
● (客户端)启动连接。
● (服务器端)等待连接到来。
● 发送或接收数据。
● 判断数据何时到达。
● 产生紧急数据。
● 处理到来的紧急数据。
● 从容终止连接。
● 处理来自远程端点的连接终止。
● 异常终止通信。
● 处理错误条件或连接异常终止。
● 连接结束后释放本地资源。
要特别注意协议软件接口的“接口”功能,即协议软件接口为网络应用程序和操作系统协议栈建立了调用的关联,协议软件接口的功能主要体现在关联的能力上,如创建用于关联的标识,为网络操作分配资源、拷贝数据、读取信息等,而真实的网络通信功能是由协议栈具体完成的,程序逻辑是由网络应用程序部署的。
以发送接口为例,数据的发送究竟是由发送接口完成还是由系统协议栈完成呢?实际上,发送接口函数仅仅完成了两个工作:第一,将数据从应用程序缓冲区拷贝到内核缓冲区;第二,向系统内核通知应用程序有新的数据要发送。真正负责发送数据的是协议栈。因此,发送接口函数成功返回并非意味着数据已经发送出去,此时数据有可能还保留在协议栈中等待发送,也有可能已经被发送到网络中,这依赖于协议的选择和当前的网络环境、系统环境等诸多因素。