16.1.2 套接字及其分类
在Windows Sockets规范中,使用套接字(socket)代表通信端点,在网络上通过Windows Sockets应用程序发送或接收数据包的对象。Socket具有类型和名称,并具有与其类型相关的运行过程。当前,socket通常使用IP(Internet Protocol)与其他socket进行双向数据交换,所有数据流都可以同时在两个方向上进行通信。Socket套接字分为两种类型,一种是数据报socket,一种是数据流socket。
1.数据报套接字
数据报套接字,即无连接套接字,是不需要连接即可进行通信的套接字,可以向指定的socket发送数据报消息,也可以从指定的socket接收消息。提供双向的面向记录的数据流,但是不能确保数据传输的顺序,也不能确保传输的可靠性,有时会出现传输失败。通过数据报套接字传输的数据,到达目的端时,有可能打乱了发送时的字节顺序,并有可能复制传输数据,但是会控制数据的记录边界,记录小于接收端的内部大小限制。开发人员需要管理数据的顺序和可靠性,在本地局域网中可靠性比在广域网或Internet上高。数据报套接字的一个典型应用是,保持系统时钟与网络同步,而且使用数据报套接字可以同时向大量的网络地址广播消息。对于面向记录的数据使用数据报套接字比较合适。
2.数据流套接字
数据流套接字是基于显式连接的套接字。提供没有记录边界的双向字节数据流,具有可靠的发送顺序,没有复制数据。数据流的接收也是可靠的,适合处理大量数据的传输。客户端Socket请求到服务器Sockets,服务器Sockets可以接收连接请求,也可以拒绝连接请求。如电话呼叫就是一个典型的数据流例子,首先呼叫方发起到被叫方的连接,被叫方可以接受连接,即接听,也可以拒绝连接,即挂断。如果接听,则链路建立了,可以进行双向数据交换,即双方可以进行通话,并且听端会按照顺序听到说话方所说的内容,不会有重复,也不会丢失。还有一个典型的数据流socket的例子是FTP(File Transfer Protocol,文件传输协议),可以用于传输任意大小的ASCII或二进制文件。当需要保证数据到达的可靠性和数据量比较大时,数据流套接字比数据报套接字更合适。
在一些网络层协议下,如XNS,数据流是面向记录的记录流,而不是字节流。在更通用的TCP/IP协议下,数据流是面向字节的字节流。Windows Sockets提供独立于底层协议的抽象层。