计算机网络-6-9-应用进程通信socket
应用进程跨越网络的通信
系统调用和应用接口编程
大多数操作系统使用系统调用(System call)的机制在应用程序和操作系统之间传递控制权。又称之为应用编程接口API。如图6-27说明了多个应用进程使用系统调用的机制。
在讨论网络编程时常常把套接字作为应用进程和运输层协议的接口。如图6-28假定了运输层使用TCP协议(若使用UDP协议,情况也是类似的)。现在套接字已成为计算机操作系统内核的一部分。
当应用进程(客户或者服务器)需要使用网络通信的时候,必须首先发出socket系统调用,请求操作系统为其创造一个套接字,这个调用的实际过程是请求操作系统把网络通信所需要的一切资源(存储空间,CPU时间,网络带宽等等)分配给该应用进程。操作系统为这些资源的总和用一个叫做套接字描述(socket descriptor)的号码,然后把该号码返回给应用进程。
几种常用的系统调用
下面我们以TCP的服务为例介绍几种常用的系统调用。
-
连接建立阶段
当套接字被创建后,它的端口号和IP地址都是空的,因此应用进程需要绑定套接字的本地地址(本地端口号和IP地址),在服务器调用bind就是把把熟知的端口号和本地IP地址填入到自己已经创建的套接字中。在绑定之后,还必须要调用监听把套接字设置为被动方式,以便于随时都能够用接受客户的服务请求。服务器接着就调用接收,以便把远地的客户进程发送过来的连接请求提取出来,由于接收要完成的动作很多,这是因为一个服务器必须能够同时处理多个连接,这种服务器通常称为并发方式的工作服务器。然后指明对方的IP地址和端口号,就可以建立连接了。 -
数据传送阶段
客户端和服务端都在TCP连接上使用send系统调用传送数据,使用recv系统调用接收数据。在用户端与服务器端建立连接之前,服务器端一直处于监听模式下,后面的数据发送,接收等操作并不会执行,直到有客户端连接,才会执行数据的发送或者接收。这个等待操作就叫做阻塞。
- 连接释放
一旦客户端或者服务器端结束使用套接字,就把套接字撤销。这时候调用close释放连接和撤销套接字。如图6-31。
UDP用户只提供无连接服务,因此不能使用监听和接收系统调用。