引言
Socket翻译成中文就是“套接字”的意思,所谓的Socket编程就是指用计算机语言通过编程来实现计算机之间的通信问题。
Socket通信技术即就是两台联网或者多台联网的计算机之间的数据交换技术,这就涉及着通信端的协议等等问题。同时在不同的操作系统下(Windows与Liunx),Socket通信技术会有所不同,但是其实质的Socket通信思想是一致的。
网络编程实质就是计算机之间的数据进行交换,而计算机之间的数据传输需要两个条件:
就是需要物理连接,这一点由于所有的计算机都联机在Internet网络上,故而不需要考虑;用于数据传输的程序,这一点就是需要我们使用计算机语言进行编写程序来实现,同时操作系统也为我们提供了socket用于计算机之间的数据传输。
云主宰苍穹——Socket通信模型Socket简介
Socket的原意就是“插座”,在计算机通信领域里面,Socket又被称之为“套接字”,是计算机之间用于通信的一种约定协议或者一种方式方法,使用socket约定协议,计算机可以发送数据,同时也可以接受数据,相当于通信里面的全双工模式。
简单理解,Socket就是用于连接远程Internet上的计算机的一种工具,然后进行数据的传输。Socket最典型的应用就是Web服务器和浏览器:
浏览器获取用户输入的URL(全球资源定位符),向Web服务器发起请求;Web服务器接收到URL并进行分析,将对应的网页内容以及资源(包括文字、图片以及音频视频)返回给浏览器;浏览器接收到Web服务器返回的网页内容以及资源,将其进行解析和渲染,将最终的效果展示给用户。
云主宰苍穹——SocketAPIUnix/Liunx和Windows的Socket
接触过Unix/Liunx,大神们都会说,Liunx中一切皆是文件!在Unix/Liunx操作系统中,为了简化并统一对硬件资源的管理,将所有的软硬件资源都看成为文件,当然网络连接也是一个文件。
在Unix/Liunx中的网络连接也是一个文件,为了描述一个文件是否打开,Unix/Liunx中给每一个文件一个ID(ID是唯一的),也就是一个整数,也称之为文件描述符(FileDescriptor),例如对键盘,也就是标准输入硬件设备,其文件描述符就是0,对显示器,也就是标准输出硬件设备,其文件描述符就是1。故而对一个文件描述符操作就是对文件描述符对应关联的设备进行操作,这个设备可能是键盘、显示器、普通文件、管道或者终端。网络连接也是一个文件,也有其文件描述符。
简单阐述,在Unix/Liunx中,使用socket()函数创建一个网络连接,或者说创建一个网络文件,其函数返回值就是文件描述符,有了文件描述符,就可以对网络连接进行如同普通文件一个的读(read)和写(write)操作:1、获取远程计算机的数据就使用read()函数;2、向远程计算机写入数据就使用write()函数。故而我们只需要使用socket创建一个网络连接,接下来的就是文件操作了文件操作的正确流程,C语言文件操作的函数,是不是觉得Socket编程很简单啊,没错了,就是这么简单!
在Windows系统中,也有类似与Liunx的文件描述符,称之为“文件句柄”,对于Windows中的每一个程序,或者每一个操作对象,都有一个类似ID功能一样的,称之为“句柄”。在Windows中,是区分socket和文件的,故而对socket只能看成是一个网络连接了,会有针对socket设计的数据传输函数。
Socket类型
在计算机的世界里,有着许许多多的套接字(Socket),笔者以下主要阐述第三种最常用的socket——InternetSocket。
本地节点的路径名(Unix套接字),Unixdomainsockets(UDS)CCITTX.25(X.25套接字)DARPAInternet地址(Internet套接字),这是最具代表性、最经典的、最常用的Socket,我们经常讲的套接字也就是InternetScoket。根据数据传输方式,可以将InternetSocket分成几种,在使用socket()创建网络连接时,必须告诉它是哪一种数据传输方式,简单来说就是数据传输的控制协议。
第一种,基于TCP协议的面向连接的套接字!计算机领域称之为:流格式套接字(StreamSockets),在计算机代码中使用SOCK_STREAM表示。SOCK_STREAM是一种可靠的、双向的通信数据流。由于是基于TCP(TheTransmissionControlProtocol传输控制协议)协议的,故而数据在传输中是准确无误的,是自带重发机制的。SOCK_STREAM有以下特点:数据传输是按照顺序进行的;数据传输的可靠的,准确无误的;数据的发送和接收是不同步的,存在着缓冲区;流格式套接字的典型应用就是HTTP协议,因为浏览器在加载进行解析时必须要数据完整准确。
第二种,基于UDP协议的无连接的套接字!计算机领域称之为:数据报格式套接字(DatagramSockets),在计算机代码中使用SOCK_DGRAM表示。SOCK_DGRAM是一种高效率、高速度的、不可靠的通信数据流。其是基于UDP(UserDatagramProtocol用户数据报协议)协议的,不用进行数据校验,只进行数据传输。
SOCK_DGRAM有以下特点:
每次传输数据大小有限制;追求高效率,高速度;传输的数据可能丢失或者损坏(小概率事件);数据的发送和接收是同步的,也就是存在数据边界;数据报格式套接字的典型应用就是QQ视频和语音,因为这两者的需求是高效率和低延时,同时在小概率的丢失数据不会影响整个数据的传输质量。
第三种,基于IP协议的原始套接字!原始套接字(RawSockets),这是一种属于网络套接字(InternetSockets),允许直接发送和接收IP数据包,而不需要任何特定的传输层格式。
云主宰苍穹—百家号云主宰苍穹