Socket(套接字)
一、什么是 Socket(套接字)?
了解网络编程的人都知道 Socket(套接字)是网络通信的基本构件。Socket(套接字)的概念与文件句柄类似,由一个短整数表示,实际上就是一个句柄。它包含了通信双方的IP、端口和当前的连接状态等信息。
但这只是表面的理解,更深入的去理解 Socket(套接字),其实它是一种通信机制。
Socket(套接字)是进程间通信的一种方法,与管道、信号量、共享内存和消息队列等都属于进程间的通信机制,但它们也有着明显的不同,其他几种方式都是依靠一台计算机系统的共享资源实现(这里的资源可以是文件系统空间、共享物理内存或消息队列,但只有运行在同一台机器上的进程才能使用它们)。
套接字接口(Socket Interface)最初是在UNIX中引入的一种通信工具,它是管道概念的一个扩展。Linux系统支持套接字接口,你可以通过与管道类似的方法来使用套接字,但套接字还包括了计算机网络中的通信。
一台机器上的进程可以使用套接字和另外一台机器上的进程通信,这样就可以支持分布在网络中的客户/服务器(C/S)系统。同样,同一台机器上的进程之间也可以使用套接字进行通信。也就是说客户/服务器(C/S)系统的开发工作,既可以在本地单机上进行,也可以跨网络进行。Linux提供的功能(如打印服务、数据库连接和提供Web页面)和网络工具(如远程登录软件rlogin和ftp)通常都是通过套接字来通信的。
当然,在Windows系统中也实现了套接字接口(Socket Interface),Windows系统的套接字服务是由系统文件Winsock.dll来提供的。因此,Windows程序可以通过网络和Unix/Linux计算机进行通信来实现客户/服务器(C/S)系统。虽然它们之间的编程接口不尽相同,但都是以套接字为基础的。
二、Socket(套接字)分类
Socket(套接字)存在于通信区域中,由协议、地址、端口来描述并惟一确定。
根据传输协议的不同,套接字可以分为三种类型:流式套接字、数据报套接字和原始套接字。
流式套接字:提供一个面向连接的、可靠的、数据无错的且按顺序接收的服务,这种套接字对应的是面向连接的传输协议,如TCP协议。
数据报套接字:提供一个无连接服务,不提供无错保证,数据可能丢失和重复,且接收顺序混乱,该套接字对应的是无连接传输协议,如UDP协议。
原始套接字:允许访问低层的协议,如IP、ICMP协议,该套接字常用于访问服务器中配置的新设备。
三、Socket 连接
想象一下,套接字连接就像电话打进一个繁忙的办公大楼,接线员接听电话并转到正确的部门(服务器进程),然后再从那里转到电话要找的人(服务器套接字)。每个进入的电话呼叫(客户)都被转到正确的终端节点,而中间介入的接线员则可以空出来处理后续的电话。
Socket编程的过程和上面的例子类似,但Unix/Linux和Window下的编程会有一些不同,但原理上都差不多,使用过程中加以区分即可。