3.7.2 套接字的基本概念

3.7.2 套接字的基本概念

在了解套接字的工作过程之前,首先需要了解套接字中的几个基本概念。

1.通信域

通信域是一种抽象概念,定义了一个计算机网络通信的范围,在这个范围中,所有的计算机都使用同一种网络体系结构,使用同一种协议栈。例如,在Internet通信域中,所有的计算机都使用TCP/IP协议族,它们处于同一个通信域。一些扩展的套接字支持多通信域,比如在Windows操作系统中,winsock2既支持TCP/IP协议族,也支持IPX/SPX协议族,但是相互通信的两个套接字一般都是同一个协议族的。例如,通信的双方一般不会出现一方使用TCP/IP协议,而另一方使用IPX/SPX协议的情况。如果通信要跨通信域,就一定要执行某种解释程序。在本章后续的内容中,除非特别指明,否则讨论都是基于Internet通信域展开的。

2.套接字的类型

根据通信的性质,套接字可以分为流式套接字、数据报套接字以及原始套接字3种。

(1)流式套接字

流式套接字(Stream Socket)提供双向的、有序的、无重复的、无记录边界的、可靠的数据流传输服务。流式套接字是面向连接的,即在进行数据交换之前,通信双方要先建立数据传输链路,这样就为后续数据的传输确定了可以确保有序到达的路径,同时为了确保数据的正确性,还会执行额外的计算来验证正确性,所以相对于稍后提到的数据报套接字,它的系统开销较大。在Internet通信域中,流式套接字使用TCP协议。

当应用程序需要交换大批量的数据时,或者要求数据按照发送的顺序无重复地到达目的地的时候,使用流式套接字是最方便的。在常见的网络应用程序中,那些对传输的可靠性、有序性等要求较高的程序,一般都使用流式套接字,如FTP服务器和FTP客户端程序、WWW服务器和浏览器客户端程序之间等。

(2)数据报套接字

数据报套接字(Datagram Socket)提供双向的、无连接的、不保证可靠的数据报传输服务。数据报套接字是面向无连接的,即在数据报套接字发送数据前,并不事先建立连接,因此发送数据时接收端不一定在侦听,也就不能保证一定能被接收方接收到,因而也不能保证多个数据报按照发送的顺序到达对方。在Internet通信域中,数据报套接字使用UDP协议。

虽然数据报套接字并不十分可靠,但由于它的传输效率非常高,系统开销小,并且支持向多个目标地址发送广播数据报的能力,因此仍然得到非常广泛的应用。在常见的网络应用程序中,那些对传输的可靠性要求不高的程序一般使用数据报套接字,如网络聊天程序。

(3)原始套接字

原始套接字(Raw Socket)允许访问较低层次的协议(如IP、ICMP等),即可以人为地构造IP包和ICMP包等。利用原始套接字,可以开发类似网络抓包(Sniffer)、ICMP Ping等网络应用程序。

以上介绍了3种类型的套接字,用户在编制程序时,可以根据需要的不同,选择不同类型的套接字。

3.同步/异步模式

同步/异步模式指通信进程间推进的顺序。异步模式是指数据发送方不等待数据接收方响应,便接着发送下个数据包的通信方式;同步模式是指数据发送方发出数据后,等待收到接收方发回的响应,才发送下一个数据包的通信方式。

4.阻塞/非阻塞模式

阻塞/非阻塞模式与同步/异步模式相对应。

阻塞模式简单来说就是通信的双方处于同步模式下。执行阻塞模式下的套接字函数调用时,直到调用成功才返回,否则将一直阻塞在此函数调用上。例如,调用receive函数读取网络缓冲区中的数据,如果没有数据到达,程序将一直停止在receive这个函数调用上,直到读取到一些数据,此函数调用才返回。

非阻塞模式简单来说就是通信的双方处于异步模式下,即执行非阻塞模式下的套接字的函数调用时,不管是否执行成功,都立即返回。例如,调用receive函数读取网络缓冲区中的数据,不管是否读取到数据都立即返回,而不会一直停止在此函数调用上。

5.客户机/服务器模式

网间进程的通信过程中,肯定是其中的一方首先发起请求,首先发起通信请求的一方一般是客户机端,而等待通信请求并做出响应的一方是服务器端。在这种模式下,服务器往往都需要接收一个或者多个的客户端连接请求,如WWW服务器、FTP服务器和Telnet服务器等。这里需要明确的是,服务器和客户机指的是软件而不是硬件,对它们的区分是看谁首先发起了请求。在实际的应用中,两台主机上的网络应用进程可以互为客户机和服务器,如P2P通信。