细说socket
https://www.zybuluo.com/phper/note/47110
老实讲,到目前为止,我对socket一无所知,真的。我就现学现卖用过nodejs平台的socket.io搭建过一套高可用实时性的网页聊天系统,其他,就真的只是听过它。
今天就来仔仔细细的学一下,socket是什么?它能干什么?
什么是socket
socket,我们先仅仅看这个英文单词的中文翻译,它翻译成:"孔"或者"插座"
,擦,能不能稍微取个高雅点的名字!怎么会是这个东西呢?这个留在后面,卖个关子,你会发现真的它就是个插座
。
既然socket就是插座,一般插座是长这样的:
我们从图片中可以看到,它上面插了各种各样电器的插头,所有的电器都靠这个插座来供电和通讯。
所以插座就成了一个统一的接口,统一给所有的电器通电,所有的电器不需要了解电的原理,电的传输,电的各种。只要把电器的插头插上去就可以通电工作使用了。
不知道插座这样子解释好不好懂,反正我懂了,你不懂拉鸡巴倒!
回到网络上的socket,同样,和真实的插座一样,它也是提供了一个统一的通讯接口,将底层的TCP/IP给封装起来。需要通讯的进程,不需要了解TCP/IP是怎么传输的,你只要用socket提供的插口,你就能通上电,就能将消息发出去!
socket,第一,它简化了开发者的工作量,因为协议众多,进程众多,全部自己去搞通讯底层是很效率低的。第二,统一了接口,使得不同原理的进程可以通过一个统一的socket进行通讯,比如德国人和中国人统一用英语就能友好沟通了。
socket 定义
上面罗嗦了这么多,或许对socket用了一定的了解,那就用官方的定义来说说什么是socket:
Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
恩。你先看插座的例子,再来看这句蛋疼的官方解释,我擦,居然能看懂了。
什么是TCP/IP
上面讲到socket其实不是什么协议,只是一个数据封装,它封装了TCP/IP的各种协议,然后提供接口的方式给用户进程使用。那么什么是TCP/IP呢?
我擦,这他妈越扯越远啊。麻痹说TCP/IP就要说网络7层协议。收不回了啊!
不管了这么多了。7层网络不懂得请自动去复习。先来看看TCP/IP的关系,以及他们在7层模型中的位置:
结合上面的这张图,再装逼看一下官方定义:
TCP/IP(Transmission Control Protocol/Internet Protocol)即传输控制协议/网间协议,是一个工业标准的协议集,它是为广域网(WANs)设计的。是一种网络通信协议,它规范了网络上的所有通信设备,尤其是一个主机与另一个主机之间的数据往来格式以及传送方式
你会理解:它横跨传输层和网络层,是专门用来传递和发送消息的的协议簇集合。所有的进程都是通过他们来完成消息的发送和接口。
所以,我们下定义:所有的消息发送,消息获取,数据接收,数据获取,那么都需要用到TCP/IP。
好。TCP/IP你知道了干嘛的了,由于它比较复杂,且各用户通讯起来比较麻烦,所以专家发明了socket, socket封装了蛋疼的TCP/IP各种晦涩难懂的各种协议,所以socket就应该在用户和TCP/IP之间:
通过上面的图就一目了然了。对不对!反正,我是了然了。
哎。马丹不容易了。终于将socket给圆清楚了。
socket 如何使用
我们平时都会打电话的吧。打电话就是一个非常好的理解和掌握socket的场景,我们想一想打电话是不是这样:我想给周杰伦打电话,好久不见了。于是我先拨号,杰伦听到电话铃声后提起电话,这时我和杰伦就建立起了连接,就可以讲话了。等瞎比比结束,挂断电话结束此次通话。
用socket的图样式给画一下,就是这样:
通过上面的一个例子,我们大致知道了socket大致的使用过程,它分为服务器端和客户端。先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端与服务器端的连接就建立了。客户端发送数据请求,服务器端接收请求并处理请求,然后把回应数据发送给客户端,客户端读取数据,最后关闭连接,一次交互结束。
这就是socket的使用过程!其实想想真的是和电话通讯一模一样。因为socket是对TCP/IP的封装,所以也会有三次握手的影子在。
socket 封装了哪些接口
上面我们大致知道了socket是怎么使用了,各种初始化啊,监听啊什么的。每个语言平台都有不一样的函数,但是都是基于socket封装的接口的基础上进行修改的。所以也是用到了socket提供的接口。
我们大致来看下PHP语言平台下的socket相关的接口函数有哪些
socket_accept() 接受一个Socket连接
socket_bind() 把socket绑定在一个IP地址和端口上
socket_clear_error() 清除socket的错误或者最后的错误代码
socket_close() 关闭一个socket资源
socket_connect() 开始一个socket连接